SSH 보안 강화

sshd_config 보안 설정, Fail2Ban, 2FA, 로그 모니터링

SSH 서버의 보안을 강화하는 방법을 다룬다. 비밀번호 인증 비활성화, root 로그인 차단, 포트 변경, Fail2Ban으로 브루트포스 방어, 2FA(Google Authenticator), 접속 로그 모니터링까지 실무 보안 설정을 정리한다.

Engineering
Infrastructure
Security
저자

Kwangmin Kim

공개

2025년 11월 28일

1 SSH 서버 설정: sshd_config

SSH 서버의 보안 설정은 /etc/ssh/sshd_config 파일에서 관리한다.

sudo nano /etc/ssh/sshd_config

설정 변경 후 반드시 SSH 서비스를 재시작해야 한다:

sudo systemctl restart sshd
경고

설정을 잘못하면 서버에 접속할 수 없게 된다. 변경 전에 현재 SSH 세션을 유지한 채 새 세션으로 접속 테스트를 해야 한다.

2 핵심 보안 설정

2.1 비밀번호 인증 비활성화

공개키 인증만 허용하면 브루트포스 공격이 무의미해진다. 가장 효과적인 보안 강화 방법이다.

PasswordAuthentication no
PubkeyAuthentication yes
PermitEmptyPasswords no
중요

비밀번호 인증을 끄기 전에 공개키 인증으로 접속이 정상 동작하는지 반드시 확인해야 한다. 그렇지 않으면 서버에 접속할 수 없게 된다.

2.2 Root 로그인 차단

root 계정은 모든 서버에 존재하므로 공격 대상이 되기 쉽다.

PermitRootLogin no

root 작업이 필요하면 일반 사용자로 접속 후 sudo를 사용한다.

2.3 접속 허용 사용자 제한

# 허용할 사용자만 명시 (화이트리스트)
AllowUsers alice bob charlie

# 또는 그룹 단위
AllowGroups ssh-users

# 특정 사용자 차단 (블랙리스트)
DenyUsers attacker

2.4 포트 변경

기본 포트(22)를 변경하면 자동화된 스캐닝 공격을 줄일 수 있다.

Port 2222

포트 변경 후 방화벽에서 새 포트를 허용해야 한다:

# Ubuntu (UFW)
sudo ufw allow 2222/tcp

# CentOS (firewalld)
sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --reload
노트

포트 변경만으로 보안이 강화되지는 않는다 (security through obscurity). 자동화된 스캐닝을 줄이는 효과만 있으며, 공개키 인증과 함께 사용해야 의미가 있다.

2.5 최대 인증 시도 횟수

MaxAuthTries 3

2.6 로그인 시간 제한

LoginGraceTime 30    # 30초 내에 인증 완료해야 함

3 권장 sshd_config 전체

# 포트 설정
Port 2222

# 프로토콜 (SSH-2만 사용)
Protocol 2

# 인증 방식
PasswordAuthentication no
PubkeyAuthentication yes
PermitEmptyPasswords no

# Root 접속 차단
PermitRootLogin no

# 접속 허용 사용자
AllowUsers ubuntu developer

# 인증 시도 제한
MaxAuthTries 3
LoginGraceTime 30

# X11 포워딩 (필요 시만 yes)
X11Forwarding no

# 빈 비밀번호 금지
PermitEmptyPasswords no

4 Fail2Ban: 브루트포스 방어

Fail2Ban은 반복적인 로그인 실패를 감지하여 IP를 자동 차단하는 도구다.

4.1 설치

# Ubuntu/Debian
sudo apt install fail2ban -y

# CentOS/RHEL
sudo yum install fail2ban -y

4.2 설정

sudo nano /etc/fail2ban/jail.local
[sshd]
enabled = true
port = 22           # SSH 포트 (변경했으면 맞춰서 수정)
filter = sshd
logpath = /var/log/auth.log    # Ubuntu
# logpath = /var/log/secure    # CentOS
maxretry = 3         # 3회 실패 시 차단
bantime = 3600       # 1시간 차단 (초 단위)
findtime = 600       # 10분 내 실패 횟수 집계

