인터넷에 노출된 서버는 부팅 직후부터 SSH 무차별 대입(brute-force) 시도를 받습니다. /var/log/auth.log(또는 journalctl -u sshd)를 보면 Failed password for invalid user admin 같은 줄이 수백 줄씩 쌓입니다. 비밀번호 인증을 끄고 몇 가지 기본값만 바꿔도 공격 표면이 크게 줄어듭니다.
증상 — 얼마나 두들겨 맞고 있나
먼저 실패 로그를 세어 봅니다.
서버 터미널
journalctl -u sshd | grep -c "Failed password"
grep "Failed password" /var/log/auth.log | tail
실패가 많다면 비밀번호 인증이 켜져 있고 root 로그인이 열려 있을 가능성이 높습니다.
설정 파일
모든 변경은 /etc/ssh/sshd_config에서 합니다. 최신 배포판은 /etc/ssh/sshd_config.d/ 아래 드롭인 파일도 읽으니 거기에 별도 파일로 두는 것이 깔끔합니다.
핵심 항목
/etc/ssh/sshd_config.d/90-hardening.conf 에 다음을 적용합니다.
INI
# 키 인증만 허용 (비밀번호 인증 차단)
PasswordAuthentication no
PubkeyAuthentication yes
ChallengeResponseAuthentication no
# root 직접 로그인 차단
PermitRootLogin no
# 빈 비밀번호 계정 차단
PermitEmptyPasswords no
# 인증 시도·세션 제한
MaxAuthTries 3
LoginGraceTime 20
MaxSessions 5
# 접속 가능한 사용자 화이트리스트
AllowUsers deploy ops
| 항목 | 왜 중요한가 |
|---|---|
PasswordAuthentication no | 무차별 대입의 표적 자체를 제거 |
PermitRootLogin no | root 계정을 직접 노리지 못하게 함 |
MaxAuthTries 3 | 한 연결당 시도 횟수 제한 |
AllowUsers | 명시된 계정만 로그인 허용 |
비밀번호 인증을 끄기 전에 반드시 키 인증이 동작하는지 확인하세요. 그렇지 않으면 스스로 잠깁니다.
로컬 터미널
ssh-copy-id deploy@server # 공개키 등록
ssh deploy@server # 키로 접속되는지 먼저 확인
적용 전 검증 — 문법 오류로 잠기지 않기
sshd_config에 오타가 있으면 데몬이 재시작 실패하고, 그 사이 기존 세션도 끊기면 접속 불가가 됩니다. 적용 전 -t로 문법을 검사합니다.
로컬 터미널
sshd -t # 문법 검사 (출력 없으면 정상)
sshd -T | grep -i "permitrootlogin\|passwordauth" # 실제 적용값 확인
검사가 통과하면 재시작하되, 현재 SSH 세션은 끊지 말고 새 터미널로 접속 테스트를 합니다.
서버 터미널
systemctl reload sshd
# 기존 세션 유지한 채 새 창에서 접속 확인
추가 권장
- 포트 변경(
Port 2222)은 로그 노이즈를 줄이지만 보안 자체는 아닙니다. 본질은 키 인증입니다. fail2ban으로 반복 실패 IP를 자동 차단하면 로그가 한결 조용해집니다.- 방화벽에서 SSH 포트를 신뢰 대역으로만 여는 것이 가장 강력합니다.
체크리스트
SSH 접속 후
ssh deploy@server # 키 인증 동작 먼저 확인
sshd -t # 설정 문법 검사
sshd -T | grep -i permitroot # 적용값 확인
systemctl reload sshd # 무중단 적용
journalctl -u sshd -f # 적용 후 로그 관찰
SSH 키 인증·권한·로그를 직접 다뤄보는 실습은 리눅스 트랙에서 회원가입 없이 무료로 할 수 있습니다.