059. 계정 · 인증 보안 — 비밀번호 정책 — pwquality 복잡도 설정

changseop lee·5일 전

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

선행 학습

1. 개념

비밀번호 복잡도 정책은 약한 비밀번호가 애초에 설정되지 못하게 막습니다. pam_pwquality(Rocky)·libpam-pwquality(Ubuntu)가 비밀번호 변경 시점에 검사합니다.

사용자가 passwd 로 비밀번호 변경
   ↓
PAM password 스택 → pam_pwquality.so
   ↓ /etc/security/pwquality.conf 기준 검사
 minlen(최소 길이) · minclass(문자 종류 수) · dcredit/ucredit/lcredit/ocredit
 maxrepeat(연속 반복) · dictcheck(사전 단어) · usercheck(계정명 포함)
   ↓
 통과 → pam_unix 로 해시 저장 / 실패 → "BAD PASSWORD: ..." 메시지

중요한 예외: root가 passwd 사용자로 바꿀 때는 정책 경고가 떠도 강제로 설정할 수 있습니다. 즉 정책이 있어도 관리자 권한이면 약한 비밀번호를 넣을 수 있습니다.

2. 왜 중요한가

  • 복잡도 정책은 brute-force·password spraying(072·073편)의 1차 방어선입니다. 약한 비밀번호가 없으면 추측 공격의 성공률이 크게 떨어집니다.
  • 정책을 약화시키면(minlen 축소, dictcheck=0) 이후 설정되는 비밀번호가 모두 약해집니다. login.defs(055편)와 함께 영향 범위가 넓은 변경입니다.
  • enforcing=0(pwquality.conf) 설정은 검사를 경고로만 바꿔 사실상 정책을 끕니다.

3. 핵심 명령어 / 설정

설정(/etc/security/pwquality.conf)의미
minlen최소 길이(가중치 반영된 값)
minclass필요한 문자 종류 수(소문자·대문자·숫자·특수)
dcredit/ucredit/lcredit/ocredit종류별 가산/감산(음수면 "최소 N개 필수")
maxrepeat동일 문자 연속 허용 수
dictcheck사전 단어 검사(1=검사)
usercheck계정명·GECOS 포함 검사
enforcing0이면 경고만(실질적 비활성화)
retry재시도 횟수

PAM 연결은 /etc/pam.d/system-auth(Rocky)·/etc/pam.d/common-password(Ubuntu)의 password ... pam_pwquality.so 줄에서 확인합니다.

4. 실습 (실습 예시)

# 1) 정책 값과 PAM 연결 확인
grep -vE '^\s*(#|$)' /etc/security/pwquality.conf
grep pam_pwquality /etc/pam.d/system-auth /etc/pam.d/common-password 2>/dev/null

# 2) 정책 동작 확인 (실측): 약한 비밀번호가 거부되는지
#    테스트 계정에 약한 비밀번호 변경을 시도해 "BAD PASSWORD" 메시지가 나오는지 본다
echo 'password' | passwd --stdin testuser 2>&1 | head   # Rocky(테스트 VM 전용, 결과만 확인)
#    → 정책이 살아있으면 거부 또는 경고

# 3) 기준선과 비교
sha256sum /etc/security/pwquality.conf

passwd --stdin은 테스트 VM에서 정책 동작을 확인하는 용도로만 쓰고, 실제 계정·운영 서버에는 사용하지 않습니다.

5. 정상 상태

minlen = 12
minclass = 3
maxrepeat = 3
dictcheck = 1
usercheck = 1
enforcing = 1
retry = 3
password requisite pam_pwquality.so try_first_pass local_users_only retry=3

길이·종류·사전 검사가 켜져 있고 enforcing=1인 상태가 정상입니다(값은 조직 정책 예시).

6. 이상 상태

