065. 계정 · 인증 보안 — faillock 로그 분석과 잠금 이벤트 대응

changseop lee·5일 전

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

선행 학습

1. 개념

잠금 Alert가 울렸을 때, 관제원은 이것이 공격인지, 사용자 실수인지, 정상 사용자를 막으려는 방해인지를 구분해야 합니다. 판단 기준은 잠금 이벤트의 분포입니다.

잠금 이벤트의 세 가지 그림
 ① brute-force     : 한 출발지 → 한 계정 집중 실패 → 잠금 (공격)
 ② 사용자 실수      : 관리망 출발지 → 본인 계정 → 업무 시간 (실수)
 ③ 계정 열거/분산   : 한 출발지 → 여러 계정 각각 실패 → 다수 잠금 (스프레이·열거, 073편)
 ④ 의도적 잠금(DoS) : 공격자가 정상 계정을 일부러 반복 실패시켜 잠금 → 업무 방해

같은 "계정 잠금" 로그라도 출발지 × 대상 계정 수 × 시간대를 보면 그림이 달라집니다.

2. 왜 중요한가

  • 잠금을 무조건 "공격"으로 올리면 사용자 실수에 과잉 대응하고, 무조건 "실수"로 닫으면 brute-force를 놓칩니다.
  • 공격자가 정상 계정을 일부러 잠그는 DoS는 피해자가 정상 사용자라, 차단 대상(출발지)과 보호 대상(계정)을 구분해야 합니다.
  • 잠금 분석은 072·073편의 brute-force/스프레이 분석의 입력이 됩니다.

3. 핵심 명령어 / 설정

확인명령
잠금 이벤트 추출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 (대응 후)

4. 실습 (실습 예시)

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

5. 정상 상태

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)

관리망 출발지, 본인 계정, 업무 시간, 단일 계정 → 사용자 실수로 판단되는 전형입니다. 본인 확인 후 해제합니다.

6. 이상 상태

$ 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
  • 한 출발지(192.168.56.77)가 여러 계정을 각각 5~6회 실패 → password spraying/열거(073편)
  • oracle 같은 존재하지 않을 수 있는 흔한 계정명 포함 → 계정 열거(071편)
  • 새벽 시간대 + 비관리망 → 사용자 실수와 명확히 구분됨

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

잠금 이벤트를 출발지 기준으로 재정렬한 분석 예시입니다(가상의 예시).

출발지 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편의 "성공 직전 실패"로 교차 확인

8. SOC 관제 포인트

  • 잠금 Alert는 출발지 × 대상 계정 수 × 시간대로 즉시 분류합니다.
  • 다계정 잠금은 스프레이/열거로 보고 출발지를 차단, 단일 계정·관리망·업무 시간은 본인 확인 후 해제합니다.
  • DoS 의심(정상 계정 반복 잠금)이면 출발지 차단과 함께 해당 계정 사용자에게 안내합니다.

9. 탐지 규칙

<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 집계(출발지별 고유 계정 수)로 대체합니다.

10. 대응 방법

  1. 초기 확인 — 잠금 이벤트를 출발지·대상 계정·시간으로 정렬해 그림을 분류합니다.
  2. 범위 확인 — 공격 출발지의 성공 로그 유무(072편)와 다른 서버 시도를 확인합니다.
  3. 증거 확보 — 잠금·실패 로그, faillock 현황을 보존합니다.
  4. 차단/조치 — 공격이면 출발지 차단·대상 계정 점검, 실수면 본인 확인 후 해제, DoS면 출발지 차단 후 사용자 안내.
  5. 재발 방지 — 잠금 분류 기준과 다계정 잠금 상관 룰을 운영합니다.

11. 핵심 정리

그림특징 / 대응
brute-force단일 출발지 → 단일 계정 집중 / 출발지 차단
사용자 실수관리망·본인 계정·업무 시간 / 본인 확인 후 해제
스프레이·열거단일 출발지 → 다계정 / 출발지 차단(073편)
의도적 잠금(DoS)정상 계정 반복 잠금 / 출발지 차단 + 사용자 안내
면접 포인트"잠금은 출발지×계정 수×시간대로 공격/실수/DoS를 구분"

12. 다음 편 예고

다음 편 066. 계정 · 인증 보안 — SSH 공개키 인증 구조와 authorized_keys 점검 에서는 키 기반 접근을 점검하는 SSH 공개키 인증 구조와 authorized_keys를 다룹니다.


이전 편: 064. 계정 · 인증 보안 — 계정 잠금 — pam_faillock 설정과 해제
📚 시리즈 전체 보기: 시스템 보안 · 취약점

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

0개의 댓글