티스토리 뷰
Rocky Linux 8 SSH CBC 취약점, 설정 파일엔 없는데 Nessus는 왜 탐지할까? (crypto-policies·opt-out 정리)
실더 2026. 10. 7. 18:00
1. Rocky Linux 8 같은 RHEL 8 계열은 sshd가 시스템 암호 정책(crypto-policies)을 실행 인자로 받아 동작합니다.
2. 그래서 정책 파일에 CBC가 없어도, 정책 적용을 해제(opt-out)했거나 sshd를 재시작하지 않으면 실제 서버는 CBC를 제안할 수 있습니다.
3. 판정 근거는 설정 파일이 아니라 외부에서 확인한 실제 협상 결과여야 합니다.
Nessus 같은 취약점 스캐너로 리눅스 서버를 점검하면 SSH Server CBC Mode Ciphers Enabled가 자주 탐지됩니다. 그리고 조치를 요청하면 이런 답변을 받는 경우가 많습니다.
opensshserver.config)을 확인했는데 CBC가 없습니다. 오탐 아닌가요?"정책 파일에 정말 CBC가 없는데도, 외부에서 nmap으로 확인해 보면 CBC 암호가 그대로 협상되는 경우가 있습니다. 이 글은 Rocky Linux 8(RHEL 8 계열)에서 이런 일이 왜 생기는지, 무엇을 근거로 판정하고 어떻게 조치해야 하는지 정리한 것입니다. 실무에서 실수가 잦은 부분이라 샌드박스 재현 결과도 함께 담았습니다.
1. RHEL 8 계열의 SSH 암호 설정 구조

RHEL 8 계열은 TLS, IPsec, SSH, DNSSec, Kerberos의 암호 설정을 시스템 전체 암호 정책 하나로 관리합니다. 정책을 바꾸면 /etc/crypto-policies/back-ends/ 아래에 프로그램별 설정 파일이 만들어지고, sshd는 그중 opensshserver.config의 값을 실행 인자로 받아 동작합니다.
| 단계 | 파일·위치 | 역할 |
|---|---|---|
| ① 정책 선택 | update-crypto-policies |
DEFAULT, FUTURE, 사용자 모듈 등 시스템 정책 지정 |
| ② 정책 파일 생성 | /etc/crypto-policies/back-ends/opensshserver.config |
sshd에 넘길 Ciphers, MACs, KEX 등이 담김 |
| ③ 서비스 환경 | /etc/sysconfig/sshd |
정책 파일을 읽어 CRYPTO_POLICY 변수로 넘김 (opt-out 설정도 여기) |
| ④ 실행 | systemd → sshd -D $OPTIONS $CRYPTO_POLICY |
정책 값이 -oCiphers=... 형태의 실행 인자로 들어가 sshd_config보다 우선 |
RHEL 8 기본 정책은 CBC를 허용합니다
Red Hat 문서상 RHEL 8의 DEFAULT 정책은 CBC 모드 암호를 허용합니다. Red Hat 블로그는 Fedora 33이 SSH CBC를 기본 비활성화한 것과 달리, 그보다 1년 먼저 나온 RHEL 8은 완화 조치와 호환성을 이유로 기본 활성화를 유지했다고 설명합니다. 그래서 별도 조치를 하지 않은 RHEL 8 계열 서버는 스캔에서 이 항목이 탐지되는 것이 정상입니다.
2. 설정 파일과 실행 중인 sshd가 다를 수 있다

