대상 OS: Debian 12 (bookworm)

SSH는 거의 모든 리눅스 서버의 ‘관리 평면’입니다.
그래서 SSH 설정이 느슨하면, 서버 전체가 느슨해집니다.
문제는 많은 환경에서 sshd_config가 “옛날 호환성”을 이유로 그대로 방치된다는 점입니다.
구형 키 교환(KEX), 약한 암호(cipher), 취약한 MAC이 남아 있으면, 공격자가 그 약한 조합을 골라 쓰거나 다운그레이드 공격 가능성을 노릴 수 있습니다.

이 글은 Debian 12에서 OpenSSH의 알고리즘(키 교환/암호/MAC/호스트키)을 점검하고, 운영 중 끊김 없이 단계적으로 하드닝하는 방법을 정리합니다.

---

1) 하드닝 목표를 먼저 정하기

1) 구형/취약 알고리즘을 제거한다

2) 서버가 제시하는 호스트 키를 현대적으로 정리한다(ed25519 중심)

3) 클라이언트 호환성은 “점진적으로” 끊는다(한 번에 바꾸지 않기)

4) 변경 전/후를 커맨드로 검증한다

SSH는 웹처럼 브라우저가 자동 업데이트되는 세상이 아니라, 레거시 장비/자동화 에이전트가 섞여 있어서 “운영 계획”이 중요합니다.

---

2) 현재 SSH 서버 상태 확인(변경 전 스냅샷)

1) OpenSSH 버전과 유효 설정 확인

ssh -V
sudo sshd -T | head -n 40

2) 현재 허용 알고리즘(유효 설정) 확인

sudo sshd -T | grep -E 'kexalgorithms|ciphers|macs|hostkeyalgorithms|pubkeyacceptedalgorithms' | sed -n '1,200p'

3) 현재 서버의 호스트키 파일 확인

sudo ls -la /etc/ssh/ssh_host_*key*

4) 실제 접속에서 협상되는 알고리즘 확인(클라이언트에서)

ssh -vvv [email protected] 2>&1 | grep -E 'kex: algorithm|kex: host key algorithm|kex: cipher|kex: mac' | head -n 60

이 출력이 “현재 실사용” 기준입니다. 정책을 바꾸기 전에 반드시 한 번 기록해두세요.

---

3) 클라이언트가 지원하는 알고리즘 목록 확인(ssh -Q)

서버에서만 정리하면 끊깁니다. 접속하는 클라이언트가 무엇을 지원하는지부터 확인해야 합니다.

1) 클라이언트 지원 KEX

ssh -Q kex | sed -n '1,120p'

2) 클라이언트 지원 cipher

ssh -Q cipher | sed -n '1,120p'

3) 클라이언트 지원 MAC

ssh -Q mac | sed -n '1,120p'

4) 클라이언트 지원 hostkey

ssh -Q key | sed -n '1,200p'

이 목록과 서버 정책을 교집합으로 맞추는 게 ‘무중단 하드닝’의 핵심입니다.

---

4) Debian 12 권장 방향(실무 기준)

아래는 “현대적이면서도 과격하지 않은” 방향입니다.

1) 호스트키: ed25519 중심, RSA는 필요할 때만(레거시)

2) KEX: curve25519 계열 우선

3) Ciphers: chacha20-poly1305, aes-gcm 우선

4) MAC: AEAD 계열(여기서는 cipher에서 이미 제공) 또는 etm 계열 선호

주의: 어떤 알고리즘을 ‘정확히’ 퇴출할지는 조직의 호환성 요구에 따라 다릅니다.

---

5) 실제 적용: sshd_config.d로 하드닝 파일 추가

Debian 12는 `/etc/ssh/sshd_config`에 `Include`가 있을 수 있습니다.
가능하면 별도 파일로 분리해 롤백을 쉽게 만듭니다.

1) Include 사용 여부 확인

sudo grep -n "^Include" /etc/ssh/sshd_config || true

2) 하드닝 설정 파일 작성(예시)

sudo tee /etc/ssh/sshd_config.d/40-crypto-hardening.conf >/dev/null