minlen = 4
dictcheck = 0
usercheck = 0
enforcing = 0
$ sha256sum /etc/security/pwquality.conf
(기준선과 불일치)
  • 최소 길이 4, 사전·계정명 검사 해제, enforcing=0(경고만) → 사실상 복잡도 정책 무력화
  • 이후 설정되는 비밀번호가 모두 약해지므로, 변경 시각 이후 비밀번호를 바꾼 계정을 함께 점검해야 합니다(053편 shadow 변경일).

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

정책 파일 변경과 약한 비밀번호 설정 시도 로그입니다(가상의 예시 로그).

type=PATH msg=audit(1759341000.010:3801): item=0 name="/etc/security/pwquality.conf" nametype=NORMAL key="auth_conf"
type=SYSCALL msg=audit(1759341000.010:3801): syscall=257 success=yes auid=1002 uid=0 comm="vi" exe="/usr/bin/vi" key="auth_conf"
Oct  2 09:50:11 rocky9-web01 passwd[12001]: pam_pwquality(passwd:auth): The password fails the dictionary check - it is based on a dictionary word for user [testuser]
Oct  2 09:50:30 rocky9-web01 passwd[12005]: pam_unix(passwd:chauthtok): password changed for testuser
관찰해석
pwquality.conf 수정(auth_conf 키)복잡도 정책 변경
fails the dictionary check정책이 약한 비밀번호를 거부한 정상 동작(변경 전)
이후 password changed정책 약화 후 같은 비밀번호가 통과

BAD PASSWORD/pam_pwquality 메시지에는 비밀번호 원문이 포함되지 않으며, 분석에서도 원문을 다루지 않습니다.

8. SOC 관제 포인트

  • pwquality.conf와 PAM password 스택을 auth_conf 키·FIM으로 감시하고 값을 기준선에 넣습니다.
  • enforcing=0, minlen 축소, dictcheck=0은 정책 무력화로 보고 높은 우선순위로 처리합니다.
  • 정책 약화 이후 비밀번호를 변경한 계정 목록을 함께 뽑아 재설정 대상으로 관리합니다.

9. 탐지 규칙

<group name="local,syssec_b,account,">
  <rule id="101080" level="11">
    <if_sid>550</if_sid>
    <field name="file">^/etc/security/pwquality.conf$</field>
    <description>비밀번호 복잡도 정책(pwquality) 변경</description>
  </rule>
</group>

pwquality.conf 변경 Alert에 report_changes="yes"를 적용하면 enforcing=0·minlen 같은 구체적 약화 내용이 함께 표시되어, 단순 변경과 무력화를 구분할 수 있습니다.

10. 대응 방법

  1. 초기 확인 — 변경된 정책 항목과 시각·행위자, 이후 비밀번호를 바꾼 계정을 확인합니다.
  2. 범위 확인 — 같은 변경이 다른 서버에도 적용됐는지 확인합니다.
  3. 증거 확보 — pwquality.conf 사본·FIM diff, 관련 passwd 로그를 보존합니다.
  4. 차단/조치 — 정책을 복원하고 약한 정책 구간에 설정된 비밀번호를 재설정하도록 안내합니다.
  5. 재발 방지 — 복잡도 정책 값을 기준선·자체 점검(A영역 044편)에 포함합니다.

11. 핵심 정리

설정의미
minlen / minclass최소 길이 / 문자 종류 수
dictcheck / usercheck사전 단어 / 계정명 포함 검사
enforcing0이면 경고만(실질적 비활성화)
예외root의 passwd 강제 설정은 정책 우회 가능
면접 포인트"복잡도 정책은 brute-force의 1차 방어선 — 약화 = 영향 범위 넓음"

12. 다음 편 예고

다음 편 060. 계정 · 인증 보안 — 비밀번호 만료·변경 주기 — chage 점검 에서는 비밀번호의 수명을 관리하는 만료·변경 주기(chage) 점검을 다룹니다.


이전 편: 058. 계정 · 인증 보안 — su 사용 로그와 권한 전환 추적
📚 시리즈 전체 보기: 시스템 보안 · 취약점

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

0개의 댓글