시스템 보안 · 취약점 › B. 계정 · 인증 보안 강화 · 13/50편 (전체 063/450)
학습 단계: 2단계 · 설정 및 점검
실습 표기: 이 글의 명령어·출력·로그는 로컬 VMware 테스트 VM(Rocky Linux 9 / Ubuntu 22.04) 기준의 「실습 예시」이며, IP·계정·호스트명은 가상의 값입니다.
PAM은 인증의 관문이므로, 공격자가 지속성·우회를 위해 노리는 대표 지점입니다. 변조는 두 가지 형태로 나뉩니다.
① 설정 변조 : /etc/pam.d/* 또는 system-auth 에 pam_permit, nullok 추가
→ 비밀번호 없이/틀려도 통과 (062편 우회 패턴)
② 모듈 변조 : /usr/lib64/security/*.so (Rocky) / /lib/x86_64-linux-gnu/security/*.so (Ubuntu)
- 정상 모듈 교체(해시 변경)
- 악성 .so 추가 후 스택에 삽입
→ 모든 인증을 통과시키거나 입력 자격증명을 외부에 기록
설정 변조는 텍스트라 FIM diff로 바로 보이지만, 모듈(.so) 변조는 바이너리 무결성 검증(A영역 025편)이 필요합니다.
| 점검 | 명령 |
|---|---|
| 설정 변조 | grep -rnE 'pam_permit.so|nullok|pam_exec.so' /etc/pam.d/ |
| 모듈 목록·시각 | ls -la --time-style=long-iso /usr/lib64/security/ (Ubuntu: /lib/x86_64-linux-gnu/security/) |
| 모듈 무결성 | rpm -Vf /usr/lib64/security/pam_unix.so / dpkg -V libpam-modules |
| 패키지 미소속 모듈 | 각 .so에 rpm -qf/dpkg -S → "not owned" |
| 최근 변경 모듈 | find <모듈경로> -name '*.so' -mtime -7 |
MODDIR=/usr/lib64/security # Ubuntu: /lib/x86_64-linux-gnu/security
# 1) 설정 변조 패턴
grep -rnE 'pam_permit\.so|nullok|pam_exec\.so|pam_python' /etc/pam.d/
# 2) 모듈 무결성 (패키지 기준 검증)
rpm -Vf $MODDIR/*.so 2>/dev/null | grep -vE '^\.\.\.\.\.\.\.\.\.' # 변경된 것만
# Ubuntu: dpkg -V libpam-modules libpam-modules-bin
# 3) 패키지에 속하지 않은 .so 찾기
for f in $MODDIR/*.so; do rpm -qf "$f" >/dev/null 2>&1 || echo "NOT-OWNED $f"; done # Ubuntu: dpkg -S
# 4) 최근 변경된 모듈
find $MODDIR -name '*.so' -mtime -7 -printf '%TY-%Tm-%Td %TH:%TM %p\n'
$ grep -rnE 'pam_permit|nullok|pam_exec' /etc/pam.d/
/etc/pam.d/postlogin:... pam_exec ... # 배포판 기본 사용처(정상)
$ rpm -Vf /usr/lib64/security/*.so | grep -vE '^\.{9}'
$ for f in $MODDIR/*.so; do ...; done
$ find $MODDIR -name '*.so' -mtime -7
$
설정에 비정상 패턴이 없고, 모든 모듈이 패키지 검증을 통과하며, 최근 변경된 모듈이 없는 상태가 정상입니다(pam_exec의 기본 사용처는 배포판 문서로 확인).
$ grep -rn pam_permit /etc/pam.d/
/etc/pam.d/sshd:3:auth sufficient pam_permit.so
$ rpm -Vf /usr/lib64/security/pam_unix.so | grep pam_unix
S.5....T. /usr/lib64/security/pam_unix.so
$ for f in $MODDIR/*.so; do ...; done
NOT-OWNED /usr/lib64/security/pam_sysmon.so
pam_permit.so sufficient → 인증 우회(062편 패턴)pam_unix.so 해시 변경 → 핵심 인증 모듈 교체 (출력을 신뢰할 수 없으므로 외부 기준과 비교)pam_sysmon.so → 악성 모듈 추가 의심PAM 변조 흔적입니다(가상의 예시 로그).
type=PATH msg=audit(1759341500.010:4101): item=1 name="/usr/lib64/security/pam_sysmon.so" nametype=CREATE key="pam_module"
type=SYSCALL msg=audit(1759341500.010:4101): syscall=257 success=yes auid=1002 uid=0 comm="cp" exe="/usr/bin/cp" key="pam_module"
type=PATH msg=audit(1759341520.100:4105): item=0 name="/etc/pam.d/sshd" nametype=NORMAL key="auth_conf"
** Wazuh FIM
File '/usr/lib64/security/pam_unix.so' modified. Mode: realtime
Size changed / SHA256 changed
| 관찰 | 해석 |
|---|---|
모듈 디렉터리에 .so 생성(pam_module 키) | 악성 모듈 추가 |
pam_unix.so 해시 변경(FIM) | 정상 모듈 교체 |
직후 /etc/pam.d/sshd 수정 | 추가·교체한 모듈을 스택에 연결 |
변조된 PAM은 인증 성공 로그가 정상처럼 남으므로, 파일 변경 이벤트가 사실상 유일한 조기 신호입니다.
/etc/pam.d/를 realtime FIM으로 감시합니다(패키지 업데이트 시각과 대조)..so, 핵심 모듈 해시 변경은 최상위 우선순위로 처리합니다.<group name="local,syssec_b,pam,audit_tamper,">
<rule id="101110" level="13">
<if_sid>550,554</if_sid>
<field name="file" type="pcre2">/security/pam_\S+\.so$</field>
<description>PAM 모듈(.so) 변경/추가: 인증 백도어 의심</description>
</rule>
<rule id="101111" level="12">
<if_sid>550</if_sid>
<field name="file" type="pcre2">^/etc/pam\.d/</field>
<description>PAM 설정 파일 변경</description>
</rule>
</group>
FIM이 모듈 디렉터리를 감시하도록 agent syscheck에 해당 경로를 추가해야 합니다. 패키지 업데이트로 인한 대량 변경은 048편 방식으로 정탐/정상 구분합니다.
| 변조 유형 | 탐지 수단 |
|---|---|
| 설정 변조(pam_permit, nullok) | grep, /etc/pam.d FIM |
| 모듈 추가(미소속 .so) | rpm -qf/dpkg -S, 모듈 디렉터리 FIM |
| 모듈 교체(해시 변경) | rpm -Vf/dpkg -V, FIM |
| 공통 | 인증 성공 로그는 정상처럼 남음 → 파일 변경이 조기 신호 |
| 면접 포인트 | "PAM 백도어는 로그가 깨끗하다 — 무결성 검증이 유일한 조기 탐지" |
다음 편 064. 계정 · 인증 보안 — 계정 잠금 — pam_faillock 설정과 해제 에서는 반복 실패를 막는 계정 잠금(pam_faillock) 설정과 해제를 다룹니다.
이전 편: 062. 계정 · 인증 보안 — PAM 스택 구조와 control flag 해석
📚 시리즈 전체 보기: 시스템 보안 · 취약점