6.34. pam_unix - 전통적 패스워드 인증

pam_unix.so [ ... ]

6.34.1. 설명

표준 유닉스 인증 모듈이다. 시스템 라이브러리의 표준 호출을 이용해 계정 정보를 얻고 인증을 한다. 일반적으로 /etc/passwd 파일에서, 그리고 섀도가 켜져 있으면 /etc/shadow 파일에서 정보를 얻는다.

account 부문에서는 shadow 항목 expire, last_change, max_change, min_change, warn_change에 따라서 사용자 계정 및 패스워드의 상태를 확정하는 작업을 수행한다. 패스워드의 경우에는 사용자에게 패스워드 변경을 권고할 수도 있고, PAM_AUTHTOKEN_REQD 반환을 통해 사용자가 새 패스워드를 설정할 때까지 서비스 제공을 미룰 수도 있다. 앞서 나열한 항목들을 shadow(5) 매뉴얼 페이지에서 설명하고 있다. 사용자 레코드에 그 항목들 중 하나라도 없으면 해당 shadow 검사를 수행하지 않는다.

auth 부문에서는 사용자 크리덴셜(패스워드) 검사를 수행한다. 사용자의 패스워드 설정이 비어 있는 경우 서비스 접근을 허가하지 않는 게 이 모듈의 기본 동작이다.

헬퍼 바이너리 unix_chkpwd(8)가 딸려 있는데, 사용자 패스워드가 읽기에 대해 보호가 돼 있는 데이터베이스에 저장돼 있는 경우에 패스워드 검사를 하기 위한 것이다. 아주 단순한 바이너리로 호출한 사용자의 패스워드 검사만 한다. 모듈의 auth 부문에서 알아서 사용자를 대신해 호출해 준다. 이 방식을 통해 xlock(1) 같은 응용들이 root로 setuid 할 필요 없이 동작할 수 있게 된다. 기본적으로 모듈에서는 헬퍼 바이너리 실행 동안 SIGCHLD 처리를 잠시 꺼 둔다. 많은 응용들이 fork() 된 줄 몰랐던 자식에게서 이 시그널이 오는 걸 처리할 준비가 돼 있지 않으므로 일반적으로 이렇게 하는 게 맞다. 모듈 인자 noreap을 사용해 이 임시 보호를 끌 수 있는데, 어떤 응용에서는 필요할 수도 있다.

pam_unix 모듈에서 헬퍼 바이너리를 통해서 지원하는 패스워드 최대 길이는 PAM_MAX_RESP_SIZE인데, 현재 512바이트다. 대화 함수에서 모듈로 제공한 패스워드의 나머지 부분은 무시된다.

모듈 password 부문에서는 사용자 패스워드를 갱신하는 작업을 수행한다. 따로 지정하지 않으면 /etc/login.defsENCRYPT_METHOD 변수에서 암호화 해시 방법을 가져온다.

모듈 session 부문에서는 사용자가 시스템에 로그인할 때와 떠날 때 로그를 남긴다.

이 모듈의 기타 기능들에서 지원하는 나머지 인자들은 조용히 무시된다. 그 외 인자들은 syslog(3)를 통해 오류 로그를 남긴다.

6.34.2. 옵션

debug

syslog(3)를 통한 디버깅을 켠다.

audit

debug보다 좀 더 많이 찍기.

quiet

syslog(3)를 통한 정보성 메시지, 즉 세션 열기 및 닫기에 대한 메시지를 끈다.

nullok

사용자의 패스워드 설정이 비어 있는 경우 서비스 접근을 허가하지 않는 게 이 모듈의 기본 동작이다. nullok 인자는 그 기본 동작을 바꾼다.

nullresetok

nullok가 설정돼 있지 않더라도 패스워드 재설정을 강제하는 경우에는 사용자가 빈 패스워드로 인증하는 것을 허용한다. 패스워드 재설정이 필요치 않고 nullok가 설정돼 있지 않은 경우에는 빈 패스워드로 인증하는 것을 거부한다.

try_first_pass

사용자에게 패스워드를 묻기 전에 먼저 스택 앞쪽 모듈의 패스워드를 이용할 수 있는지 확인해 본다.

use_first_pass

use_first_pass 인자는 스택 앞쪽 모듈의 패스워드를 이용하도록 강제해서 사용자에게 패스워드를 묻지 않게 한다. 이용할 수 있는 패스워드가 없거나 적합한 패스워드가 아니면 사용자 접근이 거부된다.

