PAM (장착형 인증 모듈, Pluggable Authentication Modelus)
1) 개요
1. 각종 어플리케이션 인증을 위해 제공되는 다양한 인증용 라이브러리들
/lib/security 또는 /usr/lib/security 디렉터리에 저장
2. 로그인이나 ftp 등 사용시 PAM을 통해 인증을 처리하는데, 플러그인 방식을 사용해 인증방식 및 정책의 유연성과 중앙통제가 가능
3. 사용자 인증의 핵심. 인증 형태, 사용자 권한, 접근 자원 등을 선택할 수 있는 라이브러리
4. 인증 목적으로 관리자에 의해 선택적으로 사용된다. 필요에 따라 인증체계를 선택적으로 사용할 수 있다.
PAM을 사용한 인증 절차
1. 프로그램이 인증이 필요할 때 PAM 라이브러리 호출
2. 해당 프로그램의 PAM 설정파일을 참조하여 등록된 PAM 모듈 수행
3. 응용 프로그램이 반환결과를 참조해 인증 여부 결정
/etc/pam.d : pam 라이브러리를 이용하는 설정파일들 위치
/lib/security : pam 모듈 실행에 필요한 추가 설정 파일 위치
PAM 설정파일
- type : account, auth(패스워드 검증, 신원확인), password, session
- control : requsite(실패시 즉시 거부), required(실패해도 다음단계를 실행하지만 결과는 실패), suffcient(이전 모듈이 실패해도 성공하면 인증 성공), optonal(성공/실패 결과 무시)
- modult-path : 모듈파일 경로
- module-arguments : 모듈에게 전달되는 인수
라이브러리
-연관된 함수/서브루틴을 모아놓은 집합
-정적 라이브러리 (실행파일내 포함되어 만들어짐 ~.a)
-동적(공유) 라이브러리 (실행파일 생성시 라이브러리 링크정보만 가짐 ~.so ex 윈도우의 DLL)
-리눅스에서 .a나 .so find 해보면 여러가지 볼 수 있음.
주요정보통신기반시설 기술적 취약점 분석평가방법
상세가이드에서 PAM관련 취약점 조치를 볼 수 있다
root 계정에 접속하는 법
1. 사용자 계정으로 원격 로그인
2. su 명령어를 통해 root로 로그인
실무환경에서 어느정도 규모가 있는 업체에서는
PAM 보다는 보안OS(Secure OS 서버 보안 솔루션)를 이용하는 편
PAM 활용 예
root 계정의 원격 접속 제한
- 시스템 관리 계정으로 불법적인 침입자의 목표가 될 수 있으므로 원격접속 금지
- /etc/securetty 파일에 등록된 터미널이 아니면 root의 접속을 허용하지 않도록 PAM 설정
- /etc/securetty 파일 : pam_securetty.so 모듈이 사용하는 파일.
실습
/etc/pam.d 디렉터리 remote 서비스 설정파일에 pam_securetty.so 모듈 추가
-> /etc/securetty 파일에 pts/~ 터미널을 모두 제거(또는 주석)
-> telnet에서 로그인 시도시 거부 & /var/log/secure 파일에서 로그 확인
(나는 서버를 직접 띄운 콘솔로 테스트 하는 거라 pts/~ 가 없어도 로그인 되었음. 테스트 하려면 다른 클라이언트를 확보해봐야 하나?)
참고
tty : 서버와 연결된 모니터, 키보드를 통해 콘솔로 직접 로그인
pts : telnet, 터미널 등을 통해 접속하는 가상 터미널
** 시스템별 root 계정 원격 접속 제한 설정
1. SOLARIS
#cat /etc/default/login
CONSOLE=/dev/console -> 원래 #주석처리되어있는데, 해제하면 root는 콘솔로만 접근가능
2. AIX
#cat /etc/security/user
rlogin = flase -> true 원격o false 원격x
3. HP-UX
#cat /etc/securetty
console -> 원래 #주석처리되어있는데, 해제하면 root는 콘솔로만 접근가능
4. LINUX
#cat /etc/pam.d/login
auth required /lib/securitty/pam_securetty.so
#cat /etc/securetty
pts/x 관련 설정 삭제/주석처리
취약점 점검
w 명령을 통해 root 사용자 정보를 확인 가능
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 09:57 48:40 0.01s 0.01s -bash
-> TTY에 pts/~ 가 있으면 가상터미널로 접속한 것으로 보안이 취약한 것을 확인할 수 있다
**SSH(Secure shell) root 원격 접속 제한 설정
- /etc/ssh/sshd_config 파일의 PermitRootLogin 항목을 no로 설정
실습
위에 적은 ssh root 원격 접속 제한 설정
-> service sshd restart #데몬재시작
-> putty 연결 끊고 다시 켜서 root 로그인
-> Access denied 확인
-> 사용자 user1 로그인 하여 su - 로 root 로그인 변경
-> 마지막 로그인: 수 3월 13 09:57:39 KST 2024 192.~에서 시작 일시 pts/0
마지막 로그인 실패: 수 3월 13 10:58:12 KST 2024 192.~에서 시작 일시 ssh:notty
마지막 로그인 후 1 번의 로그인 시도가 실패하였습니다.
확인
-- 16 END
PRM 활용 예 2
계정 잠금 임계값 설정
- 패스워드 무작위 대입 공격Brute Force Attack 또는 사전 대입 공격 Dictionary Attack 에 대비하여 실패 횟수를 적절하게 제한하여 패스워드 유출 위험을 줄임
- pam_tally2.so 또는 pam_tally.so 모듈 이용
실습
vi /etc/pam.d/system-auth
-> pam_tally2 모듈 추가 (
auth required pam_tally2.so deny=3 unlock_time=10
account required pam_tally2.so )
-> service sshd restart 재시작
-> deny 횟수를 무시하고 로그인 시도를 계속할 수 있어서 pam_tally2 -u user1 로 확인했더니 아예 카운트가 쌓이질 않는다.
-> putty를 통해 진행하고 있기 때문에 ssh 통신인 vi /etc/pam.d/sshd 로 수정해보기로 함
-> 실패 카운트는 잘 쌓이지만 로그인이 막히질 않는다.....
-> /etc/pam.d/sshd쪽을 # 주석처리하고, /etc/pam.d/system-auth와 /etc/pam.d/password-auth에만 각가추가했다
-> 실패카운트도 이상하게 쌓이고 로그인도 안 막힌다...
-> 각 auth와 account의 첫번째로 넣어주어야 적용한다고 하여 위치를 바꿔주었다. 안된다.
-> 시간을 너무 잡아먹어서 일단 멈추기로 하고 나중에 강사님께 질의하기로 한다 ㅠㅠ
-> 일단 #주석처리로 원복
(참고한 블로그 : https://macan.tistory.com/4 인데 해결되진 않았음; 뭔가 환경이 다른가보다...)
실무에서는
1. 통상 5회
2. 5회 초과시 계정 잠금 시간 지정 또는 관리자에 의한 잠금처리
시스템별 계정 잠금 임계값 설정
1. SOLARIS
RETRIES=5
2. LINUX
auth required pam_tally.so deny=3 unlock_time=10 no_magic_root
account required pam_tally.so reset
no_magic_root //root 계정은 패스워드 잠금 설정을 적용하지 않는다
reset //접속시도 성공시 실패한 횟수 초기화
(linux7 버전 기준 no_magic_root는 default가 되고 reset 옵션 삭제됨)
3. AIX
loginretries=5
4. HP-UX
u_maxtries#5
또는
AUTH_MAXTRIES=5
PAM 활용 예 3
root 계정 su 제한
권한이 없는 일반 사용자가 su 명령으로 패스워드 무작위 대입공격 BFA나 패스워드 추측 공격 Password Guessing 을 통해 root 권한을 획득할 수 있다
pam_wheel.so 모듈을 사용하여 su 명령어 사용이 허용된 사용자만 root 계정으로 접속하게 한다
실습
1. cat /etc/group | grep 'wheel' -> wheel에 누가 있는지 확인
2. usermod -G wheel user1 -> usermod -G(보조그룹, -g는 기본그룹)로 wheel 그룹에 user1 추가
(또는 /etc/group 파일을 수정해서 추가할 수도 있음)
3. cat /etc/group | grep 'wheel' -> wheel에 추가된 것을 확인
4. vi /etc/pam.d/su 명령어 실행
#auth required pam_wheel.so use_uid
(교재 기준 )
# 주석 제거하여 수정
5. 권한이 없는 user2가 su - 하자 su: 권한 부여 거부 확인
시스템별 root계정 su 권한 제한
1. SOLARIS, LINUX, AIX, HP-UX
- SOLARIS : chmod 4750 su
- AIX : sugroup=staff
- HP-UX : SU_ROOT_GROUP=wheel
- LINUX : ls -l /usr/bin/su 파일의 권한 4750인지 확인
2. LINUX PAM 모듈
- wheel 그룹 내 구성원 확인 및 pam_wheel.so 모듈 사용
(교재 기준
auth required pam_wheel.so debug group=wheel
또는
auth required pam_wheel.so use_id)
sudo 명령을 이용한 관리자 root 권한 부여
- sudo 명령은 다른 사용자가 관리자 권한으로 명령을 실행하고자 할 때 사용하는 명령어
- 설정파일 : sudoers(/etc/sudoers)
- ex sudo /batch/log_batch.sh (-u로 사용자를 지정가능, 없을시 자동으로 root 권한)
설정구조
예시
root ALL=(ALL) ALL
user1 ALL=(ALL) ALL -> user1의 모든 사용자의 su 권한을 허용
user1 192.168.0.0=(ALL) NOPASSWD: ALL -> user1이 192.168.0.0 호스트일때 root권한으로, 비밀번호 확인없이 실행가능
user1 ALL=(root, user2) ALL -> user1은 모든 호스트에서, root와 user2의 권한을 사용가능
user1 ALL=(ALL) /was/temp/test.sh -> 모든호스트 모든권한으로, test.sh만 su로 사용가능
1. 계정명 : 모두에게 줄 때는 ALL, 계정명이나 그룹명 지정 가능
2. 호스트명 : 호스트명 또는 IP, 모든서버 ALL
3. 실행 권한 계정명 : 실행할 때 가질 권한의 계정명, 모든계정의 권한 ALL, 생략시 root
4. NOPASSWD : 원래 현재 계정의 비밀번호를 물어보게 되어있는데, 설정하면 비밀번호를 물어보지 않는다 (root권한의 비번을 물어보는게 아니다)
5. 명령어 : 명령어의 경로. 모든 명령어는 ALL
-- 17 END
시스템 로그 설정과 관리
- 유닉스 : /var/adm
- 리눅스 : /var/log
utmp(x) 로그 파일
- 현재 로그인한 사용자의 상태정보를 담고 있는 로그파일
- w, who, finger 등의 명령어 이용
- 리눅스 : /var/run/utmp
- 유닉스 : /var/adm/utmpx
실습
w
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 15:10 3:17 0.00s 0.00s -bash
1. USER : 로그인 계정
2. TTY : 터미널 타입
- tty(서버에 직접 연결된 콘솔 타입), pts(가상터미널 타입)
- pts 타입 접속은 차단해야 한다 (pam_securetty 모듈 적용 후 /etc/securetty 설정 파일에서 pts 제거)
- root 계정의 원격접속 차단 (su 명령어도 제한(pam_wheel 모듈)
3. FROM : 출발지 호스트 IP 주소
4. LOGIN@: 로그인 일시
5. IDLE : 유휴 시간, 마지막 명령 수행 후 대기시간
- 세션 타임아웃 설정 (권장 600초(10분))
- 시간표시 : 9.00s = 9초 (1분이하는 s가 붙음), 25:11 = 25분 11초
- 1:09m = 1시간 9분, 34days : 34일 경과
6. WHAT : 현재 실행 중인 명령
w 사용자 (ex w user1)
- 특정 사용자의 로그인 상태정보 출력
wtmp(x) 로그 파일
- 사용자의 성공한 로그인/로그아웃 정보, 시스템의 Boot/Shutdown 정보에 대한 히스토리를 담은 로그파일
- last 명령어 사용
- 리눅스 : /var/log/wtmp
- 유닉스 : /var/adm/wtmpx
실습
last
1 2 3 4 5 6 <- 항목타이틀 안나옴 임의로 숫자붙임
root pts/0 192.168.56.1 Wed Mar 13 15:10 still logged in <- still logged in 현재 로그인중
root tty1 Wed Mar 13 15:10 still logged in
user1 pts/0 192.168.56.1 Fri Mar 8 15:29 - 15:30 (00:01) <- 로그아웃
reboot system boot 3.10.0-1160.108. Wed Mar 13 15:09 - 15:28 (00:18) <- 가상의 사용자 sudo 계정 시스템 셧다운 정보를 보여줌
1. USER
2. TTY
3. FROM
4. 로그인 시간
5. 로그아웃 시간
6. 경과시간
last 사용자
- 특정 사용자의 로그인/로그아웃 히스토리 정보 출력
last reboot
- 시스템 부팅/셧다운 기록 히스토리 정보 출력
lastlog 로그 파일
- 가장 최근에 성공한 로그인 기록을 담고 있는 로그파일
- lastlog(리눅스) 또는 finger(리눅스/유닉스) 명령어 사용
- 리눅스 : /var/log/lastlog
- 유닉스 : /var/adm/lastlog
실습
linux에서 lastlog
사용자이름 포트 어디서 최근정보
Username Port From Latest
root pts/0 192.168.56.1 수 3월 13 15:10:24 +0900 2024
mysql **Never logged in**
1. Username
2. Port
3. From
4. Latest : **Never logged in** 한번도 로그인X
(나는... 교재와 달리 한글로 타이틀이 출력되긴했다)
lastlog -u 사용자
: 특정 사용자의 최근 접속 기록
lastlog -t 일수
: 해당 일수 이내 모든 사용자 접속 기록
유닉스(리눅스도 있긴함) : finger 사용자(계정명)
(centos에선 finger를 설치해줘야 한다고 한다)
실패한 로그인 시도에 대한 기록 로그 파일
리눅스 - /var/log/btmp -> lastb 명령어. 실패한 모든 로그 수집
유닉스 - /var/adm/loginlog -> 텍스트파일이므로 vi 등의 편집기를 통해 로그 확인. 5회이상 실패하면, 1~5회 실패기록 전부 기록됨.
실습
lastb | head -2
root pts/1 Wed Mar 13 12:40 - 12:40 (00:00)
user1 pts/1 Wed Mar 13 12:39 - 12:39 (00:00)
1. 사용자 계정
2. 터미널 타입
3. 출발지 호스트 주소
4. 로그인 실패 시간
5. 경과시간
lastb (모든 사용자)
lastb 사용자 (특정 사용자)
cat /var/adm/loginlog : 5회 이상 로그인 실패한 기록들
-- 18 END
sulog (유닉스에만)
- su 명령을 사용한 결과를 저장한 텍스트 파일
- 유닉스 : /var/adm/sulog
- 리눅스 : /var/log/secure 로그파일에 su명령을 사용한 결과가 포함된다
실습
cat /var/adm/sulog
SU 02/18 22:06 - pts/4 user1-root
SU 02/18 22:06 + pts/4 user2-root
1번 필드 : 실행 날짜와 시간
2번 필드 : -는 실패, +는 성공을 의미함
3번 필드 : user1-root : user1 계정에서 root 로 전환했다
리눅스 /var/log/secure
Mar 13 15:59:57 localhost su: pam_unix(su-l:auth): authentication failure; logname=user1 uid=1001 euid=0 tty=pts/1 ruser=user1 rhost= user=root
-> 실패
Mar 13 15:59:57 localhost su: pam_succeed_if(su-l:auth): requirement "uid >= 1000" not met by user "root"
-> 성공
acct/pacct 로그 파일
- 시스템에 로그인한 모든 사용자가 로그아웃할 때까지 입력한 명령어와 터미널 종류등을 저장한 로그
- lastcomm 명령어
- 리눅스 : /var/account/pacct
- 유닉스 : /var/adm/pacct
- 기본설정은 비활성화이므로, 활성화하려면
리눅스 : accton /var/account/pacct
유닉스 : /usr/lib/acct/accton /var/adm/pacct 명령어를 실행해주어야 한다
실습
lastcomm : 모든 사용자에 대한 명령어 실행 내역
lastcomm 명령어 or lastcomm --command 명령어 : 특정 명령어를 실행한 사용자 정보
lastcomm 사용자 or lastcomm --user 사용자 : 특정 사용자가 실행한 명령어 정보
lastcomm --command gccc
lastcomm --user user1
한계:
gcc testfile.c 명령어를 실행했을때, gcc만 기록되고 옵션이나 인수는 기록되지 않음
(accton 명령어에 대한 not found 에러가 떠서 진행할 수 없었다.
검색해보니 2023년 11월 포스트에서, 최근 몇 년동안 psacct 패키지는 사용중단 상태라고 한다. 그사이 또 pacct -> psacct로 이름이 바뀐 모양. 요즘에는 ststemd의 ststemd-journald나 auditd를 쓴다고.)
history 로그 파일
- 계정별로 실행한 명령어에 대한 기록을 저장한 텍스트 파일 (홈디렉터리에)
- .쉘종류_history 형식으로 생성됨 ex .bash_history
- history 명령어로 확인도 가능
ls -la 로 확인
-rw-------. 1 root root 2246 3월 13 12:12 .bash_history
tail -3 .bash_history
출력
vi /etc/pam.d/system-auth
vi /etc/pam.d/password-auth
service sshd restart
secure 로그 파일
- 사용자 인증에 대한 정보를 기록하고 있는 로그파일
- /var/log/secure
messages 로그 파일
- 리눅스 시스템의 기본적인 시스템 로그 파일. 운영에 대한 전반적인 메시지를 저장한다
- 시스템 데몬들의 실행상황, 내역, 사용자들의 접속정보, TCP Wrapper 접근 제어 정보 등.
- /var/log/messages
dmesg 로그 파일
- 리눅스가 부팅될 때 출력되는 모든 메시지 기록
- /var/log/dmesg
boot.log 로그 파일
- 리눅스 부팅시 파일시스템에 대한 체크, 서비스 데몬들의 실행 상태 등, 성공/실패 여부 확인
- /var/log/boot.log
-- 19 END
xferlog 로그 파일
- ftp 서비스 로그 파일. 서비스 내역 기록.
- /var/log/xferlog
( 실습을 위해 vsftpd 설치함
rpm -qa | grep vsftp <- 설치확인
yum install vsftpd <- 미설치시 설치. yum은 설치명령어임
rpm -ql vsftpd <- 관련파일 확인 rpm은 패키지 실행 명령어로 설치, 질의, 검증 등 가능
방화벽 설정
[root@localhost ~]# firewall-cmd --permanent --add-service=ftp
success
[root@localhost ~]# firewall-cmd --permanent --add-port=21/tcp
success
[root@localhost ~]# firewall-cmd --reload
success
systemctl enable vsftpd
systemctl restart vsftpd
ps -ax | grep vsftpd
/etc/vsftpd/vsftpd.conf 파일에서
xferlog_enable=YES
xferlog_file=/var/log/xferlog
xferlog_std_format=YES
로그파일 설정 변경
접속안됨
ps -ax | grep vsftpd
10249 ? Ss 0:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
10338 pts/0 R+ 0:00 grep --color=auto vsftpd
vsftpd 동작을 확인하고
netstat -antp | grep 21
tcp6 0 0 :::21 :::* LISTEN 10249/vsftpd
21번 포트가 열려있고 LISTEN 상태임을 확인했는데도...
혹시나 지난 실습에서 pam_securetty.so를 사용한것이 문제가 되었나 싶어,
/etc/securetty파일의 pam_securetty.so 부분을 #주석처리하고 데몬을 재시작했지만 소용없었다.
그러나 여전히 vsftpd 530 Login incorrect 떠서
vi /etc/vsftpd/ftpusers
vi /etc/vsftpd/user_list
두 개 파일에서 root 있는지 확인하고 주석 또는 삭제
데몬 껐다 키고 동작 확인
그리고 새롭게 등장한 에러
227 Entering Passive Mode
vi /etc/vsftpd/vsftpd.conf
pasv_enable=YES
pasv_max_port=11000
pasv_min_port=10000
추가해주고 껐다 킴. 여전히 같은 에러가 난다.
파일질라 - 편집 - 설정 - 수동형 모드 - 능동형 모드로 자동전환
-> 요 설정을 해줘도 소용없었다
getsebool -a | grep ftp로 확인
ftpd_anon_write --> off
ftpd_connect_all_unreserved --> off
ftpd_connect_db --> off
ftpd_full_access --> off
ftpd_use_cifs --> off
ftpd_use_fusefs --> off
ftpd_use_nfs --> off
ftpd_use_passive_mode --> off
httpd_can_connect_ftp --> off
httpd_enable_ftp_server --> off
tftp_anon_write --> off
tftp_home_dir --> off
setsebool -P ftpd_full_access 1
setsebool -P ftpd_use_passive_mode 1
-> selinux의 passive mode 설정을 셋팅해봤지만, 역시 똑같은 오류가 나는 중.
버추얼박스의 포트포워딩이 문제가 되는게 아닐까 싶어서,
vm ware로 갈아타기로 했다 (설치참고 : https://m.blog.naver.com/polky0421/221504909609 )
selinux 설정이나 pasv_enable 이런설정 하나도 안 해줘도 잘만 접속된다
버추얼박스가 만악의 근원이었다
아 진짜 허망해...
참고한 블로그들
https://blog.naver.com/jb8917/120160441557 (방화벽 문제일시)
https://bug41.tistory.com/entry/Linux-Centos7-vsftpd-%EA%B4%80%EB%A0%A8-%EB%A9%94%EB%AA%A8-ftp-%EC%A0%91%EC%86%8D-%EC%95%88%EB%90%A0%EB%95%8C-%ED%99%95%EC%9D%B8%EC%82%AC%ED%95%AD (방화벽 및 deny와 allow)
https://holjjack.tistory.com/111 (chroot_list)
https://talkme.tistory.com/entry/vsftpd-%EC%A0%91%EC%86%8D-%EB%A1%9C%EA%B7%B8-%ED%95%B4%EC%84%9D (접속 로그 해석)
https://eunice513.tistory.com/m/211?category=759679 (cmd ftp open)
https://goodjian.tistory.com/entry/FTP%EC%97%90%EC%84%9C-%EC%A0%91%EC%86%8D%EC%9D%80-%EB%90%98%EB%8A%94%EB%8D%B0-%EB%8B%A4%EB%A5%B8%EB%AA%85%EB%A0%B9%EC%96%B4%EC%97%90%EC%84%9C-425-Cant-open-data-connection-%EC%97%90%EB%9F%AC%EB%B0%9C%EC%83%9D (윈도우 cmd 콘솔에서 pasv 지원하지 않음)
https://blog.naver.com/jogahyok/220242656406 (passive mode를 위한 설정)
https://hacktam.kr/etclec/110?page=10 (selinux passive mode 설정))
아스키/텍스트 모드가 있는 이유?
OS마다 텍스트 데이터의 개행 처리 제어문자가 서로 다르다
-> 리눅스/유닉스 : 0x0A(LF Line Feed)
-> 윈도우 : 0x0D0A(CR Carriage Return/LF)
해당 모드가 아니면 올바르게 개행이 되어 전송되지 않기 때문
cron 로그 파일
- 리눅스에서 동작중인 cron 데몬이 수행한 정기적인 작업 기록
- /var/log/cron
maillog 로그 파일
- 리눅스 메일서버의 메일 송수신 관련 작업 기록
- /var/log/maillog
-- 20 End
'(실기) 정보보안기사&산업기사' 카테고리의 다른 글
UNIX/Linux 기본 학습 26~서버취약점 1,2,3 (0) | 2024.03.15 |
---|---|
UNIX/Linux 기본 학습 21~25 (0) | 2024.03.14 |
UNIX/Linux 기본 학습 10~15 (0) | 2024.03.12 |
UNIX/Linux 기본 학습 5~9 (0) | 2024.03.11 |
UNIX/Linux 기본 학습 2~4 (0) | 2024.03.08 |