시스템 보안 · 취약점 › B. 계정 · 인증 보안 강화 · 15/50편 (전체 065/450)
학습 단계: 2단계 · 설정 및 점검
실습 표기: 이 글의 명령어·출력·로그는 로컬 VMware 테스트 VM(Rocky Linux 9 / Ubuntu 22.04) 기준의 「실습 예시」이며, IP·계정·호스트명은 가상의 값입니다.
잠금 Alert가 울렸을 때, 관제원은 이것이 공격인지, 사용자 실수인지, 정상 사용자를 막으려는 방해인지를 구분해야 합니다. 판단 기준은 잠금 이벤트의 분포입니다.
잠금 이벤트의 세 가지 그림
① brute-force : 한 출발지 → 한 계정 집중 실패 → 잠금 (공격)
② 사용자 실수 : 관리망 출발지 → 본인 계정 → 업무 시간 (실수)
③ 계정 열거/분산 : 한 출발지 → 여러 계정 각각 실패 → 다수 잠금 (스프레이·열거, 073편)
④ 의도적 잠금(DoS) : 공격자가 정상 계정을 일부러 반복 실패시켜 잠금 → 업무 방해
같은 "계정 잠금" 로그라도 출발지 × 대상 계정 수 × 시간대를 보면 그림이 달라집니다.
| 확인 | 명령 |
|---|---|
| 잠금 이벤트 추출 | sudo grep 'temporarily locked|limit reached' /var/log/secure |
| 계정별 실패 출발지 | sudo faillock --user 계정 (Source 열) |
| 실패 로그 집계 | sudo grep 'Failed password' /var/log/secure | awk '{print $(NF-3), $9}' | sort | uniq -c |
| 잠금 대상 계정 수 | 잠금 로그에서 고유 계정 수 |
| 수동 해제 | sudo faillock --user 계정 --reset (대응 후) |
LOG=/var/log/secure # Ubuntu: /var/log/auth.log
# 1) 잠금 이벤트의 계정·시각
sudo grep -E 'temporarily locked|limit reached' $LOG | tail -20
# 2) 실패를 출발지 기준으로 집계 (공격 출발지 식별)
sudo grep 'Failed password' $LOG | grep -oE 'from [0-9.]+' | sort | uniq -c | sort -rn | head
# 3) 출발지 1개가 여러 계정을 노렸는지 (스프레이/열거 판별)
sudo grep 'Failed password' $LOG | awk '/from 192.168.56.77/{for(i=1;i<=NF;i++) if($i=="for"){print $(i+1)}}' | sort | uniq -c
Oct 2 11:20:03 rocky9-web01 ... User admin1 has 5 login failures, limit reached
$ sudo faillock --user admin1
admin1:
When Type Source Valid
2026-10-02 11:19:40 RHOST 192.168.56.5 V (x5)
관리망 출발지, 본인 계정, 업무 시간, 단일 계정 → 사용자 실수로 판단되는 전형입니다. 본인 확인 후 해제합니다.
$ sudo grep -E 'temporarily locked' $LOG | grep '02:'
02:10:40 ... user devops account temporarily locked
02:11:55 ... user admin1 account temporarily locked
02:13:10 ... user oracle account temporarily locked
$ sudo grep 'Failed password' $LOG | awk '/from 192.168.56.77/{...}' | sort | uniq -c
6 devops
5 admin1
5 oracle
5 root
oracle 같은 존재하지 않을 수 있는 흔한 계정명 포함 → 계정 열거(071편)잠금 이벤트를 출발지 기준으로 재정렬한 분석 예시입니다(가상의 예시).
출발지 192.168.56.77 (02:10~02:14)
devops : 실패 6 → 잠금
admin1 : 실패 5 → 잠금
oracle : 실패 5 → 잠금 (invalid user)
root : 실패 5 (root는 PermitRootLogin no로 인증 전 차단)
→ 한 출발지가 다계정 공략 = 스프레이/열거, 공격 출발지는 192.168.56.77
| 판단 축 | 이 사례 |
|---|---|
| 출발지 | 단일, 비관리망 → 차단 대상 |
| 대상 계정 수 | 4개(다수) → 스프레이/열거 |
| 시간대 | 새벽 → 공격 |
| 성공 여부 | 072편의 "성공 직전 실패"로 교차 확인 |
<group name="local,syssec_b,authentication,">
<!-- 한 출발지가 여러 계정을 잠금에 이르게 함 (스프레이) -->
<rule id="101130" level="12" frequency="3" timeframe="300">
<if_matched_sid>101120</if_matched_sid>
<same_source_ip />
<different_user />
<description>단일 출발지의 다계정 잠금(password spraying 의심)</description>
</rule>
</group>
different_user(여러 계정 조건)는 Wazuh 버전에 따라 지원·필드가 다르므로, 지원하지 않으면 SIEM 집계(출발지별 고유 계정 수)로 대체합니다.
| 그림 | 특징 / 대응 |
|---|---|
| brute-force | 단일 출발지 → 단일 계정 집중 / 출발지 차단 |
| 사용자 실수 | 관리망·본인 계정·업무 시간 / 본인 확인 후 해제 |
| 스프레이·열거 | 단일 출발지 → 다계정 / 출발지 차단(073편) |
| 의도적 잠금(DoS) | 정상 계정 반복 잠금 / 출발지 차단 + 사용자 안내 |
| 면접 포인트 | "잠금은 출발지×계정 수×시간대로 공격/실수/DoS를 구분" |
다음 편 066. 계정 · 인증 보안 — SSH 공개키 인증 구조와 authorized_keys 점검 에서는 키 기반 접근을 점검하는 SSH 공개키 인증 구조와 authorized_keys를 다룹니다.
이전 편: 064. 계정 · 인증 보안 — 계정 잠금 — pam_faillock 설정과 해제
📚 시리즈 전체 보기: 시스템 보안 · 취약점