본문 바로가기
모의해킹 침해대응 과정/본 과정

서버보안 / PAM (Pluggable Authentication Modules)

by 알거음슴 2021. 7. 6.

PAM (Pluggable Authentication Modules)

시스템 관리자가 응용프로그램들이 사용자를 인증하는 방법을 선택할 수 있도록 해 주는 공유 라이브러리 묶음이다. 즉, 사용자를 인증하고 그 사용자의 서비스에 대한 액세스를 제어하는 모듈화된 방법을 말한다. PAM은 관리자가 응용프로그램들의 사용자 인증 방법을 선택할 수 있도록 해 준다. 필요한 공유라이브러리의 묶음을 제공하여 PAM을 사용하는 응용프로그램을 재컴파일없이 인증 방법을 변경할 수 있다.

1. PAM 구성파일의 문법

module type, module interface

타입토큰은 PAM에 이 모듈에 어떤 타입의 인증이 사용될 것인지를 알려준다. 같은 타입의 모듈은 "쌓일" 수 있고, 사용자에 인증되기 위한 다중 요구사항을 만족하도록 요청할 수 있다. PAM은 네개의 타입을 인식한다.

1) auth

이 모듈 인터페이스는 사용을 인증한다. 예를 들어 암호의 유효성을 요청하고 검증한다. 이 모듈을 사용하여 그룹 구성원 자격 또는 Kerberos 티켓과 같은 자격 증명을 설정할수도 있다. 

주로 패스워드를 통하지만 생체인증과 같은 보다 정교한 방법을 통해서 사용자가 자신이 주장하는 사용자가 맞는지 결정한다.

인증이 아닌 계정 관리를 수행한다. 이것은 보통 시간/날짜 현재의 시스템 자원 상황(최대 사용자수)이나 사용자의 위치(root는 콘솔에서만 로그인이 가능하다)등에 따라 서비스에 대한 접근을 허가하거나 제한하는 것이다.

2) account

이 모듈 인터페이스는 액세스가 허용되는지 확인한다. 예를 들어 사용자 계정이 만료되었는지 또는 특정 시간대에 사용자가 로그인할 수 있는지 여부를 확인한다.

계정(account)은 사용자가 해당 서비스에 접근이 허용되었는지, 패스워드가 기간이 만료가 되었는지를 결정한다.

사용자 인증의 두가지 면을 제공한다. 첫번째는, 응용프로그램이 사용자에게 패스워드를 물어보거나 다른 확인 방법을 사용하도록 해서 그 사용자가 자신이 주장하는 사람이 맞는지 확인하는 것이다. 두번째는, 그룹 멥버쉽을 주거나 credential(신임)속성을 통해 다른 권한을 주는것이다.

3) password

이 모듈 인터페이스는 사용자 암호를 변경하는데 사용한다.

패스워드는 사용자가 그들의 인증을 변경하도록 어떤 방법을 제공한다. 이것은 주로 패스워드이다. 사용자와 연관된 인증토큰(패스워드)들을 갱신할 때 필요하다.

보통 challenge/response 방식에 기반한 인증모듈 종류별로 각각 하나의 password 모듈씩이 존재한다.

4) session

이 모듈 인터페이스는 사용자 세션을 구성하고 관리한다. 이 인터페이스가 있는 모듈은 사용자의 홈디렉토리를 마운트하고 사용자의 사서함을 사용할 수 있게 하는등 액세스를 허용하는데 필요한 추가 작업을 수행할수도 있다.

이것은 사용자 홈 디렉토리를 마운팅/언마우팅하는 것과 로그인/로그아웃 그리고 사용자에게 제공하는 서비스를 제한/제공하는 것과 같은 것을 포함할 수 있다.

 

Control (제어 플래그)

모든 PAM 모듈은 호출 될때 성공 또는 실패 결과를 생성한다. 제어 플래그는 PAM에 결과와 어떤 관계가 있는지 알려준다. 모듈은 특정 순서로 스택 될 수 있으며, 제어 플래그는 특정 모듈의 성공 또는 실패가 사용자를 서비스에 인증하는 전체 목표에 얼마나 중요한지 결정한다.

PAM은 네가지의 통제 형식을 인식한다.

1) requisite

필수: 모듈 결과가 성공하면 다음 라인으로 넘어가고, 모듈 결과가 실패하면 첫번째 실패 required 또는 requisite 모듈 테스트를 반영한 메세지를 반환한다.

2) required

필요: 모듈 결과가 성공하면 다음 라인으로 넘어가고, 모듈 결과가 실패해도 다음 라인으로 넘어가서 성공하지 않은 경우의 최종결과는 실패이다.

3) sufficient

충분: 모듈 결과가 성공하였고 이전 required가 실패하지 않은 경우 서비스에 대해 인증되고, 모듈 결과가 실패하면 다음라인으로 넘어간다.

4) optional

옵션: 다른 모듈의 성공/실패가 없는 경우 optional 모듈의 결과로 결정된다. 하지만, 다른 모듈의 성공/실패가 있다면, optional 모듈의 결과는 무시된다.

5) include

포함: PAM 파일을 지정할 때 사용한다.

 

module-path(모듈 경로)

