리눅스 PAM 인증 모듈의 구조와 실무 설정 가이드

PAM(Pluggable Authentication Modules) 개요

리눅스 환경에서 login, su, sshd와 같은 프로그램은 사용자의 신원을 확인하고 권한을 부여하기 위해 PAM을 사용합니다. PAM은 동적으로 로드되는 인증 모듈 집합으로, 애플리케이션의 소스 코드를 재컴파일하지 않고도 인증 로직과 정책을 유연하게 변경할 수 있게 해줍니다.

설정 파일 구조 및 문법

PAM 설정은 주로 /etc/pam.d/ 디렉토리 내의 서비스별 파일(예: sshd, vsftpd)에서 관리됩니다. 각 파일의 라인은 기본적으로 네 가지 필드로 구성됩니다.

# /etc/pam.d/sshd 예시
auth       required     pam_sepermit.so
auth       substack     password-auth
account    required     pam_nologin.so
session    required     pam_selinux.so close
  • 모듈 타입 (Module Type): 수행할 작업의 종류를 정의합니다.
  • 제어 플래그 (Control Flag): 모듈 실행 결과에 따른 처리 방식을 결정합니다.
  • 모듈 경로 (Module Path): 호출할 공유 라이브러리(.so) 파일입니다.
  • 모듈 매개변수 (Module Arguments): 모듈에 전달되는 추가 옵션입니다.

1. 모듈 타입

  • auth (인증): 사용자의 신원 확인 및 자격 증명(비밀번호 등)을 검증합니다.
  • account (계정): 계정의 유효성(만료 여부, 접근 허용 시간대 등)을 검사합니다.
  • session (세션): 인증 성공 후 세션 환경 구성 및 리소스 할당, 로그 기록 등을 처리합니다.
  • password (비밀번호): 비밀번호 변경 시 복잡도 검사 및 토큰 업데이트를 담당합니다.

2. 제어 플래그

  • required: 성공이 필수적입니다. 실패하더라도 즉시 중단하지 않고 나머지 모듈을 모두 실행한 후 최종적으로 실패를 반환합니다. (어느 모듈에서 실패했는지 숨기기 위함)
  • requisite: 성공이 필수적이며, 실패 시 즉시 인증 프로세스를 중단하고 오류를 반환합니다.
  • sufficient: 이 모듈이 성공하면 이후 모듈을 건너뛰고 즉시 성공을 반환합니다. 단, 앞선 required 모듈이 실패했다면 무시됩니다.
  • optional: 모듈의 성공/실패 여부가 전체 결과에 영향을 주지 않습니다. (단, 이 모듈만 존재하는 경우 예외)
  • include: 다른 PAM 설정 파일을 불러와 현재 스택에 포함시킵니다.

고급 제어가 필요할 경우 [success=1 default=ignore]와 같은 커스텀 액션 문법을 사용하여 특정 반환 값에 따라 실행 흐름을 세밀하게 조정할 수 있습니다.

핵심 PAM 모듈 및 실무 활용

1. 접근 제어: pam_access.so

호스트, IP, 사용자 기반의 세밀한 접근 통제를 제공합니다. /etc/security/access.conf 파일을 사용하여 규칙을 정의합니다.

시나리오: 특정 개발자 계정(dev_user)이 특정 서버(10.0.50.10)에서만 FTP에 접속하도록 제한.

# /etc/pam.d/vsftpd에 추가
account    required     pam_access.so

# /etc/security/access.conf에 추가
- : dev_user : ALL EXCEPT 10.0.50.10

2. 리스트 기반 제어: pam_listfile.so

화이트리스트 또는 블랙리스트 파일을 통해 접근을 제어합니다.

시나리오: SSH 접속 차단 리스트를 관리하여 test_user의 접속을 막는 경우.

# /etc/pam.d/sshd 최상단에 추가
auth       required     pam_listfile.so item=user sense=deny file=/etc/ssh/deny_users onerr=succeed

# /etc/ssh/deny_users 파일 생성
echo "test_user" | sudo tee /etc/ssh/deny_users

3. 리소스 제한: pam_limits.so

사용자 또는 그룹별 시스템 리소스 사용량을 제한합니다. 설정은 /etc/security/limits.conf에서 관리합니다.

시나리오: db_admin 계정의 최대 동시 로그인 수를 3개로 제한하고, 오픈 가능한 파일 디스크립터 수를 늘림.

# /etc/security/limits.conf
db_admin    hard    maxlogins    3
db_admin    soft    nofile       4096
db_admin    hard    nofile       8192

4. 비밀번호 복잡도 및 이력 관리: pam_pwquality.so & pam_pwhistory.so

참고: 최신 리눅스 배포판에서는 pam_cracklib.so 대신 pam_pwquality.so를 주로 사용합니다.

시나리오: 비밀번호 최소 길이 12자, 숫자 2개 이상 포함, 최근 5개 비밀번호 재사용 방지.

# /etc/pam.d/system-auth (또는 password-auth)
password   requisite    pam_pwquality.so retry=3 minlen=12 dcredit=-2 ucredit=-1 lcredit=-1 ocredit=-1
password   sufficient   pam_unix.so sha512 shadow nullok try_first_pass use_authtok remember=5
password   required     pam_deny.so

비밀번호 이력은 /etc/security/opasswd에 암호화되어 저장되므로, 해당 파일의 권한이 600으로 설정되어 있는지 반드시 확인해야 합니다.

5. 로그인 실패 잠금: pam_faillock.so

참고: pam_tally2.so는 최신 시스템에서 deprecated 되었으며, pam_faillock.so로 대체되었습니다.

시나리오: SSH 로그인 3회 실패 시 10분(600초) 동안 계정 잠금 (root 포함).

# /etc/pam.d/sshd 및 /etc/pam.d/system-auth의 auth 섹션 최상단 및 하단에 적절히 배치
auth       required     pam_faillock.so preauth silent audit deny=3 unlock_time=600 even_deny_root
auth       [default=die] pam_faillock.so authfail audit deny=3 unlock_time=600 even_deny_root
auth       sufficient   pam_unix.so nullok try_first_pass
auth       required     pam_faillock.so authsucc audit deny=3 unlock_time=600 even_deny_root

잠금 해제는 faillock --user admin_user --reset 명령어로 수행할 수 있습니다.

설정 시 주의사항

PAM 설정 파일의 라인 순서는 인증 흐름에 직접적인 영향을 미칩니다. requiredrequisite 모듈의 배치 오류는 시스템 전체의 잠금(Lockout)을 유발할 수 있습니다. 따라서 설정 변경 전에는 반드시 루트 세션을 하나 더 열어두거나, 단일 사용자 모드(Single User Mode)로 부팅할 수 있는 환경을 마련해 두는 것이 안전합니다.

태그: linux pam authentication Security pam_faillock

6월 17일 02:49에 게시됨