SSH는 리눅스 서버 관리의 핵심 도구지만, 잘못 설정하면 가장 큰 보안 취약점이 됩니다. 매일 수천 건의 무차별 대입 공격(Brute Force)이 SSH 포트를 노리고 있습니다. 오늘은 실무에서 바로 적용 가능한 SSH 보안 강화 방법을 소개합니다.
1. 기본 포트 변경 (Port Knocking)
SSH 기본 포트 22번은 자동화된 공격의 1순위 타깃입니다. 포트를 변경하는 것만으로도 90% 이상의 무차별 공격을 차단할 수 있습니다.
# /etc/ssh/sshd_config 편집
Port 22443
# 방화벽 규칙 적용
sudo ufw allow 22443/tcp
sudo ufw delete allow 22/tcp
# SSH 재시작
sudo systemctl restart sshd
주의: 변경 전 새 포트로 접속 테스트를 먼저 하세요. 기존 세션을 유지한 채 새 세션으로 확인 후 적용하는 것이 안전합니다.
2. 패스워드 인증 비활성화 + SSH 키 인증 강제
패스워드는 언제든 뚫릴 수 있습니다. SSH 키 방식으로 전환하면 무차별 대입 공격이 원천적으로 무력화됩니다.
# 로컬에서 키 생성 (4096bit RSA)
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
# 공개키를 서버에 복사
ssh-copy-id -i ~/.ssh/id_rsa.pub user@server_ip
# 서버 설정 변경
sudo nano /etc/ssh/sshd_config
PasswordAuthentication no
PubkeyAuthentication yes
PermitRootLogin prohibit-password
sudo systemctl restart sshd
3. Root 로그인 완전 차단
Root 계정은 모든 공격자가 노리는 최종 목표입니다. 일반 유저로 접속 후 sudo 사용을 원칙으로 하세요.
PermitRootLogin no
4. Fail2Ban으로 자동 차단
반복적인 로그인 실패 시도를 자동으로 감지하고 IP를 일시 차단하는 도구입니다.
# 설치
sudo apt install fail2ban -y
# 설정 파일 생성
sudo nano /etc/fail2ban/jail.local
[sshd]
enabled = true
port = 22443
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
# 차단 현황 확인
sudo fail2ban-client status sshd
3번 실패 시 1시간 차단됩니다. bantime을 -1로 설정하면 영구 차단도 가능합니다.
5. 2단계 인증(2FA) 추가
SSH 키 + OTP 조합으로 이중 보안을 구축할 수 있습니다. Google Authenticator를 활용합니다.
sudo apt install libpam-google-authenticator -y
# 사용자 계정별로 실행
google-authenticator
# PAM 설정
sudo nano /etc/pam.d/sshd
auth required pam_google_authenticator.so
# SSH 설정
sudo nano /etc/ssh/sshd_config
ChallengeResponseAuthentication yes
AuthenticationMethods publickey,keyboard-interactive
sudo systemctl restart sshd
6. 접속 허용 IP 화이트리스트
고정 IP 환경이라면 방화벽에서 특정 IP만 SSH 접속을 허용하는 것이 가장 확실합니다.
# UFW 예시
sudo ufw allow from 123.45.67.89 to any port 22443
# iptables 예시
sudo iptables -A INPUT -p tcp -s 123.45.67.89 --dport 22443 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22443 -j DROP
7. 접속 로그 모니터링 자동화
실시간으로 로그를 감시하고 이상 징후 발견 시 알림을 받도록 설정합니다.
# 최근 SSH 접속 확인
last -a | head -20
# 실패한 로그인 시도 확인
sudo grep "Failed password" /var/log/auth.log | tail -20
# 성공한 로그인 확인
sudo grep "Accepted" /var/log/auth.log | tail -20
Telegram Bot이나 이메일과 연동하면 의심스러운 접속 시도를 즉시 통보받을 수 있습니다.
마무리: 보안은 한 번이 아니라 습관
위 7가지 설정을 모두 적용하는 데 30분이면 충분합니다. 하지만 효과는 엄청납니다. SSH 보안은 “나중에”가 아니라 “지금 당장” 해야 합니다. 해킹 사고는 예고 없이 찾아오니까요.
오늘 바로 적용하세요. 내일이면 늦을 수 있습니다.