시스템 보안 · 취약점 › B. 계정 · 인증 보안 강화 · 11/50편 (전체 061/450)
학습 단계: 2단계 · 설정 및 점검
실습 표기: 이 글의 명령어·출력·로그는 로컬 VMware 테스트 VM(Rocky Linux 9 / Ubuntu 22.04) 기준의 「실습 예시」이며, IP·계정·호스트명은 가상의 값입니다.
만료 정책(060편)으로 비밀번호를 주기적으로 바꾸게 해도, 사용자가 같은 비밀번호로 되돌리면 효과가 없습니다. pam_pwhistory는 이전에 쓴 비밀번호 N개를 기억해 재사용을 막습니다.
passwd 변경 → PAM password 스택
├─ pam_pwhistory.so remember=5 → 최근 5개와 비교, 같으면 거부
└─ 이전 해시 저장 위치: /etc/security/opasswd (root 전용)
opasswd 한 줄: devops:1002:5:<해시1>,<해시2>,... (쉼표로 이력 해시 나열)
remember 값이 이력 개수이며, 이력은 opasswd에 해시로만 저장됩니다(원문 없음).
password1 → password2 → 다시 password1처럼 돌려쓸 수 있어, 유출된 비밀번호가 계속 유효할 수 있습니다.opasswd를 지우거나 remember를 0으로 바꾸면, 탈취한 옛 비밀번호를 다시 설정해 접근을 유지할 수 있습니다.opasswd에는 과거 해시가 모여 있어, 파일 자체가 유출되면 크래킹 대상이 늘어납니다. 접근 권한(600 root) 점검도 함께 필요합니다.| 항목 | 확인 |
|---|---|
| pam_pwhistory 연결·remember | grep pwhistory /etc/pam.d/system-auth /etc/pam.d/common-password |
| opasswd 존재·권한 | sudo stat -c '%a %U:%G %n' /etc/security/opasswd |
| 이력 보유 계정 수 | sudo awk -F: '{print $1, NF}' /etc/security/opasswd (원문 출력 금지) |
| 정책 동작 | 테스트 VM에서 직전 비밀번호로 변경 시도 → 거부 확인 |
# 1) 설정 확인
grep -n 'pam_pwhistory' /etc/pam.d/system-auth /etc/pam.d/common-password 2>/dev/null
sudo stat -c '%a %U:%G %n' /etc/security/opasswd 2>/dev/null
# 2) 이력 계정 수만 확인 (해시 원문은 보지 않음)
sudo awk -F: '{print $1": 이력 "gsub(/,/,",",$NF)+1"개"}' /etc/security/opasswd 2>/dev/null | head
# 3) 기준선: 설정 줄과 opasswd 권한만 기록
grep -h pam_pwhistory /etc/pam.d/system-auth 2>/dev/null
sudo stat -c '%a' /etc/security/opasswd
opasswd는 해시 모음이므로 내용을 출력·복사하지 않고, 존재·권한·계정 수만 확인합니다.
password requisite pam_pwhistory.so use_authtok remember=5 retry=3
$ sudo stat -c '%a %U:%G %n' /etc/security/opasswd
600 root:root /etc/security/opasswd
remember가 설정되어 있고 opasswd 권한이 600 root인 상태가 정상입니다.
$ grep pam_pwhistory /etc/pam.d/system-auth
(출력 없음)
$ sudo stat -c '%a %U:%G %n' /etc/security/opasswd
644 root:root /etc/security/opasswd
pam_pwhistory 줄이 사라짐 → 재사용 제한 해제opasswd 권한이 644 → 일반 사용자가 과거 해시를 읽을 수 있음(정보 노출)이력 기능 우회 흔적입니다(가상의 예시 로그).
type=PATH msg=audit(1759341200.010:4001): item=0 name="/etc/pam.d/system-auth" nametype=NORMAL key="auth_conf"
type=SYSCALL msg=audit(1759341200.010:4001): syscall=257 success=yes auid=1002 uid=0 comm="vi" exe="/usr/bin/vi" key="auth_conf"
type=SYSCALL msg=audit(1759341260.200:4005): syscall=87 success=yes auid=1002 uid=0 comm="rm" exe="/usr/bin/rm" key="auth_conf"
type=PATH msg=audit(1759341260.200:4005): item=1 name="/etc/security/opasswd" nametype=DELETE
Oct 2 02:54:40 rocky9-web01 passwd[12201]: pam_unix(passwd:chauthtok): password changed for devops
| 관찰 | 해석 |
|---|---|
system-auth 수정(auth_conf) | pam_pwhistory 제거 |
opasswd 삭제(syscall=87 unlink) | 이력 초기화 → 옛 비밀번호 재사용 가능 |
이후 password changed | 제한 해제 후 비밀번호 변경(옛 값 복원 가능성) |
opasswd 삭제·권한 변경, PAM password 스택에서 pam_pwhistory 제거를 감시합니다.opasswd는 해시 모음이므로 FIM 대상이되 <nodiff>로 내용은 Alert에 넣지 않습니다.<group name="local,syssec_b,account,">
<rule id="101100" level="11">
<if_group>audit</if_group>
<field name="audit.key">auth_conf</field>
<match>name="/etc/security/opasswd"</match>
<regex type="pcre2">nametype=DELETE|nametype=CREATE</regex>
<description>비밀번호 이력 파일(opasswd) 삭제/재생성</description>
</rule>
</group>
PAM 스택 파일(system-auth, common-password)의 변경은 101110(다음 편)의 PAM 변조 룰과 함께 운영합니다.
| 구분 | 핵심 내용 |
|---|---|
| 기능 | 최근 N개 비밀번호 재사용 차단 |
| 저장 | /etc/security/opasswd (해시, 600 root) |
| 우회 | pam_pwhistory 제거, opasswd 삭제, remember=0 |
| 탐지 | PAM password 스택 변경 + opasswd 삭제/권한 변화 |
| 면접 포인트 | "만료만 걸고 재사용 제한이 없으면 옛 비밀번호로 되돌릴 수 있다" |
다음 편 062. 계정 · 인증 보안 — PAM 스택 구조와 control flag 해석 에서는 인증 동작 전체를 좌우하는 PAM 스택 구조와 control flag 해석을 다룹니다.
이전 편: 060. 계정 · 인증 보안 — 비밀번호 만료·변경 주기 — chage 점검
📚 시리즈 전체 보기: 시스템 보안 · 취약점