4.3 관리 명령어

# 서비스 시작
sudo systemctl enable fail2ban
sudo systemctl start fail2ban

# 차단된 IP 확인
sudo fail2ban-client status sshd

# 특정 IP 차단 해제
sudo fail2ban-client set sshd unbanip 192.168.1.100

# 로그 확인
sudo tail -f /var/log/fail2ban.log

5 2FA: 이중 인증

SSH에 Google Authenticator를 추가하여 키 인증 + OTP 코드의 이중 보안을 적용한다.

5.1 설치 및 설정

# 설치
sudo apt install libpam-google-authenticator -y

# 사용자별 설정
google-authenticator
# QR 코드가 출력됨 → 스마트폰 Google Authenticator 앱으로 스캔

5.2 PAM 설정

sudo nano /etc/pam.d/sshd
# 다음 줄 추가:
auth required pam_google_authenticator.so

5.3 SSH 설정

sudo nano /etc/ssh/sshd_config

ChallengeResponseAuthentication yes
# 또는 최신 버전:
KbdInteractiveAuthentication yes
sudo systemctl restart sshd

6 방화벽 설정

6.1 원칙: 최소 권한 (Least Privilege)

SSH 포트를 전체 인터넷(0.0.0.0/0)에 열지 않고, 특정 IP만 허용한다.

6.2 Ubuntu (UFW)

# 특정 IP에서만 SSH 허용
sudo ufw allow from 203.0.113.10/32 to any port 22

# 전체 허용 (비권장)
# sudo ufw allow 22/tcp

6.3 Azure NSG

az network nsg rule create --name AllowSSHFromMyIP \
  --nsg-name my-nsg --resource-group my-rg \
  --priority 1000 --source-address-prefixes 203.0.113.10/32 \
  --destination-port-ranges 22 --access Allow --protocol Tcp

6.4 AWS Security Group

aws ec2 authorize-security-group-ingress \
  --group-id sg-0123456789abcdef0 \
  --protocol tcp --port 22 \
  --cidr 203.0.113.10/32

7 로그 모니터링

7.1 SSH 접속 로그 확인

# 최근 로그인 기록
last

# 실패한 로그인 시도
sudo grep "Failed password" /var/log/auth.log

# 성공한 SSH 접속
sudo grep "Accepted publickey" /var/log/auth.log

# 실시간 모니터링
sudo tail -f /var/log/auth.log

7.2 비정상 접속 징후

  • 알 수 없는 IP에서 반복적인 접속 시도
  • 존재하지 않는 사용자명으로의 접속 시도
  • 짧은 시간 내 다수의 인증 실패

8 SSH 키 관리 원칙

원칙 설명
개인키 비공개 절대 공유, 이메일 전송, Git 커밋 금지
파일 권한 600 chmod 600 ~/.ssh/id_ed25519
패스프레이즈 설정 개인키 유출 시에도 추가 보호
정기적 키 순환 오래된 키는 새 키로 교체
퇴사자 키 제거 authorized_keys에서 즉시 삭제
용도별 키 분리 개인/업무/서비스별 별도 키 사용

9 보안 체크리스트

[ ] 비밀번호 인증 비활성화 (PasswordAuthentication no)
[ ] Root 로그인 차단 (PermitRootLogin no)
[ ] SSH 키 파일 권한 확인 (chmod 600)
[ ] 방화벽에서 SSH 포트 IP 제한
[ ] Fail2Ban 설치 및 활성화
[ ] 포트 변경 (선택)
[ ] 2FA 설정 (선택)
[ ] 정기적 로그 점검
[ ] 퇴사자/불필요 키 정리

10 요약

설정 효과 우선순위
PasswordAuthentication no 브루트포스 공격 원천 차단 필수
PermitRootLogin no Root 계정 공격 차단 필수
방화벽 IP 제한 접근 범위 최소화 필수
Fail2Ban 반복 공격 IP 자동 차단 권장
포트 변경 자동 스캐닝 회피 선택
2FA 이중 인증 선택

Subscribe

Enjoy this blog? Get notified of new posts by email: