본문 바로가기
(실기) 정보보안기사&산업기사

UNIX/Linux 기본 학습 16~20

by IT매니절 2024. 3. 13.

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 부분을 #주석처리하고 데몬을 재시작했지만 소용없었다.

 

안되던 이유1 : 21번포트 포트포워딩 안해줘서-_-

 

그러나 여전히 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 )

 

vmware로 갈아타서 성공함

 

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