OS Linux[centos,RHEL]/구조 (부팅 및 커널)

PAM(Pluggable Authentication Modules)

infra 2021. 11. 5. 23:14

해당 pam 내용은 실무에서 ISMS 보안 취약점 점검 스크립트 수정해야 할 사항들이 여러 개 있다. 그전에 이 해당 내용을 전제로 이해를 한 뒤 수정 하는 것이 좋다.

[1.pam 정의 및 관련 디렉터리 특징 분석]

 

[1. PAM 의 정의]

- 장착형 인증 모듈, 플러그인 방식의 인증 모듈, 응용프로그램에 대한 인증 형태, 사용자 권한, 접근 자원 등을 선택할 수 있고 유동성이 뛰어남

- 필요한 공유 라이브러리의 묶음을 제공하여 PAM을 사용하는 응용프로그램을 다시 컴파일하지 않아도 인증 방법을 변경할 수 있음

- Linux-PAM 프로젝트의 목적은 권한을 부여하는 소프트웨어의 개발과 안전하고 적정한 인증의 개발을 분리하려는 데 있음

 

 


[2. pam 관련 주요 디렉터리 ]

2-1 . /etc/pam.d

 

모든 어플리케이션과 서비스 데몬을 위한 일반적인 인터페이스를 제공하기 위한 구성 파일들이 있음

특정 서비스에 대한 요청이 발생하면 /etc/pam.d/ 디렉토리 안의 파일을 설정을 참조함.

(ssh파일 안에서 password-auth를 불러 읽는 형태)

PAM을 사용하는 어플리케이션에 해당하는 설정파일들이 있으며 파일명은 서비스 이름

 

 

6/7/8  버젼의 /etc/pam.d 디렉터리

 

system-auth : 원격 구성에서 사용할 수 없는 모듈을 포함하여 콘솔에서 사용(즉, 직접 콘솔에 사용하는 모듈)

password-auth : sshd, vsftpd와 같은 원격 서비스가 참조

 

일반적으로 system-auth, password-auth 둘 모두 똑같이 맞춰주고 있음.

 

 

2-2. 지원하는 모듈 목록 파악

/lib  경로

 

x86 기준으로 32 bit 또는 64 bit의 보안 모듈이 있으며 경로는 다음과 같다.

 

lib : 32bit 기준 보안 모듈  경로 => /lib/security

(7,8 버젼에는 해당 /lib이하의 security 디렉터리가 존재하지 않음)

 

lib64 : 64bit 기준 보안 모듈 경로=> /lib64/security

 

 

/lib64/security

pam_cracklib 해당 파일은 RHEL5,6 버젼에서 복잡도를 설정하는 모듈로 쓰이며,

RHEL7부터는 pam_pwquality가 이를 대체한다.

 

 

 

 

설치된 pam 버전에 따라 사용할 수 있는 module이 상이하므로 이 디렉토리에 없는 모듈을 넣어서 system-auth, password-auth등 인증 관련 파일을 작성하지 않도록 주의해야 함.

-> 실무 : 고객사에서 보안 모듈을 임의로 생성하는 경우에도 /lib64/security/아래에 옮겨 놓고 사용

RHEL5 RHEL6 RHEL7 RHEL8
pam_tally pam_tally
pam_tally2
pam_faillock

pam_tally2
pam_faillock

pam_console_apply
pam_timestamp_check

pamon

 

2-3. /etc/security

6,7,8 버젼에 따른 /etc/security 경로의 파일 또는 디렉터리

 

각종 pam 모듈의 conf 파일이 있는 디렉토리.

대표적인 예로 pam_limits 모듈의 conf 파일인 limits.conf가 있음.

 

 

2-4. /usr/share/doc/pam- x.x.x /        [ *  x.x.x = pam의 버젼]

 

pam에서 제공하는 모듈에 대해 사용 설명서가 포함되어 있는 디렉토리

 

graphical.target 경우엔 /usr/share/doc/pam-1.1.x/ html 로 브라우저에 넣어서 메뉴얼 파악 가능하지만

man 명령어가 설치되어있지 않고,minimal install인 경우 /usr/share/doc/pam-1.1.x/txts

디렉토리 내의 파일들을 보고 pam 모듈 사용법을 참조할 수 있음

 

보통 [/usr/share/doc 경로는 document 문서 관련 내용이 담겨있는 경로!!]

 

6,7,8 버젼에 따른 /usr/share/doc/pam 문서 경로

6,7버젼과 달리 8버젼부터는 따로 pam의 버젼이 나오지 않음을 확인 할 수 있다.

