시스템 보안 · 취약점 › B. 계정 · 인증 보안 강화 · 20/50편 (전체 070/450)
학습 단계: 2단계 · 설정 및 점검
실습 표기: 이 글의 명령어·출력·로그는 로컬 VMware 테스트 VM(Rocky Linux 9 / Ubuntu 22.04) 기준의 「실습 예시」이며, IP·계정·호스트명은 가상의 값입니다.
인증 실패 로그는 종류가 다양하고, 메시지마다 다른 상황을 의미합니다. 이를 구분하지 못하면 모든 실패가 같은 "brute-force"로 뭉뚱그려집니다.
Failed password for devops from IP → 존재하는 계정, 비밀번호 틀림
Failed password for invalid user oracle → 존재하지 않는 계정 시도(열거)
Invalid user oracle from IP → 위와 짝을 이루는 메시지
Failed publickey for devops from IP → 키 인증 실패(등록 안 된 키)
Connection closed ... [preauth] → 인증 완료 전 종료(스캔·배너 수집)
maximum authentication attempts exceeded → 한 연결에서 여러 번 시도(A영역 012편)
User devops not allowed because ... → 접근 제어로 거부(A영역 011편)
invalid user는 존재하지 않는 계정을 노린 것이라 계정 열거(071편)의 신호입니다. 반대로 Failed password for <실존계정>은 그 계정이 표적임을 의미합니다.Failed publickey가 많으면 키 기반 접근을 시도하는 것으로, 비밀번호 brute-force와 대응이 다릅니다.preauth 종료는 인증 시도조차 아닌 경우(스캔·배너 수집, A영역 034편)가 많아, brute-force 집계에서 분리해야 정확합니다.| 메시지 | 의미 | 대응 방향 |
|---|---|---|
Failed password for <user> | 실존 계정 비밀번호 실패 | 표적 계정 보호(072편) |
Failed password for invalid user / Invalid user | 존재하지 않는 계정 | 계정 열거(071편) |
Failed publickey | 키 인증 실패 | 미등록 키 접근 시도 |
Connection closed ... [preauth] | 인증 전 종료 | 스캔·배너(034편) |
Received disconnect ... [preauth] | 클라이언트 중단 | 자동화 도구 가능성 |
LOG=/var/log/secure # Ubuntu: /var/log/auth.log
# 1) 실패 메시지 유형별 집계
sudo grep -E 'Failed |Invalid user|preauth' $LOG | \
grep -oE 'Failed password for invalid user|Failed password for|Failed publickey for|Invalid user|closed by .* \[preauth\]|Received disconnect.*\[preauth\]' | \
sort | uniq -c | sort -rn
# 2) 실존 계정 대상 실패 vs invalid user 분리
echo "[실존 계정 실패]"; sudo grep 'Failed password for' $LOG | grep -v 'invalid user' | awk '{for(i=1;i<=NF;i++)if($i=="for"){print $(i+1);break}}' | sort | uniq -c | sort -rn | head
echo "[invalid user]"; sudo grep 'Failed password for invalid user' $LOG | awk '{for(i=1;i<=NF;i++)if($i=="user"){print $(i+1);break}}' | sort | uniq -c | sort -rn | head
3 Failed password for
1 closed by ... [preauth]
[실존 계정 실패]
3 admin1
실패가 소수이고, 실존 계정(admin1)의 간헐적 실패(비밀번호 오타 수준)만 있는 상태가 정상입니다.
120 Failed password for invalid user
95 Invalid user
40 Failed password for
30 Received disconnect ... [preauth]
[실존 계정 실패]
12 devops
10 admin1
[invalid user]
18 oracle
15 test
14 admin
invalid user 다수(oracle, test, admin) → 계정 열거(존재하는 계정을 찾는 중, 071편)preauth disconnect 다수 → 자동화 도구 사용 정황유형별로 나눠 본 실패 로그입니다(가상의 예시 로그).
02:10:20 sshd[12701]: Invalid user oracle from 192.168.56.77 port 40102
02:10:20 sshd[12701]: Failed password for invalid user oracle from 192.168.56.77 port 40102 ssh2
02:10:41 sshd[12710]: Failed password for devops from 192.168.56.77 port 50110 ssh2
02:10:44 sshd[12710]: Accepted password for devops from 192.168.56.77 port 50110 ssh2
| 관찰 | 해석 |
|---|---|
Invalid user oracle | oracle 계정 없음 → 열거 |
Failed ... for devops | devops는 실존 → 표적 확정 |
직후 Accepted for devops | 추측 성공(072편의 성공 직전 실패) |
같은 출발지에서 열거 → 실존 계정 추측 → 성공으로 이어지는 흐름이 한 로그 뭉치에 담겨 있습니다.
invalid user는 열거, 실존 계정 실패는 표적, preauth는 스캔으로 각각 다른 분석으로 넘긴다.<group name="local,syssec_b,authentication,">
<rule id="101180" level="5">
<decoded_as>sshd</decoded_as>
<match>Failed password for invalid user</match>
<description>존재하지 않는 계정 로그인 시도(계정 열거 가능성)</description>
</rule>
</group>
Wazuh 기본 룰셋에 실패(5710 invalid user, 5716 failed password 등)가 이미 있으므로, 유형 분리는 주로 대시보드 집계로 하고, 커스텀 룰은 상관(빈도·분산)에서 추가합니다(072·073편).
| 메시지 | 의미 |
|---|---|
| Failed password for | 실존 계정 비밀번호 실패(표적) |
| invalid user / Failed ... invalid user | 존재하지 않는 계정(열거) |
| Failed publickey | 미등록 키 접근 |
| closed/disconnect [preauth] | 인증 전 종료(스캔·배너) |
| 면접 포인트 | "실패를 유형별로 나눠야 열거·추측·스캔을 구분한다" |
다음 편 071. 계정 · 인증 보안 — invalid user와 계정 열거 시도 판별 에서는 실존 계정을 찾는 invalid user와 계정 열거 시도 판별을 깊게 다룹니다.
이전 편: 069. 계정 · 인증 보안 — SSH 인증 성공 로그 분석
📚 시리즈 전체 보기: 시스템 보안 · 취약점