Linux PAM으로 설계하는 리눅스 인증 정책
Linux PAM의 인증 스택, 제어 플래그, 주요 모듈과 SSH·암호 정책 설정을 통해 리눅스 인증 정책을 관리하는 방법
2026-08-14 · 최초 발행 2025-06-15
인증 로직과 정책을 분리하는 PAM
PAM(Pluggable Authentication Modules)은 리눅스에서 사용자 인증을 처리하기 위한 유연한 메커니즘이다. 1995년 Sun Microsystems에서 처음 개발된 뒤 여러 유닉스·리눅스 시스템에 도입됐으며, 현대 리눅스 배포판에서는 표준 인증 프레임워크로 사용된다.
애플리케이션은 PAM을 통해 인증을 요청하고, 실제 인증 방식은 설정과 모듈이 맡는다. 따라서 기존 애플리케이션 코드를 바꾸지 않고도 인증 메커니즘을 교체할 수 있다. 인증 정책을 한곳에서 관리할 수 있다는 점은 서비스별 정책 일관성과 유지보수에도 연결된다.
요청부터 최종 판정까지의 인증 경로
인증을 요청한 애플리케이션은 PAM 라이브러리를 호출한다. 라이브러리는 해당 서비스의 설정을 읽어 필요한 모듈을 불러오고 실행하며, 모듈이 반환한 결과를 바탕으로 최종 인증 결과를 결정한다. 시스템 관리자는 이 스택을 통해 서비스별 인증 방식을 조정한다.
/etc/pam.d/에서 인증 스택 읽기
PAM 설정 파일은 /etc/pam.d/ 아래에 애플리케이션별로 놓인다. 각 파일은 여러 모듈로 구성된 인증 스택을 정의하며, 기본 형식은 다음과 같다.
type control_flag module_path module_arguments
예를 들어 auth required pam_unix.so nullok try_first_pass는 인증 유형에서 pam_unix.so 모듈을 required 제어 플래그와 함께 사용한다는 뜻이다.
모듈 유형은 작업의 성격을 나눈다.
auth: 사용자 신원을 확인한다.account: 계정 만료나 접근 시간 제한처럼 계정의 유효성을 검사한다.password: 암호 변경을 처리한다.session: 세션의 설정과 정리를 담당한다.
제어 플래그는 개별 모듈의 성공·실패가 스택 전체에 미치는 영향을 정한다.
required: 실패하면 최종 결과는 실패가 되지만, 뒤의 모듈은 계속 실행한다.requisite: 실패 즉시 실패를 반환하고 이후 모듈은 실행하지 않는다.sufficient: 성공하고 다른required모듈의 실패가 없다면 즉시 성공을 반환한다.optional: 모듈 결과가 최종 판정에 영향을 주지 않는다.
모듈 경로와 인자에는 모듈 라이브러리의 위치 및 모듈별 옵션을 지정한다.
인증 스택에서 자주 만나는 모듈
pam_unix.so는 기본 유닉스 암호 인증을 처리한다. /etc/passwd, /etc/shadow를 기반으로 인증하고 암호 변경 기능도 제공한다.
중앙집중식 사용자 관리가 필요하면 pam_ldap.so를 LDAP 서버 기반 인증에 사용할 수 있다. 암호 품질 정책에는 pam_cracklib.so 또는 pam_pwquality.so가 쓰이며, 강력한 암호 요구사항을 적용한다.
운영 정책도 PAM 모듈로 연결할 수 있다. pam_limits.so는 CPU, 메모리, 로그인 세션 수 등의 사용자 리소스 제한을 설정한다. pam_access.so는 특정 사용자나 그룹의 접근 허용·거부를 담당하며, pam_time.so는 시간대에 따른 접근 제어를 맡는다.
SSH 서비스 설정이 만드는 로그인 흐름
다음은 /etc/pam.d/sshd의 SSH 로그인 인증 설정 예시다.
# 기본 인증
auth required pam_sepermit.so
auth include password-auth
# 계정 확인
account required pam_nologin.so
account include password-auth
# 비밀번호 처리
password include password-auth
# 세션 관리
session required pam_selinux.so close
session required pam_loginuid.so
session optional pam_keyinit.so force revoke
session include password-auth
session required pam_selinux.so open
이 구성에서는 먼저 pam_sepermit.so로 SELinux 권한을 확인하고, password-auth 파일의 인증 스택을 포함한다. 계정 단계에서는 pam_nologin.so로 시스템 로그인 가능 여부를 검사한다. 세션이 시작될 때는 SELinux 컨텍스트를 설정하고 로그인 UID를 기록하며, 종료 시에는 정리 작업을 수행한다.
암호 변경 정책을 스택으로 적용하기
/etc/pam.d/system-auth에서는 암호 품질 검사와 저장 방식을 다음처럼 연결할 수 있다.
# 암호 변경 설정
password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type= minlen=8 lcredit=-1 ucredit=-1 dcredit=-1 ocredit=-1
password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok
password required pam_deny.so
pam_pwquality.so는 최소 8자와 소문자·대문자·숫자·특수문자 각 1개 이상의 조건을 검사한다. pam_unix.so는 SHA-512 해시 알고리즘으로 암호를 저장하고 shadow 파일을 사용한다. 앞선 모듈에서 처리되지 않은 경우에는 pam_deny.so가 항상 실패를 반환한다.
MFA와 접근 조건을 서비스 정책에 넣는 방법
일반 패스워드와 Google Authenticator TOTP를 조합하려면 두 인증 모듈을 모두 성공해야 하는 required 스택으로 구성할 수 있다.
auth required pam_unix.so
auth required pam_google_authenticator.so
시간 조건은 pam_time.so로 계정 단계에 추가한다.
account required pam_time.so
/etc/security/time.conf에서 접근 시간을 제한할 수 있다. 예를 들어 login;*;student;Wk0800-1700은 학생 계정의 로그인을 평일 8시~17시로 제한한다. 관리자는 제한 없이 접근하도록 구성할 수도 있다.
사용자별 리소스 제한은 세션 단계의 pam_limits.so로 적용한다.
session required pam_limits.so
/etc/security/limits.conf에서 제한을 지정하며, developer soft nproc 50은 개발자 그룹이 최대 50개 프로세스를 실행하도록 설정한다. 이는 서버 리소스 남용을 막고 안정성을 확보하는 데 활용된다.
인증 장애를 좁혀 가는 점검 순서
문제가 생기면 /var/log/secure 또는 /var/log/auth.log에서 인증 관련 로그를 먼저 확인한다. 더 자세한 정보를 위해 모듈 옵션에 debug를 추가할 수 있다.
auth required pam_unix.so debug
pamtester나 pam-auth-update는 설정 테스트에 사용할 수 있다. 모듈 순서가 인증 흐름에 맞는지, 필요한 모듈과 의존성이 빠지지 않았는지, 모듈 파일 및 관련 설정 파일의 권한이 적절한지를 함께 검토해야 한다.
정책을 강화할 때 확인할 범위
PAM 설정에는 필요한 모듈만 두고 서비스별 권한을 맞추는 최소 권한 원칙을 적용한다. pam_pwquality.so 또는 pam_cracklib.so로 암호 요구사항을 강화하고, 암호 이력을 관리해 재사용을 방지할 수 있다.
로그인 실패 횟수 제한에는 pam_tally2.so를 사용할 수 있다.
auth required pam_tally2.so deny=5 unlock_time=1800 even_deny_root
이 설정은 5회 실패 시 30분 동안 잠그고 root에도 적용한다. 인증 수단은 지식(암호), 소유(OTP), 생체인증을 조합할 수 있으며 pam_google_authenticator.so, pam_yubico.so 등을 활용한다. 설정 파일을 정기적으로 검토하고, 불필요한 모듈을 제거하며, 보안 업데이트를 적용하는 작업도 함께 필요하다.
자체 모듈로 인증 로직을 연결할 때
PAM API를 이용하면 자체 모듈을 개발할 수 있다. 인증 처리에는 pam_sm_authenticate, 자격 증명 설정에는 pam_sm_setcred, 계정 관리에는 pam_sm_acct_mgmt를 사용한다. 세션 시작과 종료는 각각 pam_sm_open_session, pam_sm_close_session이 담당하며, 인증 토큰 변경에는 pam_sm_chauthtok이 사용된다.
개발 과정은 PAM 개발 라이브러리 설치, 모듈 소스 코드 작성, 컴파일과 .so 모듈 라이브러리 생성, 적절한 위치에 설치, PAM 설정 파일 수정 순서로 진행된다.
/* 간단한 PAM 모듈 예제 */
#include <security/pam_modules.h>
#include <security/pam_ext.h>
PAM_EXTERN int pam_sm_authenticate(pam_handle_t *pamh, int flags, int argc, const char **argv) {
/* 커스텀 인증 로직 구현 */
return PAM_SUCCESS;
}
/* 기타 필요한 PAM 함수 구현 */
확장되는 인증 환경과 PAM
PAM은 클라우드 서비스 인증과 연계될 수 있으며 AWS, Azure, GCP 등의 인증 시스템 통합에도 활용된다. Zero Trust 아키텍처에서는 지속적인 인증·권한 검증과 컨텍스트 기반 접근 제어를 지원하는 방향이 요구된다.
Docker와 Kubernetes 환경, 마이크로서비스 아키텍처에 맞는 인증 메커니즘도 PAM 활용 범위에 포함된다. 지문·안면인식 같은 생체인증 모듈 개발과 FIDO2/WebAuthn 표준 지원이 확대될 수 있으며, 사용자 행동 패턴 분석을 통한 비정상 로그인 시도 자동 차단도 하나의 방향이다.
PAM의 모듈식 구조는 다양한 인증 메커니즘을 통합하고 여러 서비스에 일관된 정책을 적용하는 기반이 된다. 리눅스 시스템 관리에서는 인증 흐름과 설정 방식 자체를 이해하는 일이 보안 강화와 관리 효율성에 직접 연결된다.