012. Linux 서버 보안 — SSH 세션·인증 시도 제한 설정

changseop lee·3일 전

시스템 보안 · 취약점 › A. Linux 서버 보안 설정 · 12/50편 (전체 012/450)
학습 단계: 2단계 · 설정 및 점검
실습 표기: 이 글의 명령어·출력·로그는 로컬 VMware 테스트 VM(Rocky Linux 9 / Ubuntu 22.04) 기준의 「실습 예시」이며, IP·계정·호스트명은 가상의 값입니다.

선행 학습

1. 개념

SSH 한도 설정은 연결 단계별로 자원을 제한합니다. 어느 단계에서 걸렸는지에 따라 로그 메시지가 달라지므로, 메시지로 공격 유형을 추정할 수 있습니다.

TCP 연결 ──→ [MaxStartups] 인증 전 동시 연결 수 제한
   ↓
인증 대기 ──→ [LoginGraceTime] 인증 완료까지 허용 시간
   ↓
인증 시도 ──→ [MaxAuthTries] 연결당 인증 시도 횟수
   ↓
로그인 후 ──→ [MaxSessions] 연결당 세션 수
           ──→ [ClientAliveInterval × CountMax] 무응답 세션 정리

2. 왜 중요한가

  • 한도가 없으면 한 번의 연결로 수많은 비밀번호를 시도하거나, 인증 전 연결을 대량으로 열어 정상 사용자의 접속을 방해할 수 있습니다.
  • 관리자가 자리를 비운 채 열어 둔 세션은 세션 탈취의 대상이 됩니다.
  • 한도 초과 로그는 단순 실패 로그보다 자동화 도구 사용을 더 강하게 시사합니다.

3. 핵심 명령어 / 설정

설정권장 예시기본값(OpenSSH)
MaxAuthTries3~46
LoginGraceTime30120
MaxStartups10:30:6010:30:100
MaxSessions2~410
ClientAliveInterval / ClientAliveCountMax300 / 20 / 3

MaxStartups 10:30:60은 "인증 전 연결이 10개를 넘으면 30% 확률로 거절을 시작해, 60개에서는 모두 거절"이라는 뜻입니다.

4. 실습 (실습 예시)

sudo tee /etc/ssh/sshd_config.d/06-limits.conf <<'EOF'
MaxAuthTries 3
LoginGraceTime 30
MaxStartups 10:30:60
MaxSessions 4
ClientAliveInterval 300
ClientAliveCountMax 2
EOF
sudo sshd -t && sudo systemctl reload sshd
sudo sshd -T | grep -E '^(maxauthtries|logingracetime|maxstartups|maxsessions|clientalive)'

# 테스트 클라이언트에서: 틀린 비밀번호를 연속 입력해 한도 초과 메시지 확인

5. 정상 상태

maxauthtries 3
logingracetime 30
maxsessions 4
clientaliveinterval 300
clientalivecountmax 2
maxstartups 10:30:60

정상 운영에서 한도 초과 로그는 드물게, 산발적으로 나타납니다(비밀번호를 잊은 사용자 등).

6. 이상 상태

$ sudo sshd -T | grep -E 'maxauthtries|logingracetime'
maxauthtries 50
logingracetime 600

한도를 크게 늘린 설정은 무차별 대입 준비 또는 자동화 도구 접속을 쉽게 하려는 변경일 수 있습니다. 설정 변경 시각과 이후 실패 로그 급증을 함께 봅니다.

7. 로그 분석 (분석 방법)

한도별 대표 로그입니다(가상의 예시 로그).

Oct  1 07:10:02 rocky9-web01 sshd[7001]: error: maximum authentication attempts exceeded for invalid user oracle from 192.168.56.77 port 40210 ssh2 [preauth]
Oct  1 07:10:02 rocky9-web01 sshd[7001]: Disconnecting invalid user oracle 192.168.56.77 port 40210: Too many authentication failures [preauth]
Oct  1 07:10:09 rocky9-web01 sshd[1022]: drop connection #10 from [192.168.56.77]:40288 on [192.168.56.10]:22 past MaxStartups
Oct  1 07:12:40 rocky9-web01 sshd[7044]: Timeout before authentication for 192.168.56.78 port 51544
메시지걸린 한도의미
maximum authentication attempts exceededMaxAuthTries연결당 다수 비밀번호 시도
past MaxStartupsMaxStartups인증 전 연결 폭주(병렬 도구)
Timeout before authenticationLoginGraceTime연결만 열고 인증하지 않음(배너 수집·점검 도구 가능)

invalid user oracle처럼 존재하지 않는 흔한 계정명이 섞이면 사전(dictionary) 기반 자동화일 가능성이 높습니다.

8. SOC 관제 포인트

  • past MaxStartups는 정상 사용에서 거의 나오지 않으므로 발생 즉시 출발지를 확인합니다.
  • 실패 로그 수보다 고유 계정명 수와 시도 간격을 함께 봅니다.
  • 한도 설정값 자체를 기준선에 넣어 완화 변경을 탐지합니다.

9. 탐지 규칙

Wazuh 기본 룰셋에서 5710(존재하지 않는 사용자 로그인 시도), 5712(SSHD brute force, 빈도 기반)가 관련 룰입니다. 연결 폭주는 별도 룰로 보완합니다.

<rule id="100190" level="10">
  <decoded_as>sshd</decoded_as>
  <match>past MaxStartups</match>
  <description>SSH 인증 전 연결 폭주(MaxStartups 초과)</description>
</rule>

Kibana 예시: rule.id : (5710 or 5712 or 100190) and data.srcip : "192.168.56.77"

10. 대응 방법

  1. 초기 확인 — 한도 초과 로그의 출발지 IP·계정명 목록·시도 간격을 확인합니다.
  2. 범위 확인 — 같은 IP가 다른 서버에도 시도했는지, 성공 로그가 있는지 확인합니다.
  3. 증거 확보 — sshd 로그와 당시 방화벽 로그를 보존합니다.
  4. 차단/조치 — 출발지 IP를 방화벽에서 차단하고, 성공 계정이 있으면 비밀번호를 교체합니다.
  5. 재발 방지 — 한도 설정을 기준선에 포함하고 fail2ban 등 자동 차단 도입을 검토합니다.

11. 핵심 정리

설정걸리는 단계 / 로그
MaxStartups인증 전 동시 연결 / past MaxStartups
LoginGraceTime인증 대기 시간 / Timeout before authentication
MaxAuthTries연결당 시도 수 / maximum authentication attempts exceeded
ClientAlive*무응답 세션 정리
면접 포인트"로그 메시지로 어느 한도에 걸렸는지 → 공격 유형 추정"

12. 다음 편 예고

다음 편 013. Linux 서버 보안 — 불필요한 서비스 식별과 비활성화 에서는 서버에서 돌아가는 불필요한 서비스를 식별하고 비활성화하는 방법을 다룹니다.


이전 편: 011. Linux 서버 보안 — SSH 접근 제어 — AllowUsers·AllowGroups·Match
📚 시리즈 전체 보기: 시스템 보안 · 취약점

profile
코드에 숨겨진 위협을 읽고 AI로 보안의 미래를 설계합니다. 프론트엔드 개발 경험을 자산 삼아 더 견고하고 지능적인 보안 운영 시스템을 구축해 나가는 과정을 기록합니다

0개의 댓글