062. 계정 · 인증 보안 — PAM 스택 구조와 control flag 해석

changseop lee·5일 전

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

선행 학습

1. 개념

PAM(Pluggable Authentication Modules)은 "로그인·인증을 어떻게 검사할지"를 모듈을 쌓아(stack) 결정합니다. 각 줄은 타입 control flag 모듈 [인자] 구조입니다.

auth     required   pam_faillock.so preauth
auth     sufficient pam_unix.so try_first_pass nullok
auth     required   pam_faillock.so authfail
auth     required   pam_deny.so
 │         │          │
타입      control    모듈
타입언제 동작
auth신원 확인(비밀번호·키)
account계정 유효성(만료·잠금·접근 제어)
password비밀번호 변경 시 검증
session세션 시작/종료(환경·로그·limits)
control flag의미
required실패해도 스택은 계속 진행하되 최종 실패(실패 사실을 숨기지 않음)
requisite실패 즉시 중단·실패 반환
sufficient성공하면 즉시 성공(앞의 required 실패가 없을 때)
optional결과가 다른 모듈에 거의 영향 없음
[success=.. default=..]세밀한 분기 제어(최신 스택에서 많이 사용)

2. 왜 중요한가

  • PAM은 모든 인증의 관문입니다. 스택 한 줄만 바뀌어도 인증이 무력화되거나 백도어가 생길 수 있습니다(다음 편 013에서 변조 사례).
  • control flag를 모르면 로그만 보고는 "왜 통과/거부됐는지"를 설명할 수 없습니다. 예를 들어 sufficient pam_unix가 성공하면 뒤 모듈을 보지 않습니다.
  • 순서가 중요합니다. pam_faillock preauth가 pam_unix 앞에 있어야 잠금이 인증보다 먼저 적용됩니다.

3. 핵심 명령어 / 설정

파일역할
/etc/pam.d/system-auth, password-auth (Rocky)공통 인증 스택(다른 서비스가 include)
/etc/pam.d/common-auth, common-* (Ubuntu)공통 인증 스택
/etc/pam.d/sshd, login, sudo, su서비스별 스택(공통을 include)
authselect current (Rocky)현재 적용 프로파일·커스텀 여부
pam_tally2/faillock, pam_unix, pam_pwquality, pam_pwhistory주요 모듈

4. 실습 (실습 예시)

# 1) sshd 인증 경로 전체 펼쳐 보기 (include 따라가며)
grep -vE '^\s*(#|$)' /etc/pam.d/sshd
echo '--- system-auth ---'; grep -vE '^\s*(#|$)' /etc/pam.d/system-auth   # Ubuntu: common-auth

# 2) Rocky: authselect로 표준 대비 커스텀 변경 확인
authselect current 2>/dev/null
authselect check 2>/dev/null

# 3) 위험 패턴 탐색: nullok(빈 비밀번호 허용), pam_permit(무조건 통과)
grep -rnE 'nullok|pam_permit\.so' /etc/pam.d/

nullok은 빈 비밀번호 로그인을 허용하는 인자라 운영 서버에서는 제거 대상입니다. pam_permit.so가 auth/account에 쓰이면 사실상 인증 우회입니다.

5. 정상 상태

auth        required      pam_env.so
auth        required      pam_faillock.so preauth silent deny=5 unlock_time=900
auth        sufficient    pam_unix.so try_first_pass
auth        required      pam_faillock.so authfail deny=5 unlock_time=900
auth        required      pam_deny.so
$ authselect check
Current configuration is valid.

faillock이 pam_unix 앞뒤로 올바르게 배치되고, 마지막이 pam_deny.so로 닫히며, authselect가 "valid"인 상태가 정상입니다.

6. 이상 상태

auth        sufficient    pam_unix.so try_first_pass nullok
auth        sufficient    pam_permit.so
$ authselect check
Current configuration was manually modified.
  • nullok 추가 → 빈 비밀번호 로그인 허용
  • auth ... sufficient pam_permit.so → 앞 모듈이 실패해도 무조건 인증 성공(완전한 우회)
  • faillock·pam_deny 제거 → 잠금·최종 거부 없음
  • authselect가 "manually modified" → 표준 프로파일에서 벗어남

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

PAM 동작은 인증 로그의 grantors/op 필드로 어떤 모듈이 관여했는지 보입니다(가상의 예시 로그).

[정상]
type=USER_AUTH ... msg='op=PAM:authentication grantors=pam_faillock,pam_unix acct=devops ... res=success'
[우회 설정 후]
type=USER_AUTH ... msg='op=PAM:authentication grantors=pam_permit acct=devops ... res=success'
Oct  2 03:00:11 rocky9-web01 sshd[12301]: Accepted password for devops from 192.168.56.77 port 50240 ssh2
필드분석
grantors=pam_faillock,pam_unix정상: 잠금 검사 + 비밀번호 검사
grantors=pam_permit비정상: 통과시킨 모듈이 pam_permit → 인증 우회
성공했지만 비밀번호 검증 흔적 없음인증 로직이 바뀌었다는 강한 신호

grantors에 기대하지 않은 모듈이 보이면 PAM 스택 변조를 의심합니다(013편에서 탐지).

8. SOC 관제 포인트

  • 인증 성공 로그의 grantors를 기준선과 비교해 관여 모듈이 바뀌었는지 봅니다.
  • nullok, pam_permit(auth/account)은 스택에 있어서는 안 되는 패턴으로 관리합니다.
  • Rocky는 authselect check의 "manually modified"를 변경 지표로 삼습니다.

9. 탐지 규칙

PAM 스택 자체의 탐지는 다음 편(013)에서 다루고, 여기서는 인증 결과의 grantors 이상을 보는 관점을 둡니다.

# Kibana(KQL): 인증 성공인데 pam_unix가 관여하지 않은 이벤트
data.audit.op : "PAM:authentication" and data.audit.res : "success" and not data.audit.grantors : *pam_unix*

디코더가 grantors를 필드로 추출하지 않으면 전체 메시지 문자열 검색(full_log)으로 대체합니다.

10. 대응 방법

  1. 초기 확인 — 문제 서비스의 PAM 스택을 include까지 펼쳐 비정상 모듈·플래그를 확인합니다.
  2. 범위 확인 — 인증 성공 로그의 grantors로 실제 관여 모듈을 확인하고 기준선과 비교합니다.
  3. 증거 확보 — PAM 파일 사본, authselect 상태, 인증 로그를 보존합니다.
  4. 차단/조치 — 표준 스택(authselect 프로파일 등)으로 복원하고 우회 구간의 로그인을 조사합니다.
  5. 재발 방지 — PAM 스택을 FIM·기준선에 포함하고 grantors 이상 검색을 운영합니다.

11. 핵심 정리

타입auth(신원) · account(유효성) · password(변경) · session(세션)
주요 flagrequired(계속·실패) · requisite(즉시 실패) · sufficient(즉시 성공) · optional
위험 패턴nullok(빈 비밀번호), pam_permit(무조건 통과)
판독인증 로그의 grantors = 실제 관여 모듈
면접 포인트"sufficient가 성공하면 뒤 모듈을 보지 않는다 — 순서가 결과를 바꾼다"

12. 다음 편 예고

다음 편 063. 계정 · 인증 보안 — PAM 설정 변조 탐지 에서는 이 스택을 노리는 PAM 설정 변조 탐지를 다룹니다.


이전 편: 061. 계정 · 인증 보안 — 비밀번호 이력·재사용 제한(pam_pwhistory)
📚 시리즈 전체 보기: 시스템 보안 · 취약점

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

0개의 댓글