참고 : https://linuxmaster.net/pam/linux-pam/Linux-PAM_SAG.html
PAM 모듈 Pluggable Authentication Modules
- 사용자를 인증하는 방식을 로컬 시스템 관리자가 선택할 수 있게 해주는 인증 모듈
- 공유 라이브러리이며 인증 모듈의 교체/추가/삭제 가능
- 권한부여 소프트웨어 개발을 안전하고 적절한 인증 체계의 개발과 분리하는 것이 목적
- 인증 프로그램을 일일히 구현할 필요가 없고 PAM을 활용하면 더 쉽게 구현 가능
- 악의적으로 이용할 경우 인증하지 않고 계정에 접근 가능
- sshd, su 등 많은 응용프로그램들이 PAM 이용
동작 원리
- 사용자 인증이 필요하면 프로그램이 PAM 함수(동적 라이브러리 내) 호출
- PAM이 호출한 응용프로그램의 인증 설정 파일을 검사
- 설정파일이 없으면 기본 설정 파일을 사용
- 구문에 맞은 인증 모듈을 통해 여러가지 검사를 수행
- 인증 결과 메시지를 응용프로그램에 전달하고, 응용프로그램이 인증 결정
인증 절차
- 사용자가 서비스를 이용하기 위해 프로그램 접근
- 프로그램(프로세스, 로컬, 데몬)은 PAM에 인증 요청
- PAM은 /etc/pam.d 디렉터리에서 요청 프로세스 이름에 해당하는 설정 파일 검사
- 없으면 기본 설정 파일other 사용
- 설정 파일 구문에 의해 PAM 호출하여 결과 메시지를 프로세스에 반환
- 프로세스는 반환된 결과에 따라 적절한 행동 수행
관련 디렉터리
1) /etc/pam.d
- 프로그램별 설정파일 디렉터리
sshd => /etc/pam.d/sshd
2) /etc/security
- 추가 설정 파일 디렉터리.
/lib64/security/pam_access.so => access.conf
3) /lib/security
- 32비트 PAM 관련 모듈들
4) /lib64/security
- 64비트 PAM 관련 모듈들
+ /lib 디렉터리는 /usr/lib 디렉터리의 심볼릭 링크 파일
+ /lib64 디렉터리는 /usr/lib64 디렉터리의 심볼릭 링크 파일
설정 파일 구조
1. Type
- auth 인증: 신원 확인 과정, id-pw 확인
- account 계정: 인증과 상관없이 계정 관리 수행.
- password 비밀번호: 비밀번호 변경/갱신 작업
- session 세션: 사용자 인증 수행 전후에 수행. 로그인/로그아웃시 실행되어야 하는 작업 처리. 로그인 시간 제한(세션 타임아웃) 포함될 수 있음
+) 기호 구분
기호 - : 비활성화
기호 # : 주석처리
2. Control-flag
- required : 모듈이 실패하면, 다음 모듈의 인증 요청을 수행하되 최종적으로 인증은 거부된다.
- sufficient : 모듈이 성공하면 즉시 성공하며 다음 모듈은 실행되지 않는다.
(단, required가 실패인 경우 실패로 처리. 그 외 경우 실패해도 인증에 영향이 없다.)
- requisite : 필요한 경우에만 실행되고 실패하면 즉시 인증을 거부한다. 성공시 다음 모듈 수행.
- optional : 선택사항, 성공/실패 여부에 관계없이 인증이 계속된다.
- include : 다른 PAM 설정 파일을 통해 현재 설정에 포함시킨다.
- substack : 다른 PAM 설정 파일을 현재 설정의 하위 스택으로 포함한다.
3. Module-path
- PAM 모듈의 경로 (절대경로, 상대경로)
4. Module-argument
- 모듈에 전달되는 추가 인수들. 생략 가능.
man 명령어를 통해 pam 모듈의 설명을 볼 수 있다
ex) man pam_wheel
( ls /usr/lib64/security 해보면 pam 모듈들 확인 가능 )
yum -y install lsof
lsof | head
lsof
열린 파일에 대한 정보를 보여주는 명령어
네트워크 소켓, 파이프, 디렉터리, 장치 등 모든 I/O 리소스 포함
특정 사용자/특정 프로세스/파일 등 열어놓은 리스트를 확인하는 용도로 사용
lsof 명령어에서 PID를 확인하고
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
pickup 1145 postfix 0u CHR 1,3 0t0 6513 /dev/null
pickup 1145 postfix 1u CHR 1,3 0t0 6513 /dev/null
pickup 1145 postfix 2u CHR 1,3 0t0 6513 /dev/null
pickup 1145 postfix 3r FIFO 0,9 0t0 20895 pipe
pickup 1145 postfix 4w FIFO 0,9 0t0 20895 pipe
pickup 1145 postfix 5u unix 0xffff9dffb729dd80 0t0 20825 socket
pickup 1145 postfix 6u unix 0xffff9dffb729b300 0t0 20823 public/pickup
pickup 1145 postfix 7u unix 0xffff9dffb6e80440 0t0 20927 socket
pickup 1145 postfix 8u a_inode 0,10 0 6509 [eventpoll]
pickup 1145 postfix 9r FIFO 0,9 0t0 20945 pipe
pickup 1145 postfix 10w FIFO 0,9 0t0 20945 pipe
pickup 1145 postfix 92w FIFO 0,9 0t0 20909 pipe
ll /proc/1145/fd 리스트를 보면
합계 0
lrwx------. 1 root root 64 4월 27 14:40 0 -> /dev/null
lrwx------. 1 root root 64 4월 27 14:40 1 -> /dev/null
l-wx------. 1 root root 64 4월 27 14:40 10 -> pipe:[20945]
lrwx------. 1 root root 64 4월 27 14:40 2 -> /dev/null
lr-x------. 1 root root 64 4월 27 14:40 3 -> pipe:[20895]
l-wx------. 1 root root 64 4월 27 14:40 4 -> pipe:[20895]
lrwx------. 1 root root 64 4월 27 14:40 5 -> socket:[20825]
lrwx------. 1 root root 64 4월 27 14:40 6 -> socket:[20823]
lrwx------. 1 root root 64 4월 27 14:40 7 -> socket:[20927]
lrwx------. 1 root root 64 4월 27 14:40 8 -> anon_inode:[eventpoll]
lr-x------. 1 root root 64 4월 27 14:40 9 -> pipe:[20945]
l-wx------. 1 root root 64 4월 27 14:40 92 -> pipe:[20909]
파일디스크립터FD
0 표준입력 1 표준출력 2 표준에러
기본 파일 디스크립터 외에 숫자가 부여되어 연결된 것이 보인다.
1) COMMAND : 파일을 열어놓은 프로세스 이름/명령어
2) PID : 프로세스 ID
3) TID : 스레드 ID, 공란이면 메인쓰레드를 의미
4) FD : 파일 디스크립터
- cwd : 현재 작업 디렉토리
- rtd : 실행 파일의 메모리 이미지 (루트 디렉토리)
- txt : 실행파일의 코드와 데이터
- mem : 메모리 매핑 파일
- 0u : 표준 입력
- 1u : 표준 출력
- 2u : 표준 에러
- 9r, 10w, 4w ... : 해당 번호에 대한 r 읽기, w 쓰기 권한 u는 r+w
5) TYPE : 파일 유형
- DIR : 디렉터리
- CHR : 문자 기반 장치 파일
- REG : regular일반파일
- unix : 유닉스 도메인 소켓
- FIFO : 파이프 파일
6) DEVICE : 파일이 있는 디바이스
7) SIZE/OFF : 파일의 크기/오프셋
8) NODE : 파일 시스템 노드 번호
9) NAME : 파일 경로/이름
pstree -p | grep ssh
|-sshd(984)---sshd(1260)---bash(1264)-+-grep(3894)
=> 나의 sshd pid번호를 확인
lsof -p 984 sshd 984 root mem REG 253,0 61560 15632 /usr/lib64/libnss_files-2.17.so sshd 984 root mem REG 253,0 68192 59491 /usr/lib64/libbz2.so.1.0.6 => libbz2.so.1 => /lib64/libbz2.so.1 (0x00007f5f456cd000) sshd 984 root mem REG 253,0 99944 59520 /usr/lib64/libelf-0.176.so => libelf.so.1 => /lib64/libelf.so.1 (0x00007f5f458dd000) sshd 984 root mem REG 253,0 19896 59526 /usr/lib64/libattr.so.1.1.0 => libattr.so.1 => /lib64/libattr.so.1 (0x00007f5f45af5000) sshd 984 root mem REG 253,0 15688 73922 /usr/lib64/libkeyutils.so.1.5 => libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007f5f45cfa000) sshd 984 root mem REG 253,0 67104 186365 /usr/lib64/libkrb5support.so.0.1 => libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007f5f45efe000) sshd 984 root mem REG 253,0 11392 6405 /usr/lib64/libfreebl3.so => libfreebl3.so => /lib64/libfreebl3.so (0x00007f5f4610e000) sshd 984 root mem REG 253,0 255896 25833 /usr/lib64/libnspr4.so => libnspr4.so => /lib64/libnspr4.so (0x00007f5f46311000) sshd 984 root mem REG 253,0 20040 25845 /usr/lib64/libplc4.so => libplc4.so => /lib64/libplc4.so (0x00007f5f46550000) sshd 984 root mem REG 253,0 15752 25846 /usr/lib64/libplds4.so => libplds4.so => /lib64/libplds4.so (0x00007f5f46755000) sshd 984 root mem REG 253,0 203144 25847 /usr/lib64/libnssutil3.so => libnssutil3.so => /lib64/libnssutil3.so (0x00007f5f46959000) sshd 984 root mem REG 253,0 1257728 250605 /usr/lib64/libnss3.so => libnss3.so => /lib64/libnss3.so (0x00007f5f46b8a000) sshd 984 root mem REG 253,0 168336 250606 /usr/lib64/libsmime3.so => libsmime3.so => /lib64/libsmime3.so (0x00007f5f46eb9000) sshd 984 root mem REG 253,0 370584 250607 /usr/lib64/libssl3.so => libssl3.so => /lib64/libssl3.so (0x00007f5f470e1000) sshd 984 root mem REG 253,0 470376 186382 /usr/lib64/libssl.so.1.0.2k => libssl.so.10 => /lib64/libssl.so.10 (0x00007f5f4733a000) sshd 984 root mem REG 253,0 121320 243013 /usr/lib64/libsasl2.so.3.0.0 => libsasl2.so.3 => /lib64/libsasl2.so.3 (0x00007f5f475ac000) sshd 984 root mem REG 253,0 142144 15640 /usr/lib64/libpthread-2.17.so => libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f5f477c9000) sshd 984 root mem REG 253,0 88720 84 /usr/lib64/libgcc_s-4.8.5-20150702.so.1 => libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f5f479e5000) sshd 984 root mem REG 253,0 338672 282240 /usr/lib64/libdw-0.176.so => libdw.so.1 => /lib64/libdw.so.1 (0x00007f5f47bfb000) sshd 984 root mem REG 253,0 19384 59543 /usr/lib64/libgpg-error.so.0.10.0 => libgpg-error.so.0 => /lib64/libgpg-error.so.0 (0x00007f5f47e4c000) sshd 984 root mem REG 253,0 535064 73699 /usr/lib64/libgcrypt.so.11.8.2 => libgcrypt.so.11 => /lib64/libgcrypt.so.11 (0x00007f5f48051000) sshd 984 root mem REG 253,0 61752 73912 /usr/lib64/liblz4.so.1.8.3 => liblz4.so.1 => /lib64/liblz4.so.1 (0x00007f5f482d2000) sshd 984 root mem REG 253,0 157424 25947 /usr/lib64/liblzma.so.5.2.2 => liblzma.so.5 => /lib64/liblzma.so.5 (0x00007f5f484e1000) sshd 984 root mem REG 253,0 43712 15644 /usr/lib64/librt-2.17.so => librt.so.1 => /lib64/librt.so.1 (0x00007f5f48707000) sshd 984 root mem REG 253,0 1136944 15622 /usr/lib64/libm-2.17.so => libm.so.6 => /lib64/libm.so.6 (0x00007f5f4890f000) sshd 984 root mem REG 253,0 20048 59530 /usr/lib64/libcap.so.2.22 => libcap.so.2 => /lib64/libcap.so.2 (0x00007f5f48c11000) sshd 984 root mem REG 253,0 402384 25927 /usr/lib64/libpcre.so.1.2.0 => libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f5f48e16000) sshd 984 root mem REG 253,0 23968 59536 /usr/lib64/libcap-ng.so.0.0.0 => libcap-ng.so.0 => /lib64/libcap-ng.so.0 (0x00007f5f49078000) sshd 984 root mem REG 253,0 115816 15624 /usr/lib64/libnsl-2.17.so => libnsl.so.1 => /lib64/libnsl.so.1 (0x00007f5f4927e000) sshd 984 root mem REG 253,0 2156592 15614 /usr/lib64/libc-2.17.so => libc.so.6 => /lib64/libc.so.6 (0x00007f5f49498000) sshd 984 root mem REG 253,0 15856 25949 /usr/lib64/libcom_err.so.2.1 => libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007f5f49866000) sshd 984 root mem REG 253,0 210784 186357 /usr/lib64/libk5crypto.so.3.1 => libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007f5f49a6a000) sshd 984 root mem REG 253,0 967840 186363 /usr/lib64/libkrb5.so.3.3 => libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00007f5f49c9d000) sshd 984 root mem REG 253,0 320720 186353 /usr/lib64/libgssapi_krb5.so.2.2 => libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007f5f49f86000) sshd 984 root mem REG 253,0 109976 15642 /usr/lib64/libresolv-2.17.so => libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f5f4a1d3000) sshd 984 root mem REG 253,0 40600 15618 /usr/lib64/libcrypt-2.17.so => libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007f5f4a3ed000) sshd 984 root mem REG 253,0 90248 25939 /usr/lib64/libz.so.1.2.7 => libz.so.1 => /lib64/libz.so.1 (0x00007f5f4a624000) sshd 984 root mem REG 253,0 14424 15648 /usr/lib64/libutil-2.17.so => libutil.so.1 => /lib64/libutil.so.1 (0x00007f5f4a83a000) sshd 984 root mem REG 253,0 61880 261187 /usr/lib64/liblber-2.4.so.2.10.7 => liblber-2.4.so.2 => /lib64/liblber-2.4.so.2 (0x00007f5f4aa3d000) sshd 984 root mem REG 253,0 352512 261189 /usr/lib64/libldap-2.4.so.2.10.7 => libldap-2.4.so.2 => /lib64/libldap-2.4.so.2 (0x00007f5f4ac4c000) sshd 984 root mem REG 253,0 19248 15620 /usr/lib64/libdl-2.17.so => libdl.so.2 => /lib64/libdl.so.2 (0x00007f5f4aea1000) sshd 984 root mem REG 253,0 2521144 186380 /usr/lib64/libcrypto.so.1.0.2k => libcrypto.so.10 => /lib64/libcrypto.so.10 (0x00007f5f4b0a5000) sshd 984 root mem REG 253,0 203688 282253 /usr/lib64/libsystemd.so.0.6.0 => libsystemd.so.0 => /lib64/libsystemd.so.0 (0x00007f5f4b508000) sshd 984 root mem REG 253,0 155744 25936 /usr/lib64/libselinux.so.1 => libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f5f4b739000) sshd 984 root mem REG 253,0 61680 204515 /usr/lib64/libpam.so.0.83.1 => libpam.so.0 => /lib64/libpam.so.0 (0x00007f5f4b960000) sshd 984 root mem REG 253,0 127184 59538 /usr/lib64/libaudit.so.1.0.0 => libaudit.so.1 => /lib64/libaudit.so.1 (0x00007f5f4bb6f000) sshd 984 root mem REG 253,0 42520 73895 /usr/lib64/libwrap.so.0.7.6 => libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f5f4bd98000) sshd 984 root mem REG 253,0 11344 250596 /usr/lib64/libfipscheck.so.1.2.1 => libfipscheck.so.1 => /lib64/libfipscheck.so.1 (0x00007f5f4bfa3000) sshd 984 root mem REG 253,0 163312 15607 /usr/lib64/ld-2.17.so => /lib64/ld-linux-x86-64.so.2 (0x00007f5f4c47b000) |
ldd /usr/sbin/sshd linux-vdso.so.1 => (0x00007ffd5bfd2000) libfipscheck.so.1 => /lib64/libfipscheck.so.1 (0x00007f5f4bfa3000) libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f5f4bd98000) libaudit.so.1 => /lib64/libaudit.so.1 (0x00007f5f4bb6f000) libpam.so.0 => /lib64/libpam.so.0 (0x00007f5f4b960000) libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f5f4b739000) libsystemd.so.0 => /lib64/libsystemd.so.0 (0x00007f5f4b508000) libcrypto.so.10 => /lib64/libcrypto.so.10 (0x00007f5f4b0a5000) libdl.so.2 => /lib64/libdl.so.2 (0x00007f5f4aea1000) libldap-2.4.so.2 => /lib64/libldap-2.4.so.2 (0x00007f5f4ac4c000) liblber-2.4.so.2 => /lib64/liblber-2.4.so.2 (0x00007f5f4aa3d000) libutil.so.1 => /lib64/libutil.so.1 (0x00007f5f4a83a000) libz.so.1 => /lib64/libz.so.1 (0x00007f5f4a624000) libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007f5f4a3ed000) libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f5f4a1d3000) libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007f5f49f86000) libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00007f5f49c9d000) libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007f5f49a6a000) libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007f5f49866000) libc.so.6 => /lib64/libc.so.6 (0x00007f5f49498000) libnsl.so.1 => /lib64/libnsl.so.1 (0x00007f5f4927e000) libcap-ng.so.0 => /lib64/libcap-ng.so.0 (0x00007f5f49078000) libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f5f48e16000) /lib64/ld-linux-x86-64.so.2 (0x00007f5f4c47b000) libcap.so.2 => /lib64/libcap.so.2 (0x00007f5f48c11000) libm.so.6 => /lib64/libm.so.6 (0x00007f5f4890f000) librt.so.1 => /lib64/librt.so.1 (0x00007f5f48707000) liblzma.so.5 => /lib64/liblzma.so.5 (0x00007f5f484e1000) liblz4.so.1 => /lib64/liblz4.so.1 (0x00007f5f482d2000) libgcrypt.so.11 => /lib64/libgcrypt.so.11 (0x00007f5f48051000) libgpg-error.so.0 => /lib64/libgpg-error.so.0 (0x00007f5f47e4c000) libdw.so.1 => /lib64/libdw.so.1 (0x00007f5f47bfb000) libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f5f479e5000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f5f477c9000) libsasl2.so.3 => /lib64/libsasl2.so.3 (0x00007f5f475ac000) libssl.so.10 => /lib64/libssl.so.10 (0x00007f5f4733a000) libssl3.so => /lib64/libssl3.so (0x00007f5f470e1000) libsmime3.so => /lib64/libsmime3.so (0x00007f5f46eb9000) libnss3.so => /lib64/libnss3.so (0x00007f5f46b8a000) libnssutil3.so => /lib64/libnssutil3.so (0x00007f5f46959000) libplds4.so => /lib64/libplds4.so (0x00007f5f46755000) libplc4.so => /lib64/libplc4.so (0x00007f5f46550000) libnspr4.so => /lib64/libnspr4.so (0x00007f5f46311000) libfreebl3.so => /lib64/libfreebl3.so (0x00007f5f4610e000) libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007f5f45efe000) libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007f5f45cfa000) libattr.so.1 => /lib64/libattr.so.1 (0x00007f5f45af5000) libelf.so.1 => /lib64/libelf.so.1 (0x00007f5f458dd000) libbz2.so.1 => /lib64/libbz2.so.1 (0x00007f5f456cd000) |
=> ldd로 확인한 라이브러리 항목과 lsof로 확인한 sshd 관련 프로세스들 리스트가
거의 일치하는 것을 알 수 있다
일치하는 프로세스가 없음
1) linux-vdso.so.1
=> 가상 동적 공유 라이브러리. 커널과 사용자 공간 사이 인터페이스로 사용됨
2) libnss_files
=> Name Service Switch 모듈로 추정. 구성 소스와 함께 시스템 ID 및 서비스를 매핑. nss_sss 모듈이 문제를 방지하기 위해 nss_files로 대체하여 정상적으로 처리함
linux-vdso.so.1
/lib64/ld-linux-x86-64.so.2
두 모듈은 세트로 따라다닌다
wc sshd1.txt
58 524 5157 sshd1.txt
순서대로 라인수(-l), 단어수(-w), 바이트수(-c)
실습 : PAM을 이용한 사용자 인증 처리
사용 vmware : centos7
yum -y install pam-devel
=> 컴파일을 위한 pam 개발 라이브러리 설치
// C언어 파일 간략한 내용
#include <security/pam_appl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
사용자 id와 패스워드를 입력받는다
ex) scanf("%s", username);
pam_start, pam_authenticate, pam_end 등 pam 관련 함수 사용하여
세션 시작, 인증 시도, 세션 정리.
PAM conversation 함수 conv_callback
PAM 대화 콜백 함수로 인증 과정 중에 발생하는 대화 처리.
인증 모듈이 사용자와 상호작용하여 필요 정보를 수집하고 제공하기 위해 호출됨
(사용자가 호출하지 않아도 PAM 라이브러리에 의해 호출)
int conv_callback() ~ 함수를 만들어주기만 하면 됨
ex)
int conv_callback(int num_msg, const struct pam_message **msg,
struct pam_response **resp, void *appdata_ptr) {
//return PAM_CONV_ERR;
//return PAM_SUCCESS;
}
gcc -o test-pam_password_check test-pam_password_check.c -lpam
=> gcc를 이용하고 -lpam 옵션 사용
ldd test-pam_password_check linux-vdso.so.1 => (0x00007ffc86fd6000) libpam.so.0 => /lib64/libpam.so.0 (0x00007fccbf04f000) libc.so.6 => /lib64/libc.so.6 (0x00007fccbec81000) libaudit.so.1 => /lib64/libaudit.so.1 (0x00007fccbea58000) libdl.so.2 => /lib64/libdl.so.2 (0x00007fccbe854000) /lib64/ld-linux-x86-64.so.2 (0x00007fccbf25e000) libcap-ng.so.0 => /lib64/libcap-ng.so.0 (0x00007fccbe64e000) |
실습 : PAM login 서비스
왜 이런 현상이 나타나는가?
실습 : PAM 소스를 이용한 분석하기
yum -y install yum-utils ctags wget make gcc bzip2 autoconf automake libtool \
bison flex flex-devel cracklib-devel gettext-devel audit-libs-devel \
libselinux-devel libdb-devel linuxdoc-tools elinks libxslt docbook-style-xsl \
docbook-dtds wget pam-devel
=> 컴파일에 필요한 패키지들 설치
vi /etc/vimrc
set tags=./tags,../tags,../../tags,lib/tags,../lib/tags,/usr/include/tags
편의를 위해 vi 설정에 tags를 넣는다.
yumdownloader --downloadonly --source pam
rpm -Uvh pam-1.1.8-23.el7.src.rpm
cd rpmbuild/SOURCES/
tar xjf Linux-PAM-1.1.8.tar.bz2
cd Linux-PAM-1.1.8
=> 다운로드만 하고 설치는 하지 않는다. rpm 이용하여 확인하고,
cd로 폴더를 이동하여, tar로 압축풀고 폴더안에 들어감
./configure
make
=> 환경설정, 컴파일까지만 진행
/lib64/security/
=> 공유파일, 심볼릭 링크가 대다수로 이루어져 있다
tree modules/*/.libs -a | grep -E '.libs|.so'
vi /root/rpmbuild/SOURCES/Linux-PAM-1.1.8/tests/tst-dlopen.c
/root/rpmbuild/SOURCES/Linux-PAM-1.1.8/tests 폴더의 c언어 파일들은 테스트용 파일로 분석하기 적합
ls
Makefile tst-pam_chauthtok.c tst-pam_mkargv.c
Makefile.am tst-pam_close_session.c tst-pam_open_session.c
Makefile.in tst-pam_end.c tst-pam_set_data.c
tst-pam_fail_delay.c tst-pam_set_item.c tst-dlopen.c
tst-pam_get_item.c tst-pam_setcred.c tst-pam_acct_mgmt.c
tst-pam_get_user.c tst-pam_start.c tst-pam_authenticate.c
tst-pam_getenvlist.c
if (dlopen(argv[i], RTLD_NOW)) {
// 동적 라이브러리 오픈에 성공하면 fprintf로 succeeded 출력
if ((stat(buf, &st) == 0) && dlopen(buf, RTLD_NOW)) { //성공
} else {
// 실패
}
}
gcc -o tst-dlopen tst-dlopen.c -lpam -ldl
-lpam : PAM 라이브러리에 정의된 함수 및 기능 사용 가능
-ldl : 동적 링크 옵션. 동적 라이브러리 로딩 함수를 사용해야 하므로 추가
./tst-dlopen ../modules/pam_rootok/.libs/pam_rootok.so ../modules/pam_time/.libs/pam_time.so
=> tst-dlopen 실행파일로 pam_rootok.so 파일과 pam_time.so 파일 오픈해보기
실습 : pam_rootok 분석, 실습
참고 : https://linuxmaster.net/pam/linux-pam/sag-pam_rootok.html <- man rootok 내용 번역
pam_rootok
- 관리자 권한 (uid 0) 일 때 허용, 그, 외에는 거부된다.
- 설정파일에서 type auth인증 필드로만 사용할 수 있다.
경로에 /lib64/security 가 생략되어 있다
반환값은 PAM_SUCCESS 성공, PAM_AUTH_ERR 실패
sufficient
=> 성공하면 즉시 성공. 다음 모듈을 실행하지 않는다. 단, required 실패 이후일 경우는 제외한다. 실패해도 인증에 영향을 미치지 않는다.
테스트결과
: root 사용자가 su 실행시 바로 인증 성공.
sufficient는 실패해도 상관없다.
required
=> 실패해도 다음 모듈을 호출하지만, 최종적으로 인증은 거부된다.
일반유저 : su - 명령어 자체가 사용불가해짐
root : su - 명령어를 입력하면 인증요청 후 성공시 로그인됨
requisite
=> 실패하면 즉시 실패. 다음 모듈을 실행하지 않는다. 성공시에만 다음 모듈 호출.
일반유저 : su - 명령어 자체가 사용불가
root : su - 명령어 입력시 인증요청 후 성공시 로그인됨
실습 : pam_rootok.c 분석
/etc/pam.d/su 파일을 sufficient로 원복한다.
cd /rpmbuild/SOURCES/Linux-PAM-1.1.8
ctags -R
cd modules/pam_rootok/
vi pam_rootok.c
=> pam_rootok.c 파일 열기
( vi 복습 : 단어 찾기 *, ctrl+] 점프, ctrl+t 되돌아오기
여기서 ctrl + t 하면 다시 원래 화면으로 돌아온다
)
122 if (getuid() == 0)
123 #ifdef WITH_SELINUX
124 if (selinux_check_root() == 0 || security_getenforce() == 0)
125 #endif
126 retval = PAM_SUCCESS;
=> getuid 체크하는 코드
return retval; 로 되어 있는데
return 0; // 성공
return 1; // 무조건 실패
return retval; // 성공, 실패 리턴
원래대로 복원하기 위해서는 pam 패키지를 재설치
yum -y reinstall pam