3.1. 개요

여섯 가지 모듈 함수를 독립적인 네 가지 관리 그룹으로 나눌 수 있는데, 바로 authentication, account, session, password 그룹이다. 올바로 정의된 모듈에는 이 그룹들 중 적어도 하나의 모든 함수가 정의돼 있어야 한다. 한 모듈에 네 가지 그룹 모두에 필요한 함수들이 담겨 있을 수도 있다.

3.1.1. 기능의 독립

모듈에서 제공할 수 있는 네 가지 서비스 그룹이 서로 독립적이란 것은 그 서비스들이 어떤 순서로도 호출될 수 있다는 점을 모듈에서 감안해야 한다는 뜻이다. 따라서 모듈 작성자는 서비스 수행의 적합성을 고려할 때 모듈 다른 부분이 앞서 성공적으로 동작했는지를 따지지 않아야 한다.

예를 들어, 응용에서 사용자 인증 토큰 변경을 요청하는데 Linux-PAM에서 먼저 사용자를 인증하지 않는 경우를 생각해 보자. 어떤 경우에는 그게 적절할 수도 있다. root가 하위 사용자의 인증 토큰을 변경할 때가 그렇다. 하지만 다른 경우에는 적절치 않을 수도 있다. joe가 악의적으로 alice의 패스워드를 재설정하려 하거나, 사용자 본인이 아닌 누가 KERBEROS 인증 토큰을 재설정하려 할 때가 그렇다. 어떤 적절한 인증 체계를 이용해 그런 행동에 대한 정책을 규정해야 하며, 모듈 작성자는 모듈을 구현할 때 이를 감안해야 한다.

3.1.2. 관리적 문제 최소화하기

시스템 관리 상의 문제와 /etc/pam.conf 파일 구성 오류를 피하기 위해 모듈 개발자가 여섯 가지 함수를 모두 정의하기로 할 수도 있다. 호출되지 않을 함수들에 대해선 모듈에서 PAM_SERVICE_ERR를 반환하며 시스템 로그로 적절한 메시지를 찍으면 된다. 이런 동작이 적절치 않아 보이는 경우에는 함수에서 그냥 PAM_IGNORE를 반환하면 된다.

3.1.3. 모듈로 제공되는 인자

아래 함수들 각각의 flags 인자가 PAM_SILENT와 논리 OR 되어 있을 수 있는데, 이는 모듈에서 응용으로 어떤 텍스트(오류나 경고)도 주지 말아야 한다는 표시다.

argsargv 인자는 설정 파일의 해당하는 (즉 service_name이 응용의 요청과 일치하는) 모듈 행에서 가져온다. (Linux-PAM 시스템 관리자 안내서 참고.) 이 두 매개변수는 인자 개수와 각 인자 토큰에 대한 포인터들의 배열이다. main() 함수에 명령행 인자를 전달하는 흔히 쓰는 방식이므로 C 프로그래머에겐 익숙할 것이다. 단, 첫 번째 인자(argv[0])가 모듈 이름이 아니라 실제 인자라는 점에 유의하자.