본문 바로가기
정보보안

정보보안1 8차시

by IT매니절 2024. 4. 28.

지난시간에 하던 pam모듈의 rootok 이어서.

 

cd /rpmbuild/SOURCES/Linux-PAM-1.1.8/modules/pam_rootok

vi /pam_rootok.c

 

check_for_root 함수

 

분석할 때 아무것도 모르는 경우엔 printf로 데이터나 변수를 찍어보는 것이 제일 빠르다.

pam_rootok.c에는 여러가지 함수들이 있는데, 이 함수들에 각 printf 함수로 데이터를 남기고 실행해보면 어떤 상황에 어떤 함수가 쓰이는지 알 수있다. ex) printf("_pam_parse 함수 실행"); printf("check_for_root 함수 실행");

 

저장한 후 make로 컴파일

 

mv .libs/pam_rootok.so /lib64/security/

=> .libs 폴더가 숨겨져있고, 이 안에 so 파일이 있다. 컴파일된 so파일을 실제 구동되는 pam 모듈 디렉토리로 이동

 

su - 명령어 실행시 ( 일반 사용자 )

pam_sm_authenticate 함수 실행

_pam_parse 함수 실행

check_for_root 함수 실행

암호 입력 :

pam_sm_setcred 함수 실행

=> 명령 실행 후 3개의 함수가 실행되고, 암호를 입력하자 나머지 하나의 함수가 실행되었다

 

( root )
pam_sm_authenticate 함수 실행
_pam_parse 함수 실행
check_for_root 함수 실행
selinux_check_root 함수 실행
pam_sm_setcred 함수 실행

=> 일반 사용자와 root의 실행 함수가 다름 확인

 

setenforce 0

=> SELinux 끄기 0, 켜기는 1

getenforce

=> Enforcing 실행중, Permissive 종료상태, Disabled 완전종료

 

vi /etc/pam.d/su
=> pam_rootok.so를 제외하고 나머지를 전부 #주석처리하면
su: 인증 실패
root 권한이어도 su - 명령어에 실패한다.
pam_rootok.so외의 다른 인증 절차가 필요하기 때문

 

( 심볼릭 링크 걸린 폴더의 경로 출력

lrwxrwxrwx. 1 root root      41  4월 28 14:39 modules -> rpmbuild/SOURCES/Linux-PAM-1.1.8/modules/

pwd -L : 폴더의 원래 경로 /modules
pwd -P : 심볼릭링크된 경로 /rpmbuild/SOURCES/Linux-PAM-1.1.8/modules )

 

 

원복하는 방법

1) rpm -qf /lib64/security/pam_rootok.so
pam-1.1.8-23.el7.x86_64

무엇을 원복할 것인가?

rpm -qf로 어느 패키지에 속해 있는지 확인함 (어느 패키지에 속한지 모를 때)

 

2) yum -y reinstall pam

pam에 속한 것이므로, reinstall을 통해 재설치하면 된다.

( pam_rootok.c 는 수정된 상태이지만, .so 파일은 원복되어서 su - 시도시 printf 메세지가 나오지 않는다 )

 

 

실습 : 스크립트를 사용해서 자동 실행하기

lib_name=rootok
pam_directory=/lib64/security/
make clean > /dev/null 2>&1
make > /dev/null 2>&1
\cp .libs/pam_${lib_name}.so $pam_directory

// .sh 파일에 넣고 실행하면 자동으로 컴파일->so파일을 복사하여 적용된다.

 

 

 

