/etc/ssh/sshd_config 보안 설정에 필요한 옵션들
# ================================
# OpenSSH Server hardening (Ubuntu 24.04)
# 요구사항:
# - Port 22 유지
# - root 로그인 불가
# - 허용된 일반 계정만(손님 불가)
# - 일반 계정은 SSH 키로만 로그인
# - 계정 비밀번호는 "존재"해야 하지만(운영정책), SSH 비밀번호 인증은 금지
# ================================
# ---- [기본: 포트/프로토콜/리스닝] ----
# SSH 포트를 22로 유지 (포트 변경은 근본 보안이 아니라 운영 편의/정책 문제)
Port 22
# SSH 프로토콜은 2만 사용 (사실상 기본이지만 명시)
Protocol 2
# IPv4/IPv6 모두 리슨 (필요 시 'inet' 또는 'inet6'로 축소 가능)
AddressFamily any
# 모든 인터페이스에서 수신 (특정 IP에서만 받으려면 내부망/공인IP로 제한 가능)
ListenAddress 0.0.0.0
ListenAddress ::
# ---- [인증: 키만 허용] ----
# 공개키 인증 허용(핵심)
PubkeyAuthentication yes
# "키 인증만" 허용하도록 강제 (비번/키보드인터랙티브가 켜져 있어도 키가 필수 관문)
AuthenticationMethods publickey
# 비밀번호 인증 완전 차단 (계정에 비번이 있어도 SSH로는 절대 비번 로그인 불가)
PasswordAuthentication no
# 키보드-대화형 인증 차단 (PAM 기반 OTP/질문형 인증류까지 꺼서 표면적 축소)
KbdInteractiveAuthentication no
# 챌린지-리스폰스 차단 (구버전 호환 옵션, 켜둘 이유 없음)
ChallengeResponseAuthentication no
# 빈 비밀번호 계정은 허용하지 않음 (추가 안전망)
PermitEmptyPasswords no
# Ubuntu 권장: PAM 사용(계정 만료, 접근제어, 세션 정책 등에 유용)
# ※ PasswordAuthentication이 no여도 PAM을 켜두는 것이 일반적으로 안전/유용
UsePAM yes
# ---- [계정 접근 통제: root/손님 차단] ----
# root 직접 로그인 금지 (반드시 일반 계정으로 로그인 후 sudo 사용)
PermitRootLogin no
# "손님 불가"를 가장 깔끔하게 구현: 이 그룹에 속한 계정만 SSH 허용(화이트리스트)
# 예: sudo groupadd -f sshlogin ; sudo usermod -aG sshlogin elkha
# AllowGroups sshlogin
# (대안) 그룹 대신 사용자 목록으로 통제하고 싶으면 아래를 사용 (둘 중 하나만 쓰는 걸 추천)
# AllowUsers elkha
# ---- [브루트포스/자원고갈 방어] ----
# 로그인 유예시간 단축(봇이 오래 물고 늘어지는 것 방지)
LoginGraceTime 20
# 인증 시도 횟수 제한(무차별 대입 방어)
MaxAuthTries 3
# 한 연결에서 열 수 있는 세션 수 제한(과도한 multiplex 악용 방지)
MaxSessions 5
# 비인증 상태 연결(봇)의 동시 접속 시도 제한 (DoS/브루트포스 완화)
# 10:30:60 = 10개까지는 즉시, 10개 초과부터 30% 확률로 드롭, 60개 초과는 거의 거부
MaxStartups 10:30:60
# ---- [유휴 연결 관리: 방치 세션 정리] ----
# 300초(5분)마다 alive 체크 전송
ClientAliveInterval 300
# 2회 연속 응답 없으면 종료(총 약 10분 무응답 시 세션 종료)
ClientAliveCountMax 2
# ---- [불필요 기능 끄기: 공격 표면적 축소] ----
# X11 포워딩 비활성(대부분 서버에서 불필요, 공격 표면 증가)
X11Forwarding no
# TCP 포워딩(터널링) 비활성(피벗/우회 채널 악용 방지) - 필요 시 Match로 예외 허용
AllowTcpForwarding yes
# SSH Agent Forwarding 비활성(원격 호스트에서 에이전트 악용/피벗 위험 감소)
AllowAgentForwarding yes
# 터널 디바이스 기능 비활성(거의 불필요)
PermitTunnel no
# 원격포트가 0.0.0.0에 바인딩되는 GatewayPorts 비활성(의도치 않은 노출 방지)
GatewayPorts no
# 사용자 환경변수 주입(PermitUserEnvironment) 비활성(서버 동작 영향 방지)
PermitUserEnvironment no
# TTY는 보통 필요(셸 사용)하므로 허용
PermitTTY yes
# 로그인 시 배너/MOTD 최소화(불필요한 정보 노출 방지) - 필요하면 켜도 됨
PrintMotd no
# 역방향 DNS 조회를 하지 않음(로그인 지연/스푸핑 영향 감소, 속도 향상)
UseDNS no
# ---- [로깅] ----
# 인증 관련 로그를 좀 더 자세히 남김(추적/감사에 유리)
LogLevel VERBOSE
# ---- [SFTP] ----
# SFTP 서브시스템 (필요 없으면 주석 처리 가능)
Subsystem sftp /usr/lib/openssh/sftp-server
# ================================
# (옵션) 예외 허용이 필요할 때: Match 블록 예시
# ================================
# 예: 특정 사용자(elkha)만 포트포워딩 허용하고 싶다면(기본은 AllowTcpForwarding no)
# Match User elkha
# AllowTcpForwarding yes