pam에서 제공하는 모듈에 대해 사용 설명서가 포함되어 있는 디렉토리

 

graphical.target 경우엔 /usr/share/doc/pam-1.1.x/ html 로 브라우저에 넣어서 메뉴얼 파악 가능하지만

man 명령어가 설치되어있지 않고,minimal install인 경우 /usr/share/doc/pam-1.1.x/txts

디렉토리 내의 파일들을 보고 pam 모듈 사용법을 참조할 수 있음


[3. PAM 구성 파일 포맷 형식]

경로 : /etc/system-auth   /password-auth 참조

 

https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/pdf/security_guide/red_hat_enterprise_linux-7-security_guide-en-us.pdf

 

 

레드햇 공식 홈페이지의 security guide 를 참조하면 된다.

 

구성 컬럼 (세로 줄)

1번째 컬럼

module_interface & Type
2번째 컬럼

Control_Flag
3번째 컬럼

Module_name & path
4번째 컬럼

module_argument

 

 

1. module_ interface & Type

 

어떤 타입의 인증이 사용될 것인지 표시한다.

같은 타입의 모듈이어야 중첩되어 작동하므로 반드시 같은 타입끼리 이어서 작성해야 된다.

4개의 모듈 타입이 존재하며 앞에 '-'를 붙이면, 없는 모듈은 시스템에 로딩되지 않음.

1. module type의 첫번째 컬럼 설명
account 사용자가 해당 서비스에 접근이 허용되었는지, 패스워드가 기간이 만료되었는지 등
auth 패스워드나 생체인증 방식을 통해 사용자가 자신이 주장하는 사용자가 맞는지 검증
password 사용자가 인증 방식을 업데이트 할 수 있음(ex. 비밀번호 변경)
session 사용자가 인증 받기 전후에 해야 하는 task들을 나타냄
- 모듈은 시스템에 load되지 않는다.

 

 

2. control_flag : 모듈이 인증 과정에 성공하지 못했을 때 PAM-API의 동작을 나타냄

 

2-1.

2. control flag의 두번째 컬럼 설명
required 같은 서비스나 타입의 남은 모듈을 호출한 후에 최종적으로 인증에 실패했다고 전달한다.
requisite 즉시 어플리케이션에게 인증 실패를 전달한다.
sufficient 이 모듈이 성공하면 인증 요구 사항을 충족시킨 것으로 보고 다른 모듈을 시도하지 않고 즉시 어플리케이션에게 인증 성공을 반환한다.

하지만 앞서 동작한 required 모듈에서 실패하면 sufficient가 성공하더라도 인증 실패로 처리한다.
optional 이 모듈의 성공이나 실패는 중요하지 않다는 것을 의미하며, 이 서비스+타입과 연관된 스택에 이 모듈만 존재할 때나 중요하다.

이외에도 value값과 action값을 넣는 리스트도 있다.

 

예시는 다음과 같다.

노란색 네모 체크된 부분처럼 표시 하는 것이다.

 

2-2

[value=action]

 

각 value와 action에 올 수 있는 값 리스트
value success, open_err, symbol_err, service_err, system_err, buf_err, perm_denied, auth_err, cred_insufficient, authinfo_unavail, user_unknown, maxtries, new_authtok_reqd, acct_expired, session_err, cred_unavail, cred_expired, cred_err, no_module_data, conv_err, authtok_err, authtok_recover_err, authtok_lock_busy, authtok_disable_aging, try_again, ignore, abort, authtok_expired, module_unknown, bad_item, conv_again, incomplete, and default.
action ignore, bad, die, ok, done, N, reset

 

 

3.module-name

세번째 컬럼은 모듈명을 의미하며,

어떤 모듈을 사용할지의 명시하는 것이고, .so 라는 파일명으로 체크되어 있다.

 

4. module-arguments 

4번쨰 컬럼은 모듈의 argument를 의미한다.

모듈에게 전달되는 인수를 나타내며 각 모듈별로 사용되는 옵션값이 다르므로 확인하여 적용해야 한다.

 

 

RHEL/CentOS 6버젼 관련 참고 문서 링크 또는 #man pam or #man pam.d 에서 확인하기

 https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/managing_smart_cards/pam_configuration_files

 

 


[4. 주요 모듈 의 종류]

 

1. pam_tally2
:  로그인 실패 횟수에 따른 잠금 및 잠금 시간 등을 설정할 수 있음

/etc/system-auth auth required pam_tally2.so onerr=fail deny=3 unlock_time=1800
  account required    

deny=N         password 틀린 횟수가 N번을 초과하면 잠김
unlock_time=N   deny값을 초과하여 잠기면 N초 뒤에 해제