install test.sh
install: missing destination file operand after `test.sh'
Try 'install --help' for more information.
=>에러


install /dev/null test.sh
=> test.sh 생성됨

(755권한으로 만들어져서 바로 실행 가능. vi ~.sh로 만들면 700 권한이어서 권한을 바꾸어 주어야 한다)

 

현재 디렉토리명만 pwd에서 추출하기
=> base $(pwd -P)

 

lib_name=rootok

=> lib_name=$(basename $(pwd -P))

디렉토리명을 고정하지 않고, 유동적으로 변경되도록 하기

 

++에러

어디서든 실행할 수 있도록

/root/bin에 test.sh를 넣어놓고 /bin에 test.sh를 또 생성하는 바람에

/bin의 우선순위가 높아 제대로 실행되지 않는 문제가 있었다.

 

echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

=> PATH를 보면 /root/bin보다 /bin의 우선순위가 높기에...

/bin에 있는 파일을 지우고 bash 명령어를 쳐주니 제대로 인식하였다

 

 

스크립트 단점 보완

1) 성공여부를 알 수 없음 => echo 또는 메시지 남기도록 수정, 간단하게는 cp -v 옵션 사용

2) 매번 명령어를 쳐야 함

=> vi /etc/vimrc

map <F2> :w!<cr>:!pamCompile.sh<cr>

추가

 

실행

=> vi pam_rootok.c 파일을 열어 수정한 후, ESC를 누르고 F2 키를 누르면

자동으로 저장하면서 pamCompile.sh 파일을 실행한다

(vi에서 실시간으로 수정하면서 컴파일 해 볼 수 있음)

 

복구 스트립트

yum -y reinstall pam

echo "복구 완료"

=> su - 실행시 추가했던 메시지들이 나오지 않는다.

 

 

# 참고

KISA 주요정보통신기반시설 기술적 취약점 분석 평가 상세 가이드
https://www.kisa.or.kr/2060204/form?postSeq=12&lang_type=KO&page=1

root 계정 원격접속 제한
/etc/pam.d/login
auth required /lib/security/pam_securetty.so
/etc/securetty의 pts/n 설정이 없어야 함
/etc/sshd_config
PermitRootLogin no


■ LINUX PAM 모듈을 이용한 설정 방법
Step 1) “/etc/pam.d/su” 파일을 아래와 같이 설정(주석제거)
 auth sufficient /lib/security/pam_rootok.so
 auth required /lib/security/pam_wheel.so debug group=wheel 또는,
 auth sufficient /lib/security/$ISA/pam_rootok.so
 auth required /lib/security/$ISA/pam_wheel.so use_uid
Step 2) wheel 그룹에 su 명령어를 사용할 사용자 추가
 #usermod –G wheel <user_name>
 또는, 직접 “/etc/group” 파일을 수정하여 필요한 계정 추가
 wheel:x:10: -> wheel:x:10:root,admin

 

 

vi 다중창(멀티창)

1) vi ( ↲ enter)

2) :20vs. ( ↲ enter)
3) 왼쪽 파일탐색기를 통해 선택할 파일에 커서를 놓은 뒤

Shift + p 결과

Shift + p 를 입력하면, pam_rootok.c의 내용이 오른쪽 창에 나타나게 된다.

Ctrl + w 를 입력하면 파일 탐색기와 오른쪽 내용을 오갈 수 있다.

 

[F2] 키를 눌렀더니 vi 화면을 나가서 5~10초정도 가만히 있어서 깜짝 놀랐다

조금 기다리자, 다시 vi 화면으로 돌아왔는데, 제대로 실행되지 않았다.

 

++ 문제점

vi 명령어를 실행한 위치(/module)와, 탐색기를 통해 연 pam_rootok.c의 위치(/module/pam_rootok)가 달랐는데

스크립트가 vi 명령어를 실행한 위치를 인식하여 오류 발생

=> 해결법은 시간이 오래걸릴 것 같아서 강사님이 나중에 해결하여 알려주신다고 하셨음

 

 

 

실습 : pam_permit.so 분석

참고 : https://linuxmaster.net/pam/linux-pam/sag-pam_permit.html

 

항상 접근을 허용하는 PAM 모듈

ex) account  required  pam_permit.so

 

pam_permit.c 파일의 struct

struct pam_module
pam_module 원본 /security/pam_modules.h
pam_rootok.c의 struct

 

비교

pam_permit.so pam_rootok.so
사용 가능한 type
auth
account
password
session
사용 가능한 type
auth
account
password
struct pam_module _pam_permit_modstruct = {
     "pam_permit",
     pam_sm_authenticate,
     pam_sm_setcred,
     pam_sm_acct_mgmt,
     pam_sm_open_session,      => session
     pam_sm_close_session,      => session
     pam_sm_chauthtok
};
struct pam_module _pam_rootok_modstruct = {
     "pam_rootok",
     pam_sm_authenticate,        => auth
     pam_sm_setcred,                => auth
     pam_sm_acct_mgmt,          => account
     NULL,
     NULL,
     pam_sm_chauthtok,            => password
};

=> pam_permit.so는 모든 타입에 사용할 수 있기 때문에 struct에 전부 포함되어 있다.사용할 수 없는 type은 pam_rootok.so처럼 NULL 처리 된다.

 

 

테스트

~/pam_permit/pam_permit.c 를 수정하여 함수마다 이름을 프린트하도록 함

/etc/pam.d/su 에 pam_permit.so를 타입을 다르게 하여 su - 명령어를 실행해봄

1) auth

  pam_sm_authenticate
  pam_sm_setcred

2) account

  pam_sm_acct_mgmt

3) password

  - 출력되는 메시지 없음

4) session

  pam_sm_open_session

  logout시에 pam_sm_close_session 출력

 

 

 

실습 : pam_wheel.so

wheel ( 관리자 ) 그룹 사용자면 성공을 리턴한다.

 

vi /etc/pam.d/su
auth   required   pam_wheel.so use_uid

주석풀기

일반유저일 때, su로 계정 변경 불가능
wheel 그룹에 속한 관리자는 su - 사용 가능

vi /etc/pam.d/su

auth   required   pam_wheel.so trust use_uid

#auth   required   pam_wheel.so use_uid

=> 주석 변경

 

trust 옵션

관리자(wheel)라면 su - 할 때 암호 없이 변경가능

관리자라 암호를 물어보지 않는다.

 

기타 옵션
root_only : 목표 사용자 uid가 0일 때만 wheel 소속 검사
deny : 뒤집기. 목표 사용자 uid가 0이고 wheel 소속이면 접근 거부
debug : 디버그 정보 출력
use_uid : 사용중인 터미널 로그인 세션에서 사용자를 얻지 않고 호출 프로세스의 실제 uid를 검사한다 (사용 세션중에 uid 0이 있으면 uid 0 권한으로 su를 사용할 수 있으므로)

 

 

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

정보보안2 2차시  (0) 2024.05.05
정보보안2 1차시  (0) 2024.05.04
정보보안1 7차시  (0) 2024.04.27
정보보안1 6차  (0) 2024.04.21
정보보안1 5차시  (0) 2024.04.20