본문 바로가기
정보보안

정보보안1 7차시

by IT매니절 2024. 4. 27.

 

참고 : 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 디렉터리의 심볼릭 링크 파일

 

설정 파일 구조

<Type> <Control-flag> <Module-path> <Module-argument>

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.d/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

=> 환경설정, 컴파일까지만 진행

 

pam 설치파일 디렉터리 / pam의 각 모듈

/lib64/security/
=> 공유파일, 심볼릭 링크가 대다수로 이루어져 있다

 

tree modules/*/.libs -a | grep -E '.libs|.so'

modules 디렉터리 안에 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인증 필드로만 사용할 수 있다.

 

/etc/pam.d/su 파일의 설정

경로에 /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 되돌아오기 

 

define 값에 커서를 두고 점프
_pam_types.h로 점프

여기서 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

'정보보안' 카테고리의 다른 글

정보보안2 1차시  (0) 2024.05.04
정보보안1 8차시  (0) 2024.04.28
정보보안1 6차  (0) 2024.04.21
정보보안1 5차시  (0) 2024.04.20
정보보안1 4차시  (0) 2024.04.14