- 계정 로그인 실패 정보 조회 명령어 # pam_tally2 -u <user>
- 잠겼을 때 실패 횟수 초기화 명령어 # pam_tally2 -r -u <user>

 

RHEL5에서는 no_magic_root 옵션을 주어 root가 잠기지 않도록 하였으나 

RHEL 6버젼 이상에선 pam_tally2에서는 default로 root는 틀려도 잠기지 않음.
참고링크 : https://access.redhat.com/solutions/4303''

 

How to lock out a user to login a system after a set number of failed attempts in Red Hat Enterprise Linux using pam_tally/pam_t

How to lock out a user to login a system after a set number of failed attempts How to limit/restrict user(s) from login after failed login attempts How to lockout a user to login on server using pam_tally/pam_tally2 module How do I configure PAM stack usin

access.redhat.com

 

2.pam_cracklib

system-auth의 예시

password    requisite    pam_cracklib.so    try_first_pass  retry=3  type= dcredit=1  ocredit=1  minlen=8

minlen=N  최소 N글자를 충족해야 함

dcredit=N   숫자 N개 포함
ucredit=N   대문자 N개 포함
lcredit=N    소문자 N개 포함
ocredit=N   특수문자 N개 포함
  retry=N  다시 비밀번호 물어보는 prompt 발생 횟수


RHEL7 이후버젼은  pam_pwquality의 경우 /etc/security/pwquality.conf 파일에서 위 값을 수정하는 것이 권고이나
system-auth 파일에 명시하여도 적용 됨.

 

6,7,8버젼에 따른 /etc/pam.d 및 7버젼이상 pwquality.conf 파일 위치

7버젼 이하 버젼까지는 symbolic link가 같은 디렉터리 위치(/etc/pam.d)에 system-auth-> system-auth-ac

password-auth -> password-auth-ac 로 되어있으나,

8버젼부터는 /etc/authselect 이하의 파일로 symbolic link되어있다.

 

 

 

3.pam_unix

 

password   sufficient   pam_unix.so   sha512  shadow  nullok   try_first_pass   use_authtok   remember=2

  remember=N 지난 N개까지의 비밀번호를 /etc/security/opasswd에 저장해두고 같은 비밀번호로 바꾸지 못하게 하기위해 쓰임

 

4.pam_succeed_if

조건식에 따라 다음 모듈에 대한 PAM API의 행동을 변경할 수 있다.
특정 계정이 패스워드를 deny보다 많이 틀려도 잠그지 않도록 설정할 때 많이 사용한다.

참고링크 : https://access.redhat.com/solutions/66176

auth [success=1 default=ignore] pam_succeed_if.so user in leesh특정유저명
auth        required      pam_tally2.so onerr=fail deny=3 unlock_time=300
auth        sufficient    pam_unix.so nullok try_first_pass

 

 

5.pam_faillock

pam-1.1.1-8.el6 버전에서 추가된 모듈이며 pam_tally2와 같은 기능을 제공

 

auth        required      pam_faillock.so preauth silent audit deny=3 unlock_time=600
auth        [default=die] pam_faillock.so authfail audit deny=3

account     required      pam_faillock.so

failure 확인 명령어    # faillock --user <username>
failure 초기화 명령어  # faillock --user <username> --reset
참고링크: https://access.redhat.com/solutions/62949
failure 조회 시, pam_tally2는 가장 마지막에 틀린 시점의 정보를 표시하고 pam_faillock은 deny값을 초과하게 만든 시점의 정보를 표시함

 


[5. 버젼 별 default system-auth]through RHEL/CentOS 5,6,7,8

 

5version에는 system-auth만 있고, password-auth는 없다.

5/6/7/8 버젼에 따라 default  파일은 다음과 같다.

 

RHEL 5.9 기준 경로 /etc/pam.d/system-auth

#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth        required      pam_env.so
auth        sufficient    pam_unix.so nullok try_first_pass
auth        requisite     pam_succeed_if.so uid >= 500 quiet
auth        required      pam_deny.so

account     required      pam_unix.so
account     sufficient    pam_succeed_if.so uid < 500 quiet
account     required      pam_permit.so

password    requisite     pam_cracklib.so try_first_pass retry=3
password    sufficient    pam_unix.so md5 shadow nullok try_first_pass use_authtok
password    required      pam_deny.so

session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so

 

6버젼 이후로는 system-auth, password-auth 확인

경로 /etc/pam.d/system-auth 또는 /etc/pam.d/password-auth

 

RHEL 6.8 기준




 

 

CentOS 7. 기준



 

 

CentOS 8.4 기준