모듈경로는 PAM에게 어떤 모듈을 사용할 것인지(선택적으로) 그리고 그것을 어디서 찾을 지를 알려준다. 대부분 구성은 로그인 구성파일의 경우와 마찬가지로 모듈의 이름만 가지고 있다. 이와 같은 경우, PAM은 기본 PAM 모듈의 디렉토리에서(보통 /usr/lib/security) 모듈을 찾는다. 그러나 여러분의 리눅스가 리눅스 파일시스템의 표준을 따른다면 PAM 모듈은 /lib/security에 있다.

 

샘플 PAM 파일 login의 예제와 해석

1) auth required pam_securetty.so
root 사용자가 로그인을 시도하는 경우 /etc/securetty 파일을 보고, root 사용자에게 허용될수 있는 터미널을 확인한다. 파일에 tty가 나열되어 있지 않으면, 로그인을 시도는 'Login incorrect' 메세지와 함께 실패한다. 만약 일반 사용자라면 이 모듈은 무시된다.

2) auth required pam_unix.so nullok
사용자에게 암호를 묻는 메세지를 표시한 다음 /etc/passwd, /etc/shadow 파일에 저장된 정보를 확인한다. nullok는 암호에 공백을 허용하도록 하는 인자값이다.

3) auth required pam_nologin.so
/etc/nologin 파일이 있는지 여부를 확인하고, 파일이 없으면 인증에 성공하고, 파일이 있으면서 root 사용자가 아니라면 인증에 실패한다. root 사용자는 /etc/nologin 파일이 있어도 로그인 가능하다.

첫번째 auth 모듈이 실패하도라도 세개의 모듈 전부를 확인한다.(pam_securetty.so, pam_unix.so, pam_nologin.so)

4) account required pam_unix.so
필요한 계정 확인을 수행한다. 예를 들어 새도우 암호가 활성화 된 경우, 계정이 만료되었거나 사용자가 허용된 유예기간내에 암호를 변경하지 않았는지 확인한다.

5) password required pam_cracklib.so retry=3
암호가 만료된 경우 pam_cracklib.so 모듈의 암호 구성요소는 새 암호를 묻는 메시지를 표시한다. 그런 다음 새로 생성된 암호를 테스트하여 사전 기반 암호 해독 프로그램에서 쉽게 확인할 수 있는지 여부를 확인한다. retry=3는 테스트가 처음 실패한 경우 사용자가 강력한 암호를 작성할 기회가 2번 더 있음을 나타낸다.

6) password required pam_unix.so shadow nullok use_authok
사용자가 암호를 변경하는 경우의 지정이다. shadow는 사용자 암호를 업데이트 할 때 새도우 암호를 만들도록 모듈에 지시하는 인자이다. nullok는 모듈이 빈 암호로 변경할 수 있도록 지시하는 인자이다. nullok 인자가 없다면, 빈 암호(Null password)는 계정 잠금으로 처리된다. use_authok는 사용자에게 새 암호를 입력하라는 메시지를 표시 하도록 지시하는 인자이다. 이전 암호 모듈에 의해 기록된 암호를 승인한다. 이런식으로 모든 새 암호는 pam_cracklib.so 승인되기 전에 보안 암호에 대한 테스트를 통과해야 한다.

7) session required pam_unix.so
/var/log/secure 파일에 각 세션의 시작과 끝에 사용자 이름과 서비스 유형을 기록한다. 이 모듈은 추가 기능을 위해 다른 세션 모듈과 겹침으로써 보완 될수 있다.

 

2. 주요 PAM 모듈

/lib/security/pam_securetty.so : root 사용자로 로그인할 때 사용할 수 있는 장치를 제한할 때 사용

/etc/securetty 파일을 참조함, 일반 사용자들이 아닌 root 사용자의 대해 사용할 수 있는 장치(bash shell 등) 을 제한할 때 사용된다.

/lib/secureity/pam_listfile.so : 임의의 파일 의 대해 허용 및 차단의 대해 정의

/lib/security/nologin.so : 사용자의 로그인의 대한 제한의 대해 정의

/etc/nologin 파일이 존재 하면 root 사용자만 로그인이 가능하며 다른 사용자는 에러와 함깨 거부된다.

/lib/security/pam_pwquality.so : password의 설정 정책의 대한 비교 및 검사의 대해 정의

* 주요 인자값

minlen= 패스워드 숫자의 최소 자릿수를 정의 

최소 자릿수를 정의하나 소문자, 특수문자, 숫자 가 포함되면 1크레딧씩 카운트되어 정의된 값에서 지정 크래딧만큼 제외해도 정의 가능하다. ex) minlen=12 시 abcd2345!. = 12 - 3크레딧 = 9자리이상으로 10자리임에도 지정가능. 

dcredit= 숫자가 가질 수 있는 최대 크레딧 값 minlen에 영향을 미친다.

uncredit= 대문자가 가질 수 있는 최대 크레딧 값 minlen에 영향을 미친다.

lcredit= 소문자가 가질 수 있는 최대 크레딧 값 minlen에 영향을 미친다

inclass= 대문자, 소문자, 숫자, 특수기호 중 몇가지를 섞어야 하는지 정의

maxrepeat= 동일 문자의 반복의 가능 횟수의 대해 정의

 /lib/security/pam_faillock.so : 계정의 대한 접근 시도 회수의 대해 실패시도회수가 도달하면 접근을 차단.

 

[참고] man 또는 info를 통해 매뉴얼 확인가능, 매뉴얼이 제공 안될 경우 /usr/share/doc/pam-1.1.8 내에 정의되어있음.