지난시간에 하던 pam모듈의 rootok 이어서.
cd /rpmbuild/SOURCES/Linux-PAM-1.1.8/modules/pam_rootok
vi /pam_rootok.c
분석할 때 아무것도 모르는 경우엔 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 를 입력하면, 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
비교
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
주석풀기
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를 사용할 수 있으므로)