Linux PAM 체계

꽃과 나비·2022년 4월 28일
0

PAM

PAM은 리눅스 시스템에서 사용하는 '인증 모듈(Pluggable Authentication Modules)'로써 응용 프로그램(서비스)에 대한 사용자의 사용 권한을 제어하는 모듈이다.
IGLOO

사용 예)

* 로그인 시 암호를 두 개 입력하도록 하는 경우 
* telnet 같은 경우는 따로 설정 파일이 없는데 이에 대한 제어를 하기 위한 경우
* 사용자에 대한 접근제어는 가능하지 않다.(방화벽에서는 사용자에 대해 차단 할 수 없음)
* 암호 정책 설정 할 때 

PAM 체계

PAM aware App.(ex:su, telnet)
* PAM library(ex:)
* PAM File(ex:)

* PAM Module
  	* /bin/su 
  	* /lib/libpam.so.0
  	* /etc/pam.d/su
	* /lib/security/\*

PAM FILE

#%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        required      pam_faildelay.so delay=2000000
auth        sufficient    pam_fprintd.so
auth        sufficient    pam_unix.so nullok try_first_pass
auth        requisite     pam_succeed_if.so uid >= 1000 quiet_success
auth        required      pam_deny.so
>
account     required      pam_unix.so
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 1000 quiet
account     required      pam_permit.so
>
password    requisite     pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok
password    required      pam_deny.so
>
session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
-session     optional      pam_systemd.so
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so

PAM aware APP에서 PAM library를 끌어다가 써야한다.(so는 동적 라이브러리를 가르킨다.)

ldd /usr/bin/su (동적 라이브러리 확인)
모듈이 PAM 라이브러리를 끌어다 쓰는 형식으로 활용될 수도 있다.

cat /etc/pam.d/su (프로그램이 실행 될 때 이 안에 있는 설정 파일을 읽어들여서 적용시킴)
PAM File 안에는 PAM Moudule을 끌어다 쓰는 것을 확인 할 수 있다.

PAM library는 C 언어로 작성되어있는데 끌어다 쓸 수 있는 형식으로 작성되어 있다.

PAM Package
|-|-|:-:|-|
|type |control|module-path|module-arguments|

■type
auth
ID/PASS 인증을 한다.

Account
액세스가 허용된 사용자인지 확인한다. LDAP 같은 경우는 서버에서 제공하는 ID/PASS를 가지고 확인

Password
사용자 암호를 변경하는데 사용한다.

session
세션 로그
마운트 해서 쓰는 경우 책임지게 된다

auth: su 명령어 같은 경우 스위칭 되기 전 사용자를 확인한다. 원격에서 들어오는 경우 확인
acconunt: root 사용자로 스위칭 하는 경우 실제로 사용자가 있는지 확인한다.

session: 세션에 성공했는지 나갔는지 로그를 남기게 된다.

auth -> account -> password -> session

requisite(필수)
성공하는 경우 -> 다음라인으로 넘어감
실패하는 경우 -> 반환 메시지 출력하고 스위칭 되지 않는다.

required(필요)
성공하는 경우 -> 다음라인으로 넘어감
실패하는 경우 -> 다음라인을 읽기는 하지만 최종적으로 실패하게 된다.

requisite 나 requred나 결과가 실패하게 되면 인증에 실패하게 되는데 프로그램에 따라 범용적으로 사용할 수 있도록 하기 위해서 설정을 다르게 하도록 한 것 같다.

sufficient(충분)
성공하는 경우 -> required가 성공한 경우는 인증 성공
실패하는 경우 -> 실패하면 다음라인으로 넘어감

optional(옵션)
다른 모듈의 성공/실패가 없으면 모듈의 결과가 반영
다른 모듈의 성공/실패가 있으면 모듈은 무시됨

include(포함)
매개 변수와 일치하는 구성 파일의 모든 행을 가져와서 모듈에 인수로 추가(auth라고 되어있는 부분만 가져옴)

라이브러리 사용
/lib/security 밑에 있는 라이브러리는 상대 경로로 써주어도 되지만 다른 경로에 있으면 절대경로로 사용해야 한다.

이러한 라이브러리는 인자를 가질 수 있다.

telnet은 내부적으로 login을 사용하고 있다. login은 PAM 설정 파일에 설정이 되어있으므로 결과적으로 telnet은 PAM에 의해 인증절차를 사용하게 된다.

