Skip to content

/etc/ssh/sshd_config 보안 설정에 필요한 옵션들

조회 수 11 추천 수 0

# ================================
# 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

개발자