4.4. 사용자 신원

Linux-PAM 모듈들에선 서비스를 요청하는 사용자의 신원과 서비스를 인가하는 사용자의 신원을 알아낼 필요가 있다. 이 두 사용자는 보통 같지 않다. 그런데 고려해야 할 사용자 신원이 일반적으로 하나 더 있는데, 바로 사용자에게 서비스가 인가된 후의 새 (가)신원이다.

이 신원들을 정확하게 다루는 건 분명한 보안 관련 사안이다. 일부 모듈들에서 활발히 쓰는 관행은 서비스를 요청하는 사용자의 신원은 동작 중인 프로세스의 현재 UID(사용자 ID)여야 하고, 특권을 가진 인가 사용자의 신원은 동작 중인 프로세스의 EUID(실효 사용자 ID)이고, 서비스를 실행하는 데 쓸 사용자의 신원은 PAM_USER pam_get_item(3)의 내용으로 받는 것이다. 참고로 pam_*() 라이브러리 호출 내에서 모듈이 PAM_USERPAM_RUSER의 값을 바꿀 수 있다. 따라서 응용에서는 인증된 사용자가 누구인지 (즉 현재로선 누가 될 것 같은지) 확실히 하고 싶을 때마다 pam_get_item()을 쓰도록 해야 한다.

(OS 커널과 독립적으로) 자체 보안 모델을 제공하는 네트워크 서비스 제공 데이터베이스와 기타 응용들에서는 요청 사용자를 식별하는 데 위 체계로는 충분치 않다.

요청하는 사용자의 신원을 저장하기 위한 더 이식성 높은 방법은 PAM_RUSER pam_get_item(3)을 이용하는 것이다. pam_authenticate()로 사용자 인증을 시도하기 전에 응용에서 이 값을 제공해야 한다. 그 이름을 얼마나 신뢰할 수 있을지는 궁극적으로 (응용을 위한 PAM 설정을 하는) 로컬 관리자에게 달려 있으며, 설정된 모듈에서 더 신뢰성 있는 데이터를 얻을 수 있는 경우 그 값을 바꾸려고 할 수도 있다. 응용에서 요청 개체/사용자의 신원을 알아낼 수 없으면 pam_set_item(3) 호출로 PAM_RUSER를 설정하지 말아야 한다.

PAM_RUSER 항목에 더해서 PAM_RHOST(요청 호스트) 항목을 응용에서 제공해 줘야 한다. 그 값에 대해 대체로 상정할 수 있는 관행은 이렇다: NULL = 알 수 없음, localhost = 로컬 시스템에서 바로 호출, other.place.xyz = 사용자 연결의 어떤 요소가 이 원격/요청 호스트에서 기원한 것임. 이 호스트로부터의 통신에 대해 신뢰할 수 있는 경로를 응용에서 지원하는지 여부를 나타내기 위한 확립된 PAM 관행은 현재 없다.