RHEL 8 방식(정책 값을 실행 인자로 넘기는 구조)을 샌드박스에서 재현해, 설정 파일 · sshd -T · 실제 협상 세 가지 확인 방법이 서로 어긋나는 경우를 비교했습니다.
| 시나리오 | 설정 파일 | sshd -T | 실제 협상 | 판정 |
|---|---|---|---|---|
| A. 정상 조치 | CBC 없음 | CBC 없음 | CBC 없음 | 양호 |
| B. 파일만 수정, 재시작 안 함 | CBC 없음 | CBC 없음 | CBC 있음 | 취약 |
| C. 파일엔 CBC, 정책(-o)이 덮어씀 | CBC 있음 | CBC 있음 | CBC 없음 | 양호 |
| D. 파일엔 CBC, 정책 opt-out | CBC 있음 | CBC 있음 | CBC 있음 | 취약 |
※ 테스트 환경: Ubuntu 24.04, OpenSSH 9.6. Rocky Linux 8 자체가 아니라 RHEL 8의 동작 방식(정책을 실행 인자로 전달)을 재현한 것입니다.
| 확인 방법 | 한계 |
|---|---|
| 설정 파일 확인 | 실행 중인 프로세스가 그 값을 쓰는지 알 수 없음 (B, D) |
sshd -T |
설정 파일만 읽음. RHEL 8은 정책이 실행 인자로 들어가므로 결과가 실제와 다를 수 있음 (C) |
| 실제 협상 확인 | 네트워크에서 서버가 실제로 제안하는 값을 봄. Nessus와 같은 관점이라 판정 근거로 적합 |
3. 실제로 취약해지는 원인
| 원인 | 무슨 일이 일어났나 | 확인 명령 |
|---|---|---|
| ① 정책 opt-out | /etc/sysconfig/sshd에서 CRYPTO_POLICY 줄이 주석 해제되어 정책 대신 sshd_config의 Ciphers(CBC 포함)가 적용 |
grep CRYPTO_POLICY /etc/sysconfig/sshd |
| ② 재시작 누락 | 정책을 바꾼 뒤 sshd를 재시작하지 않아 예전 정책으로 계속 실행 | systemctl status sshd의 기동 시각과 정책 파일 수정 시각 비교 |
| ③ 다른 SSH 서버 | 탐지 대상이 OS의 sshd가 아니라 서버 관리용 BMC 장비 등 자체 SSH | 탐지 IP·포트와 ss -lntp | grep sshd 결과 비교 |
특히 SSH 포트를 기본값에서 바꾼 서버라면 누군가 sshd_config를 직접 손댄 것이라 ①을 먼저 의심해 볼 만합니다. 실행 중인 sshd에 정책이 들어갔는지는 ps -ef | grep [s]shd로 실행 인자에 -oCiphers=가 붙어 있는지 보면 바로 알 수 있습니다.
systemctl restart sshd 한 줄로 끝납니다. 그래서 정책 파일이 깨끗하다는 답변을 받으면 sshd 기동 시각부터 확인해 보는 것이 가장 빠릅니다.4. 판정은 실제 협상 결과로

