SSH 서버 보안 강화 설정

루트 로그인 차단, 키 기반 인증 전용, 포트 변경 등 프로덕션 서버를 위한 강화된 sshd_config 템플릿입니다.

Gist
# /etc/ssh/sshd_config
# SSH 서버 보안 강화 설정
# 변경 후 적용: sudo systemctl reload sshd

# ============================================================
# 기본 포트 및 주소 설정
# 기본 포트(22)를 변경하면 자동화된 스캔봇의 공격을 줄일 수 있음
# 방화벽 규칙도 함께 업데이트 필요
# ============================================================
Port 2222
AddressFamily inet
ListenAddress 0.0.0.0

# ============================================================
# 호스트 키 설정
# Ed25519는 현재 가장 안전하고 성능이 좋은 알고리즘
# RSA는 하위 호환성을 위해 유지 (4096비트 이상 권장)
# ============================================================
HostKey /etc/ssh/ssh_host_ed25519_key
HostKey /etc/ssh/ssh_host_rsa_key

# 보안이 낮은 알고리즘 비활성화
KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com

# ============================================================
# 인증 설정
# 공개키 인증만 허용 — 비밀번호 인증은 브루트포스 공격에 취약
# ============================================================
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

# 비밀번호 로그인 완전 차단
PasswordAuthentication no
PermitEmptyPasswords no
ChallengeResponseAuthentication no
KbdInteractiveAuthentication no

# PAM 인증 비활성화 (비밀번호 우회 경로 차단)
UsePAM no

# ============================================================
# 루트 계정 보호
# 직접 루트 로그인 차단 — 일반 계정으로 로그인 후 sudo 사용
# ============================================================
PermitRootLogin no

# ============================================================
# 접근 허용 사용자/그룹 화이트리스트
# 명시된 사용자/그룹만 SSH 접속 허용 (나머지 모두 거부)
# ============================================================
AllowUsers deploy admin
AllowGroups sshusers sudo

# ============================================================
# 인증 시도 제한
# MaxAuthTries: 인증 실패 횟수 초과 시 연결 차단
# LoginGraceTime: 인증 완료까지 허용 시간 (초)
# ============================================================
MaxAuthTries 3
LoginGraceTime 30
MaxSessions 10
MaxStartups 10:30:60

# ============================================================
# 세션 유지 및 타임아웃
# 유휴 세션 자동 종료로 보안 강화
# ClientAliveInterval * ClientAliveCountMax = 최대 유휴 시간
# ============================================================
ClientAliveInterval 300
ClientAliveCountMax 2
TCPKeepAlive no

# ============================================================
# 접속 배너 설정
# 무단 접근 경고 메시지 표시 (법적 보호 효과)
# ============================================================
Banner /etc/ssh/banner.txt

# ============================================================
# 보안 기능 활성화
# ============================================================
# X11 포워딩 비활성화 (GUI 불필요한 서버)
X11Forwarding no

# 에이전트 포워딩 비활성화 (보안 위험 방지)
AllowAgentForwarding no

# TCP 포워딩 비활성화 (터널링 방지)
AllowTcpForwarding no

# 터널 비활성화
PermitTunnel no

# 원격 포트 포워딩 비활성화
GatewayPorts no

# 사용자 환경 파일 로드 금지 (.ssh/environment 등)
PermitUserEnvironment no

# ============================================================
# 로깅 설정
# VERBOSE 레벨: 공개키 인증 시도 기록 포함
# 로그 위치: /var/log/auth.log 또는 /var/log/secure
# ============================================================
SyslogFacility AUTH
LogLevel VERBOSE

# ============================================================
# SFTP 설정 (chroot 격리)
# sftponly 그룹 사용자는 자신의 홈 디렉터리에만 접근 가능
# ============================================================
Subsystem sftp internal-sftp

Match Group sftponly
    # SFTP만 허용, 쉘 접근 차단
    ForceCommand internal-sftp -l INFO
    # 루트로 chroot (홈 디렉터리 소유자: root, 권한: 755)
    ChrootDirectory /home/%u
    AllowTcpForwarding no
    AllowAgentForwarding no
    X11Forwarding no
    PermitTTY no