#%PAM-1.0
auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so
/ pam_securetty.so 모듈이 지정해 놓은 보안 규칙을 만족해야만 로그인이 허용된다는 설정이다. 이 모듈은 /etc/securetty 파일에서 지정되어 있는 tty에서 요청한 슈퍼유저만 로그인을 허용한다. /
auth include system-auth
account required pam_nologin.so
account include system-auth
password include system-auth

pam_selinux.so close should be the first session rule

session required pam_selinux.so close
session optional pam_keyinit.so force revoke
session required pam_loginuid.so
session include system-auth
session optional pam_console.so

pam_selinux.so open should only be followed by sessions to be executed in the user context

session required pam_selinux.so open

● session required pam_unix.so
● session => lastlog, last 등 로그를 남기도록 함

other
프로그램이 pam을 쓰기로 했는데 파일이 없거나 모듈이 없는 경우 deny가 된다.

[참고] man 명령어를 export LANG=KR_ko.UTF-8 인 경우 옛날 페이지가 보여지게 된다.

pam 라이브러리 보기

man –k pam_

usr/share/doc/pam-1.1.8/html

usr/share/doc/pam-1.1.8/txts

들으면서 정리

/etc/pam.d/remote
콘솔 케이블을 연결할 때 사용한다.
console

  • keyboard
  • monitor

keyboard가 없는 경우 노트북에 콘솔케이블을 연결하게 된다.
console 설정을 해야한다. (ex: putty, xshell) port가 여러개 있기 때문에 연결 설정을 해주어야 한다.

/etc/pam.d/

  • pam.cracklib 패스워드의 강도 체크
    현재는 대체가 된 라이브러리 최신버전에서 CentOS 7에서 찾으려고 하였지만 찾지 못했다.

크레딧을 받게 되면 암호의 길이를 줄일 수 있다. 기본값은 1이다. credit은 credit=N(N => -1, -2 ...)와 같이 설정할 수 있다. 패스워드를 최소 12개의 길이를 설정하게 되었을 때 3개의 크레딧이 있으면 9글자만 설정해도 사용할 수 있도록 하게된다.

->
*/etc/pam.d/pwquality.so
기존 cracklib에 대한 인자 값을 바꾸도록 설정해야 했지만 qwquality.so는 /etc/security/qwquality.conf에서 바꿀 수 있도록 하였다.
qwquality는 cracklib을 감싸고 있다.

  • system-auth -> system-auth-ac
  • pam.deny -> other 파일을 체크하여
  • pam_wheel.so 모듈이 사용되기 시작하면 wheel 그룹에 속해있으면 해당 명령어를 root권한으로 사용할 수 있도록 한 것이다. su 명령어에 제한을 두기 위해 사용된다.
    -> CentOS7부터 /etc/sudoers
  • pam_rootok: superuser가 암호 입력 없이 해당 서비스에 대한 접근을 허용 할 때 사용
  • pam_tally : 몇 번의 암호 입력 실패시에 락을 걸 것인지 정하고 제한되는 시간을 설정 할 수 있다. 이 또한 CentOS 7 버전에서 없었다. pam_tally2가 있고 pam_faillock.so으로 바꿔서 사용하면 된다.
  • pam_unix: ID/PASS를 인증하는 기본설정 /etc/shadow, /etc/passwd에 대한 내용이 있고 password aging 에 대한 내용이 있다.
    /etc/pam.d/system-auth-ac 에 사용하는 모듈이다.

PAM 파일의 모듈의 기능을 찾는 법을 알아보자

1) /etc/pam.d file에 대한 내용 보기

cat passwd -> include system-auth

cat system-auth

2) man 정의된 내용 확인하기

man pam.env

3) 실제 어떤 PAM 파일에서 사용되는지 확인하기
PAM(/llib64/security/pam.env.so)

cd /lib/security (/usr/lib64/security)

find /etc/pam.d –type f –exec grep –l pam_env.so {} \;

system-auth에서 사용되는 것을 확인하였다.
GNOME-Display manager

4) PAM 파일

cat /etc/pam.d/crond

daemon은 데몬이 다시 재기동 될 때 PAM 파일이 읽혀지게 된다.

/etc/pam.d/sshd
sshd의 사용자를 제어하는 방법은 2개의 파일이 있는데 하나는 pam 파일에 대한 것이고 하나는 sshd의 파일에 대한 것이다.

(주의) pam 파일은 여러 프로그램들이 참조하기 때문에 설정하는 것을 주의해야한다.
(에러제어) /var/log/messages, /var/log/secure

profile
Nice meet you!!

0개의 댓글

관련 채용 정보