PAM(Pluggable Authentication Module)
리눅스/유닉스 기반의 시스템에서 인증을 수행할 수 있게 해주는 '플러그인 방식 인증 프레임워크'
Application 상에서 별도로 인증을 구현하지 않더라도, PAM을 통해서 LDAP이나 2FA, Kerberos 등의 다양한 인증방식을 연결할 수 있고, 시스템 보안 정책을 중앙에서 관리할 수 있게 된다.
또한, 플러그인 방식이라 PAM을 이용하는 프로그램들을 수정할 필요없이 인증 모듈을 변경하는 것만으로도 인증 방식을 바꿀 수 있다는 장점을 가지고 있다.
PAM 설정들은 `/etc/pam.d` 디렉토리 내부에 저장되는데, 이 디렉토리 하위에는 PAM을 이용할 서비스들의 설정파일이 위치한다.
대표적으로 아래와 같은 서비스들이 PAM을 사용해서 인증을 수행한다.
| 서비스 | 설명 |
| SSH(sshd) | SSH 기반 사용자 로그인 인증 |
| sudo | 루트 권한 상승 인증 |
| su | 사용자 전환 인증 |
| login | 로컬 시스템 로그인 |
| passwd | 비밀번호 변경 |
PAM 구성요소
`/etc/pam.d` 하위에 존재하는 서비스별 설정파일을 보면, 아래처럼 일정한 형식을 가지며 작성되어있다.
각 라인별로 하나의 모듈을 나타내고, 각 라인의 필드별로 모듈의 설정과 flag 값을 갖도록 구성된다.
auth required pam_sepermit.so
auth substack password-auth
account required pam_nologin.so
password include password-auth
session include password-auth
이는 PAM 모듈 체인이라고 하며, 해당 Application/서비스가 인증요청을 하면, 파일에 명시된 모듈 체인을 통해 인증을 처리하고 결과를 돌려주는 흐름을 갖는다.

첫번째 필드는 스택으로, PAM의 종류(타입)로 볼 수 있다.
PAM은 크게 4가지 스택으로 구성된다.
| 스택 | 역할 |
| auth | 사용자의 신원 확인 |
| account | 계정의 접근 가능 여부 |
| password | 비밀번호 변경 정책 |
| session | 로그인 전/후 필요한 환경설정 수행 |
그리고 두번째 필드는 모듈의 실행 규칙(control flag)으로, 해당 모듈을 통한 인증의 Action을 나타낸다.
- required : 반드시 이 모듈을 통한 인증에 성공해야하지만, 실패해도 남은 모듈 인증을 거치고 Application에 실패여부를 전달
- sufficient : 이 모듈 인증을 성공하면 다른 모듈을 시도하지 않고 Application에 인증 성공으로 전달
- requisite : 이 모듈 인증이 실패하면, Application에 인증 실패로 전달
- optional : 해당 모듈의 성공/실패 여부는 optional하게 처리
위 4가지 외에도 `value=action` 형식의 값을 리스트로 넣는것도 허용된다
허용되는 value와 action은 PAM manual에서 확인할 수 있다.
세번째 필드는 실제 모듈의 경로를 지정한다.
마지막으로 네번째 필드는 모듈에 전달해줄 argument를 지정한다. 각 모듈별로 전달해줄 argument값들을 미리 확인해서 작성해주도록 한다.
PAM 활용 예시
로그인 실패 횟수 제한
# 5회 시도 후 사용자 잠금, 120초 차단
auth required pam_tally2.so deny=5 unlock_time=120
auth reqired pam_faillock.so deny=5 unlock_time=120
pam_tally2나 pam_faillock 모듈을 통해 로그인 시도와 실패 횟수를 카운트해서 연속으로 일정 횟수 이상 인증실패한 계정을 일정 기간동안 잠글 수 있다.
pam_tally2 모듈은 2020년 이후로 deprecated되었고, 최근에는 pam_faillock을 사용하는 추세로 전환되었다고 한다.
pam_faillock 모듈의 옵션과 예제는 Docs에서 참고할 수 있다.
특정 사용자 접속 차단
$ file 경로의 파일 내용에 적힌 사용자를 차단
auth required pam_listfile.so item=user sense=deny file=/etc/denied_users
pam_listfile로 특정 파일의 내용을 기반으로 서비스 접근과 차단을 수행할 수 있다.
pam_listfile 모듈의 옵션과 예제는 Docs에서 참고할 수 있다.