📚 네트워크 · 패킷 분석 › 05. 네트워크 스캔 징후 분석 — 232편
이전 글: 231. Directory Scan · 다음 글: 233. Brute Force와 Scan 구분
SSH Brute Force는 SSH 서비스(기본 22/tcp)에 계정과 비밀번호 조합을 반복해서 넣어 로그인을 시도하는 공격입니다. 포트 스캔으로 22번이 열린 것을 확인한 뒤 이어지는 경우가 많아, 정찰 다음 단계로 분류됩니다. 탐지 규칙의 설계(무엇을 세는가, track 방향)는 292. Brute Force 탐지에서 다뤘고, 이 글은 관제자가 sshd 로그에서 무엇을 읽어야 하는가에 집중합니다.
SSH는 암호화되어 있어 네트워크 장비는 연결 횟수만 볼 수 있고, 로그인 성공·실패와 계정 이름은 서버의 인증 로그에만 남습니다.
| 위치 | 보이는 것 | 보이지 않는 것 |
|---|---|---|
| 방화벽 | 22번 포트 연결 수, 세션 길이 | 계정, 성공 여부 |
| IDS | 짧은 시간 다수 연결(임계치 Alert) | 비밀번호 입력 결과 |
| sshd 인증 로그 | 계정, 결과, 출발지 IP·포트 | (서버에 기록되지 않는 네트워크 정보) |
한 번의 SSH 연결 안에서도 여러 번 인증을 시도할 수 있으므로, 연결 수와 실패 횟수는 같지 않습니다. sshd는 연결당 인증 시도 횟수를 MaxAuthTries(기본 6)로 제한하며, 넘으면 연결을 끊고 로그를 남깁니다.
출발지 ── TCP 연결 (22) ──→ 서버
↓ 키 교환·암호화 채널 수립
↓ 인증 시도 1 ── 실패 → "Failed password for ..."
↓ 인증 시도 2 ── 실패 → "Failed password for ..."
↓ ... MaxAuthTries 초과 → 연결 종료 ("maximum authentication attempts exceeded")
↓ 새 연결로 반복
↓
(성공 시) "Accepted password for <계정> from <IP>" → 세션 열림 ★ 최우선 확인
sshd 로그 메시지는 OpenSSH 버전에 따라 문구가 조금씩 다르지만, 관제에서 자주 보는 메시지는 다음과 같습니다.
| 메시지(요지) | 의미 | 관제 판단 |
|---|---|---|
Failed password for <계정> | 존재하는 계정의 비밀번호 실패 | 반복 시 대입 시도 |
Failed password for invalid user <계정> | 존재하지 않는 계정으로 시도 | 계정 목록 대입 가능성 |
Invalid user <계정> from <IP> | 없는 계정 접근 | 흔한 계정명 반복 여부 확인 |
maximum authentication attempts exceeded | 연결당 시도 한도 초과 | 자동화 도구 가능성 |
Connection closed by ... [preauth] | 인증 전에 연결 종료 | 단독이면 배너 확인·스캔일 수 있음 |
Accepted password / Accepted publickey | 로그인 성공 | 실패 뒤 성공이면 최우선 |
/var/log/secure, Ubuntu는 /var/log/auth.log입니다. systemd 저널에서는 서비스 이름이 Rocky는 sshd, Ubuntu는 보통 ssh입니다.root·admin 같은 흔한 계정에 집중되면 일반적인 자동화 대입, 실제 직원 계정명이 섞여 있다면 사전 정보 수집 뒤의 표적 시도일 수 있습니다.sshd 인증 로그 형식 예시입니다(값은 환경마다 다름).
Sep 30 03:10:01 web01 sshd[4101]: Invalid user test from 203.0.113.70 port 51201
Sep 30 03:10:03 web01 sshd[4101]: Failed password for invalid user test from 203.0.113.70 port 51201 ssh2
Sep 30 03:10:09 web01 sshd[4115]: Failed password for root from 203.0.113.70 port 51230 ssh2
Sep 30 03:10:15 web01 sshd[4115]: error: maximum authentication attempts exceeded for root from 203.0.113.70 port 51230 ssh2 [preauth]
실습 예시 — 본인 소유 실습 서버에서 출발지·계정별 실패 집계와 성공 여부를 확인하는 방어 측 명령입니다.
# Rocky
sudo grep "Failed password" /var/log/secure | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head
sudo journalctl -u sshd --since "2026-09-30 03:00" | grep -E "Accepted|Failed"
# Ubuntu
sudo grep "Failed password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head
sudo journalctl -u ssh --since "2026-09-30 03:00" | grep -E "Accepted|Failed"
# 의심 출발지의 성공 로그인 여부 (Ubuntu 예)
sudo grep "Accepted" /var/log/auth.log | grep "203.0.113.70"
$(NF-3)은 "Failed password ... from IP port N ssh2" 형식에서 IP 위치를 가리킵니다. 메시지 형식이 다르면 위치가 달라지므로 결과를 눈으로 확인합니다.
| 집계 결과 | 판단 | 조치 |
|---|---|---|
| 한 IP, 실패 수백 건, 성공 없음 | 대입 시도(실패) | 출발지 차단, 보고 |
한 IP, 실패 후 Accepted | 계정 탈취 의심 | 즉시 에스컬레이션, 세션 확인 |
| 여러 IP, 같은 계정 | 분산 대입 | 계정 보호 조치 검토 |
PasswordAuthentication no), PermitRootLogin 제한, 관리 IP 제한이 가장 효과적인 예방책입니다.SSH 반복 연결 Alert (방화벽·IDS)
↓ 대상 서버 인증 로그 조회
↓ 계정 분포 확인 (존재 계정? 관리자 계정?)
성공 없음 → 출발지 차단·기록, 같은 IP의 다른 서버 시도 검색
성공 있음 → 계정 탈취 의심: 로그인 이후 활동 확인, 계정 조치 요청, 에스컬레이션
관제자가 확인할 질문
Accepted 로그가 있는가? 있다면 그 이후 명령 실행·추가 접속은?오탐 주의: 비밀번호 변경 후 예전 비밀번호를 저장한 자동화 스크립트·백업 작업, 키 파일 경로가 잘못된 배포 도구는 같은 계정으로 짧은 주기의 실패를 반복합니다. 출발지가 내부 고정 서버라면 설정 오류를 먼저 확인합니다. Wazuh 등 HIDS에서 이 로그가 어떤 Alert로 묶이는지는 239. Wazuh Alert 분석에서 다룹니다.
/var/log/secure, Ubuntu /var/log/auth.log이고, 저널 서비스 이름은 각각 sshd, ssh입니다.Failed password, invalid user, maximum authentication attempts exceeded, Accepted 메시지의 의미를 구분합니다.