스캐너가 아닌 다른 서버에서 Nessus 탐지 IP·포트를 대상으로 확인합니다.
# 서버가 제안하는 암호 목록 확인 (포트를 바꿨다면 -sV 필수)
nmap -sV -p 22 --script ssh2-enum-algos <탐지IP>
# CBC로 강제 접속 시도 (거부되면 양호)
ssh -c aes128-cbc -p 22 <계정>@<탐지IP>
| 결과 | 판정 |
|---|---|
encryption_algorithms에 -cbc 항목 없음 / no matching cipher found |
양호 (재스캔으로 확정) |
| -cbc 항목 노출 / CBC로 접속 진행 | 정탐 → 3장의 원인 확인 후 조치 |
-sV 없이 스크립트를 돌리면, nmap이 해당 포트를 SSH로 인식하지 못해 스크립트가 아예 실행되지 않습니다. 결과가 비어 있다고 "CBC 없음"으로 판단하면 안 됩니다.5. 조치 방법
원인 ①: opt-out 상태인 경우
| 방법 | 수정 내용 | 비고 |
|---|---|---|
| A. 정책 복구 (권장) | /etc/sysconfig/sshd의 CRYPTO_POLICY 줄을 주석 처리 |
시스템 정책(이미 CBC 제거된 상태라면)이 그대로 적용. 포트 등 다른 sshd_config 설정은 유지 |
| B. opt-out 유지 | sshd_config와 sshd_config.d/*.conf의 Ciphers에서 -cbc 항목 삭제 |
MACs, KexAlgorithms도 정책이 아닌 sshd_config 값이 적용되니 함께 점검 |
정책 자체에서 CBC를 빼는 정석: 하위 정책 모듈
정책 파일을 직접 고치면 update-crypto-policies 실행 시 덮어써질 수 있습니다. Red Hat이 안내하는 방식은 하위 정책 모듈을 추가하는 것입니다.
# 1) 모듈 파일 작성 (파일명 대문자, 확장자 .pmod)
vi /etc/crypto-policies/policies/modules/DISABLE-CBC.pmod
# SSH에서만 CBC 제거
cipher@SSH = -*-CBC
# 2) 정책 적용 및 확인
update-crypto-policies --set DEFAULT:DISABLE-CBC
update-crypto-policies --show # DEFAULT:DISABLE-CBC
# 3) 문법 확인 후 sshd 재시작
sshd -t && systemctl restart sshd
cipher = -AES-128-CBC -AES-256-CBC ...처럼 모든 프로토콜에서 CBC를 빼는 방식입니다. TLS 등 다른 서비스까지 함께 끄려면 이 방식을, SSH만 끄려면 위의 cipher@SSH 범위 지정 방식을 쓰면 됩니다.원인 ②: 재시작만 안 된 경우
sshd -t && systemctl restart sshd
6. 결과서·회신 문구 예시
| 구분 | 문구 |
|---|---|
| 판정 | 시스템 암호 정책 파일(opensshserver.config)에는 CBC가 포함되어 있지 않으나, 탐지 IP의 SSH 서버에서 CBC 암호가 실제로 협상되어 정탐으로 판정함 |
| 원인 | 실행 중인 sshd에 정책이 적용되지 않은 상태로, ① sshd 서비스 환경 설정 파일(/etc/sysconfig/sshd)에서 정책 적용을 해제(opt-out)하여 sshd_config의 Ciphers가 적용되고 있거나 ② 정책 변경 후 sshd를 재시작하지 않은 것으로 판단됨 |
| 조치 요청 | /etc/sysconfig/sshd의 CRYPTO_POLICY 줄 주석 처리(또는 sshd_config의 CBC 항목 삭제) 후 sshd 재시작, 조치 후 nmap ssh2-enum-algos 결과 회신 |
자주 묻는 질문
Q. Rocky Linux 8은 CBC를 쓸 수밖에 없나요?
아닙니다. 기본 정책이 허용할 뿐이고, 하위 정책 모듈이나 sshd 설정으로 끌 수 있습니다.
Q. sshd -T로 확인하면 안 되나요?
RHEL 8 계열은 정책이 실행 인자로 들어가 sshd -T 결과와 실제가 다를 수 있습니다. 실행 인자(ps)나 외부 협상 결과(nmap)로 확인하세요.
Q. 정책 파일 캡처를 증적으로 받아도 되나요?
정책 내용 증적은 될 수 있지만, 판정 근거로는 부족합니다. 탐지 IP를 대상으로 한 nmap 결과를 함께 받으세요.
Q. 전자금융기반시설 평가 항목에도 있나요?
2026년 평가기준 서버 분야에는 SSH 암호 알고리즘(CBC) 자체를 보는 항목은 없습니다. 사내 기준이나 PCI DSS 등 별도 기준으로 관리하는 경우가 많습니다.
정리
| 핵심 | 내용 |
|---|---|
| 구조 | RHEL 8 계열 sshd는 시스템 암호 정책을 실행 인자로 받아 sshd_config보다 우선 적용 |
| 함정 | 정책 파일이 깨끗해도 opt-out·재시작 누락이면 실제로는 CBC가 남음 |
| 판정 | 설정 파일·sshd -T가 아니라 외부에서 확인한 실제 협상 결과로 |
| 조치 | 하위 정책 모듈(DISABLE-CBC) 또는 opt-out 해제 → sshd 재시작 → nmap 재확인 |
| 실수 주의 | 비표준 포트는 nmap -sV 필수 |
참고 자료
'정보보안 > Infra' 카테고리의 다른 글
| 업스트림 다운스트림 뜻, 분야별 의미 차이 한 번에 정리 (데이터·Git·네트워크·프록시) (0) | 2026.10.07 |
|---|---|
| 데이터 관측가능성(Data Observability)이란? (0) | 2026.10.07 |
| 선박 사이버 보안 규제 총정리 — IMO·IACS·IEC·미국·EU 한눈에 보기 (0) | 2026.10.05 |
| IEC 62443이란? OT 보안 국제표준 구조·보안 수준(SL)·7대 요구사항 쉽게 정리 (0) | 2026.10.01 |
| 보안장비는 실시간 원격 로그, 서버는 왜 요구하지 않을까? (0) | 2026.09.21 |
- Total
- Today
- Yesterday
- 악성코드
- 오픈소스보안
- AI모의해킹
- 개인정보보호
- 사이버보안
- 보안뉴스
- 개인정보유출
- 시큐어코딩
- 정보보안
- 보안꿀팁
- AI보안
- 해킹주의
- 선박사이버보안
- 펜테스트
- IACS
- 보안상식
- IEC62443
- DevSecOps
- 전자금융기반시설취약점분석평가
- 공급망공격
- 해킹예방
- E27
- 취약점
- 샤이니헌터스
- 자율침투테스트
- cve
- 금취분평
- LLM에이전트
- 전자금융기반시설
- 개발자보안
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