nodelay

이 인자를 사용하면 인증이 전체적으로 실패한 경우에 auth 부문에서 지연을 요청하지 않게 할 수 있다. 모듈 기본 동작은 실패 시 2초 정도의 지연을 요청하는 것이다.

use_authtok

패스워드 변경 시 스택 앞쪽 password 모듈에서 제공하는 새 패스워드를 이용하도록 강제한다. (아래의 pam_passwdqc 모듈 조합 예시에서 사용함.)

authtok_type=type

이 인자를 사용하면 패스워드 변경 시 패스워드 프롬프트에 패스워드 종류를 포함하도록 할 수 있다. 기본적으로 비어 있다.

nis

새 패스워드 설정에 NIS RPC를 이용한다.

remember=n

/etc/security/opasswd에 사용자별로 최근 n 개 패스워드를 저장한다. 그 패스워드 변경 이력을 이용해서 사용자가 같은 패스워드를 빈번하게 바꿔 가며 사용하는 걸 막는다. 이전 암호를 저장하는 데 MD5 패스워드 해시 알고리즘을 쓴다. 이 옵션보다는 pam_pwhistory 모듈을 쓰는 게 좋다.

shadow

변경 사항을 섀도 기반 체계에 반영한다.

md5

사용자가 패스워드를 변경할 때 MD5 알고리즘으로 암호화한다.

bigcrypt

사용자가 패스워드를 변경할 때 DEC C2 알고리즘으로 암호화한다.

sha256

사용자가 패스워드를 변경할 때 SHA256 알고리즘으로 암호화한다. crypt(3) 함수에서 SHA256 알고리즘을 지원해야 한다.

sha512

사용자가 패스워드를 변경할 때 SHA512 알고리즘으로 암호화한다. crypt(3) 함수에서 SHA512 알고리즘을 지원해야 한다.

blowfish

사용자가 패스워드를 변경할 때 블로피시 알고리즘으로 암호화한다. crypt(3) 함수에서 블로피시 알고리즘을 지원해야 한다.

gost_yescrypt

사용자가 패스워드를 변경할 때 gost-yescrypt 알고리즘으로 암호화한다. crypt(3) 함수에서 gost-yescrypt 알고리즘을 지원해야 한다.

yescrypt

사용자가 패스워드를 변경할 때 yescrypt 알고리즘으로 암호화한다. crypt(3) 함수에서 yescrypt 알고리즘을 지원해야 한다.

rounds=n

패스워드 해싱 알고리즘 SHA256, SHA512, 블로피시, gost-yescrypt, yescrypt의 라운드 수를 n으로 설정한다.

broken_shadow

계정 관리 모듈에서 사용자의 섀도 정보를 읽는 데 실패한 경우를 무시한다.

minlen=n

패스워드 최소 길이를 n 글자로 설정한다. DES 암호 기반 패스워드의 최대 길이는 8글자다.

no_pass_expiry

지정 시 사용자의 shadow 항목에 규정된 패스워드 만료 설정을 무시한다. pam_unix가 인증에 이용되지 않았거나 인증 실패를 반환한 (즉 다른 인증 원천 내지 방식이 성공한) 경우에만 이 옵션이 효력이 있다. sshd의 공개키 인증이 예가 될 수 있다. 최종적으로 PAM_NEW_AUTHTOK_REQDPAM_AUTHTOK_EXPIRED 대신 PAM_SUCCESS를 반환하게 된다.

잘못된 인자가 있으면 syslog(3)로 남긴다.

6.34.3. 제공하는 모듈 종류

모든 모듈 타입(account, auth, password, session)을 제공한다.

6.34.4. 반환 값

PAM_IGNORE

이 모듈을 무시하라.

6.34.5. 예시

/etc/pam.d/login 사용례:

# 사용자 인증
auth       required   pam_unix.so
# 사용자 계정 및 패스워드가 활성 상태인지 확인
account    required   pam_unix.so
# 사용자 패스워드 바꾸기, 단 먼저 pam_passwdqc(8)로 강도 검사
password   required   pam_passwdqc.so config=/etc/passwdqc.conf
password   required   pam_unix.so use_authtok nullok yescrypt
session    required   pam_unix.so
      

6.34.6. 작성자

여러 사람들이 pam_unix를 작성했다.