시스템 보안 · 취약점 › B. 계정 · 인증 보안 강화 · 9/50편 (전체 059/450)
학습 단계: 2단계 · 설정 및 점검
실습 표기: 이 글의 명령어·출력·로그는 로컬 VMware 테스트 VM(Rocky Linux 9 / Ubuntu 22.04) 기준의 「실습 예시」이며, IP·계정·호스트명은 가상의 값입니다.
비밀번호 복잡도 정책은 약한 비밀번호가 애초에 설정되지 못하게 막습니다. 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 사용자로 바꿀 때는 정책 경고가 떠도 강제로 설정할 수 있습니다. 즉 정책이 있어도 관리자 권한이면 약한 비밀번호를 넣을 수 있습니다.
minlen 축소, dictcheck=0) 이후 설정되는 비밀번호가 모두 약해집니다. login.defs(055편)와 함께 영향 범위가 넓은 변경입니다.enforcing=0(pwquality.conf) 설정은 검사를 경고로만 바꿔 사실상 정책을 끕니다.설정(/etc/security/pwquality.conf) | 의미 |
|---|---|
minlen | 최소 길이(가중치 반영된 값) |
minclass | 필요한 문자 종류 수(소문자·대문자·숫자·특수) |
dcredit/ucredit/lcredit/ocredit | 종류별 가산/감산(음수면 "최소 N개 필수") |
maxrepeat | 동일 문자 연속 허용 수 |
dictcheck | 사전 단어 검사(1=검사) |
usercheck | 계정명·GECOS 포함 검사 |
enforcing | 0이면 경고만(실질적 비활성화) |
retry | 재시도 횟수 |
PAM 연결은 /etc/pam.d/system-auth(Rocky)·/etc/pam.d/common-password(Ubuntu)의 password ... pam_pwquality.so 줄에서 확인합니다.
# 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에서 정책 동작을 확인하는 용도로만 쓰고, 실제 계정·운영 서버에는 사용하지 않습니다.
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인 상태가 정상입니다(값은 조직 정책 예시).
minlen = 4
dictcheck = 0
usercheck = 0
enforcing = 0
$ sha256sum /etc/security/pwquality.conf
(기준선과 불일치)
enforcing=0(경고만) → 사실상 복잡도 정책 무력화정책 파일 변경과 약한 비밀번호 설정 시도 로그입니다(가상의 예시 로그).
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 메시지에는 비밀번호 원문이 포함되지 않으며, 분석에서도 원문을 다루지 않습니다.
pwquality.conf와 PAM password 스택을 auth_conf 키·FIM으로 감시하고 값을 기준선에 넣습니다.enforcing=0, minlen 축소, dictcheck=0은 정책 무력화로 보고 높은 우선순위로 처리합니다.<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 같은 구체적 약화 내용이 함께 표시되어, 단순 변경과 무력화를 구분할 수 있습니다.
| 설정 | 의미 |
|---|---|
| minlen / minclass | 최소 길이 / 문자 종류 수 |
| dictcheck / usercheck | 사전 단어 / 계정명 포함 검사 |
| enforcing | 0이면 경고만(실질적 비활성화) |
| 예외 | root의 passwd 강제 설정은 정책 우회 가능 |
| 면접 포인트 | "복잡도 정책은 brute-force의 1차 방어선 — 약화 = 영향 범위 넓음" |
다음 편 060. 계정 · 인증 보안 — 비밀번호 만료·변경 주기 — chage 점검 에서는 비밀번호의 수명을 관리하는 만료·변경 주기(chage) 점검을 다룹니다.
이전 편: 058. 계정 · 인증 보안 — su 사용 로그와 권한 전환 추적
📚 시리즈 전체 보기: 시스템 보안 · 취약점