해당 pam 내용은 실무에서 ISMS 보안 취약점 점검 스크립트 수정해야 할 사항들이 여러 개 있다. 그전에 이 해당 내용을 전제로 이해를 한 뒤 수정 하는 것이 좋다.
[1.pam 정의 및 관련 디렉터리 특징 분석]
[1. PAM 의 정의]
- 장착형 인증 모듈, 플러그인 방식의 인증 모듈, 응용프로그램에 대한 인증 형태, 사용자 권한, 접근 자원 등을 선택할 수 있고 유동성이 뛰어남
- 필요한 공유 라이브러리의 묶음을 제공하여 PAM을 사용하는 응용프로그램을 다시 컴파일하지 않아도 인증 방법을 변경할 수 있음
- Linux-PAM 프로젝트의 목적은 권한을 부여하는 소프트웨어의 개발과 안전하고 적정한 인증의 개발을 분리하려는 데 있음
[2. pam 관련 주요 디렉터리 ]
2-1 . /etc/pam.d
모든 어플리케이션과 서비스 데몬을 위한 일반적인 인터페이스를 제공하기 위한 구성 파일들이 있음
특정 서비스에 대한 요청이 발생하면 /etc/pam.d/ 디렉토리 안의 파일을 설정을 참조함.
(ssh파일 안에서 password-auth를 불러 읽는 형태)
PAM을 사용하는 어플리케이션에 해당하는 설정파일들이 있으며 파일명은 서비스 이름
system-auth : 원격 구성에서 사용할 수 없는 모듈을 포함하여 콘솔에서 사용(즉, 직접 콘솔에 사용하는 모듈)
password-auth : sshd, vsftpd와 같은 원격 서비스가 참조
일반적으로 system-auth, password-auth 둘 모두 똑같이 맞춰주고 있음.
2-2. 지원하는 모듈 목록 파악
x86 기준으로 32 bit 또는 64 bit의 보안 모듈이 있으며 경로는 다음과 같다.
lib : 32bit 기준 보안 모듈 경로 => /lib/security
(7,8 버젼에는 해당 /lib이하의 security 디렉터리가 존재하지 않음)
lib64 : 64bit 기준 보안 모듈 경로=> /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_timestamp_check |
pamon |
2-3. /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버젼부터는 따로 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 참조
레드햇 공식 홈페이지의 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 에서 확인하기
[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''
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 파일에 명시하여도 적용 됨.
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 기준 |
'OS Linux[centos,RHEL] > 구조 (부팅 및 커널)' 카테고리의 다른 글
centos6,7 / ubuntu 16.04 파일시스템 (find,stat, (0) | 2021.11.03 |
---|