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

선행 학습

1. 개념

password spraying은 brute-force의 반대 모양입니다. 한 계정에 많은 비밀번호를 넣는 대신, 흔한 비밀번호 하나를 많은 계정에 뿌립니다. 계정당 시도가 적어 계정 잠금(faillock)을 피합니다.

brute-force:   devops ← pw1,pw2,pw3,...,pw220   (1계정 × 다수 시도) → 잠금 발동
spraying:      pw1 → devops, admin1, oracle, git, ...(50계정 × 2~3 시도) → 잠금 회피
   │
   └─ 탐지 포인트: "한 출발지가 많은 계정에, 계정당 적게" + 시간 분산

brute-force가 "깊게", spraying이 "넓게"입니다. 계정당 실패 수가 적어 개별 계정만 보면 정상처럼 보입니다.

2. 왜 중요한가

  • 계정당 시도가 잠금 임계값(예: 5회) 미만이면 faillock이 동작하지 않습니다. 계정 단위 탐지로는 놓칩니다.
  • 조직에 약한 비밀번호를 쓰는 계정이 하나라도 있으면 spraying은 성공합니다. 복잡도 정책(059편)의 중요성이 여기서 드러납니다.
  • 탐지하려면 출발지(또는 시간 창) 기준으로 계정을 가로질러 집계해야 합니다.

3. 핵심 명령어 / 설정

지표명령
출발지별 고유 대상 계정 수출발지별 distinct user 집계
계정당 실패 수 분포대부분 1~3회면 spraying 의심
시간 분산넓은 시간에 걸쳐 조금씩
동시 다계정 실패같은 분에 여러 계정 실패
성공 계정spraying 중 성공한 계정(약한 비밀번호)

4. 실습 (실습 예시)

LOG=/var/log/secure        # Ubuntu: /var/log/auth.log
# 1) 출발지별 "고유 대상 계정 수" (스프레이 핵심 지표)
sudo grep 'Failed password' $LOG | sed -E 's/.*for (invalid user )?([^ ]+) from ([0-9.]+).*/\3 \2/' | sort -u | awk '{c[$1]++} END{for(i in c) print c[i]" accounts "i}' | sort -rn | head

# 2) 특정 출발지의 계정별 실패 수 (대부분 소수면 spraying)
sudo grep 'Failed password' $LOG | grep 'from 192.168.56.77' | grep -oE 'for [^ ]+' | sort | uniq -c | sort -rn | head

# 3) spraying 중 성공한 계정
sudo grep 'Accepted' $LOG | grep 'from 192.168.56.77'

5. 정상 상태

2 accounts 192.168.56.5
$ (계정별 실패) 1 admin1

출발지별 대상 계정이 1~2개로 좁고 계정당 소수 실패 → 정상(오타) 범위입니다.

6. 이상 상태

52 accounts 192.168.56.77
$ (계정별 실패)
      3 devops
      2 admin1
      2 oracle
      2 git
      ...
$ (성공) Accepted password for svc_deploy from 192.168.56.77
  • 한 출발지가 52개 계정을 대상, 계정당 2~3회 → 잠금 회피형 spraying
  • 계정당 실패가 적어 faillock 미발동 → 계정 단위로는 안 보임
  • svc_deploy 계정 성공 → 약한 비밀번호 계정이 뚫림(059편 정책 부재 결과)

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

spraying의 전형적 로그 분포입니다(가상의 예시 로그).

02:15:01 Failed password for devops from 192.168.56.77
02:15:02 Failed password for admin1 from 192.168.56.77
02:15:03 Failed password for oracle from 192.168.56.77
02:15:04 Failed password for git from 192.168.56.77
...
02:15:48 Accepted password for svc_deploy from 192.168.56.77
관찰해석
1초 간격, 계정만 바뀜한 비밀번호를 계정마다 시도
계정당 1~3회잠금 임계값 미만
끝에 1계정 성공약한 비밀번호 계정 돌파

brute-force(한 계정 반복)와 로그 모양이 명확히 다릅니다. 세로(계정)로 퍼지는지, 가로(비밀번호)로 깊어지는지가 구분점입니다.

8. SOC 관제 포인트

  • spraying은 출발지별 고유 계정 수로 탐지합니다(계정 단위 탐지로는 놓침).
  • 계정당 실패가 적어도 대상 계정이 많으면 Alert합니다.
  • spraying 중 성공한 계정은 즉시 탈취 대응 + 복잡도 정책 점검으로 연결합니다.

9. 탐지 규칙

<group name="local,syssec_b,authentication,">
  <rule id="101210" level="12" frequency="15" timeframe="300">
    <if_matched_sid>5716</if_matched_sid>
    <same_source_ip />
    <different_user />
    <description>단일 출발지의 다계정 인증 실패(password spraying 의심)</description>
  </rule>
</group>

different_user(여러 계정 조건)를 Wazuh가 지원하지 않으면, SIEM에서 출발지별 distinct user count ≥ N 집계 알림으로 구현합니다. brute-force 룰(빈도)과 spraying 룰(계정 다양성)은 조건이 반대임에 유의합니다.

10. 대응 방법

  1. 초기 확인 — 출발지별 고유 대상 계정 수와 계정당 실패 분포로 spraying을 확인합니다.
  2. 범위 확인 — spraying 중 성공한 계정과 다른 서버의 동일 출발지 활동을 확인합니다.
  3. 증거 확보 — 실패·성공 로그, 출발지×계정 집계를 보존합니다.
  4. 차단/조치 — 출발지 차단, 성공 계정 탈취 대응, 약한 비밀번호 계정 전수 점검을 진행합니다.
  5. 재발 방지 — 출발지 기준 다계정 실패 상관 룰과 복잡도 정책 점검을 운영합니다.

11. 핵심 정리

구분brute-force vs spraying
모양1계정×다수 시도 vs 다계정×소수 시도
잠금발동(brute) vs 회피(spraying)
탐지 기준계정별 빈도 vs 출발지별 고유 계정 수
공통성공 계정이 있으면 즉시 탈취 대응
면접 포인트"spraying은 계정당 적게 뿌려 잠금을 피한다 → 출발지 기준으로 봐야 보인다"

12. 다음 편 예고

다음 편 074. 계정 · 인증 보안 — 성공 직전 실패 패턴 — 인증 돌파 판단 에서는 공격의 성패를 가르는 성공 직전 실패 패턴 — 인증 돌파 판단을 다룹니다.


이전 편: 072. 계정 · 인증 보안 — brute-force 징후 — 빈도·분포 분석
📚 시리즈 전체 보기: 시스템 보안 · 취약점

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

0개의 댓글