본문 바로가기

정보보안/시스템 보안

[UNIX/Linux 기본학습] 서버보안3

PAM
장착형 인증 모듈(Pluggable Authentication Modules)

 

PAM 이란?

① 개념 

  • 리눅스 시스템 내에서 사용되는 각종 애플리케이션 인증(Authentication)을 위해 제공되는 다양한 인증용 라이브러리

 

② 특징

  • 리눅스는 로그인이나 Telnet,FTP 같은 각종 프로그램 사용 시 PAM을 통해 인증을 처리한다. 
  • 프로그램 개발 시 인증 모듈을 별도 개발하지 않고 플러그인 방식의 PAM을 사용함으로써 인증 방식 및 정책의 유연성과 중앙 통제가 가능하다는 장점이 있다.
  • 리눅스 시스템의 사용자 인증의 핵심
  • 각 응용프로그램에 대한 인증 형태, 사용자 권한, 접근 자원 등을 선택할 수 있다.
  • 기존 응용프로그램을 수정할 필요 없이 인증 부분을 독립적이고 선택적으로 새롭고 다양한 인증 서비스 모듈을 추가하여 사용할 수 있다.

 

③ 인증 절차

 

  1. 각 프로그램은 인증이 필요한 부분에 PAM 라이브러리를 호출한다.
  2. PAM 라이브러리가 호출되면 해당 프로그램의 PAM 설정파일을 참조하여 등록된 여러 PAM 모듈을 수행하고, 그 결과를 응용 프로그램에 반환한다.
  3. 응용 프로그램은 반환된 결과를 이용해 인증 여부를 결정한다.

 

④ /etc/pam.d/서비스 설정 파일 구성

cat /etc/pam.d/remote

#type	 control	module-path		module-arguments
auth	 required	pam_securetty.so
auth	 include	system-auth
account	 required	pam_nologin.so
account  include	system-auth
password include	system-auth

 

type PAM 모듈 종류
- account(계정) : 서비스 사용자 계정의 유효성을 검증
  (ex. 계정 유효기간(비밀번호 만료), 접속 가능 시간, 서비스 접근 허용여부)
- auth(인증) : 서비스 사용자 계정의 패스워드 검증, 다른 인증 모듈과의 연동 등 사용자 신원 확인을 수행하는 유형
  (ex. 패스워드 인증, OTP/보안카드를 통한 인증)
- password(패스워드) : 서비스 사용자 계정의 비밀번호 설정 및 변경 조건을 지정하는 유형
  (ex. 패스워드 최소길이, 복잡도 설정)
- session(세션) : 서비스 사용자 계정의 인증 처리 전후에 수행할 작업 지정.
  (ex. 홈디렉토리 마운트,메일함 생성)
control 각 모듈 실행 후 성공/실패에 따른 PAM 라이브러리 행동 결정
- requisite : 인증 실패 시 즉시 인증 거부
- required : 인증 실패 시 다음 라인의 모듈을 실행하지만 최종 결과는 인증 실패
- sufficient : 이전에 요청된 모듈이 실패하더라도 여기서 성공하면 PAM은 인증 성공 (단,이전 Required가 모두 성공일 경우에만)
- optional : 모듈의 성공/실패 결과 모두 무시
module-path PAM에서 사용할 실제 모듈 파일이 위치한 경로를 의미
모듈이름(*.so 파일)만 명시할 경우 기본 PAM 모듈 디렉터리(/lib/security)에서 해당 모듈을 찾음
module-
arguments
모듈에 전달되는 인수
(ex. deny = 5)

 

PAM 활용 (시스템 취약점 분석, 평가 항목)

① root 계정의 원격 접속 제한 (pam_securetty)

- 터미널 접속 시, '/etc/securetty'(pam_securetty.so 모듈이 사용하는 파일로 터미널 접속 시 root 접근 제한 설정 파일)  파일에 등록되어있는 터미널이 아니면 root접속을 허용하지 않도록 PAM 설정을 한다.

1) 취약점 점검
-'w' 명령을 통해 현재 접속중인 root 사용자 정보를 확인한다.
w

USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    192.168.1.10     08:14    1.00s  0.14s  0.04s -bash
root     pts/1    192.168.1.12     08:15    3:22   0.25s  0.25s -bash
root     pts/2    192.168.1.15     16:57    0.00s  0.01s  0.00s w​

- 점검 결과 중 tty 컬럼(터미널 타입 정보)를 살펴보면 root 계정이 pts 타입으로 다수 접속한 것을 확인 할 수 있다. pts는 가상 터미널 타입으로 telnet, 터미널 등을 통해 root 계정으로 접속한 것으로 판단할 수 있다. root 계정은 시스템을 관리하는 매우 중요한 계정으로 직접 로그인이 가능하면 불법 침입자의 목표가 될 수 있다. 따라서 root 계정의 원격 접속을 금지한다.

2) PAM 설정 파일('/etc/pam.d/remote)에  pam_securetty.so 모듈 추가

cat /etc/pam.d/remote

#type	 control	module-path		module-arguments
auth	 required	pam_securetty.so
...


3) /etc/securetty 파일에 "pts/~" 터미널을 모두 제거(또는 주석 처리)
- pam_securetty.so 모듈이 '/etc/securetty' 파일애 정의된 터미널만  root 접속을 허용한다.
- tty(terminal-teletype) : 서버와 연결된 모니터, 키보드 등을 통해 사용자가 콘솔로 직접 로그인
- pts(pseudo-terminal, 가상터미널) : Telnet, 터미널 등을 통해 접속하는가상 터미널

+  SSH(SecureShell) root 계정 원격 접속 제한

cat /etc/sshd/sshd_config

PermitRootLogin no # 이 부분 no로 설정

 

② 계정잠금 임계값 설정(pam_tally2)

- 패스워드 무차별 대입공격(Brute Force Attack) 이나 사전 대입 공격(Dictionary Attack) 발생 시 암호 입력 실패 횟수를 적절하게 제한하고 공격 시간을 지체시켜 패스워드 유출 위험을 줄인다.

① 계정잠금 임계값을 설정하기 위해 '/etc/pam.d' 디렉터리에 있는 system-auth 서비스 설정파일에 아래와 같이 pam_tally2 모듈을 추가한다.
cat /etc/pam.d/system-auth
#deny=5 5회 입력 실패 시 패스워드 잠금
#unlock_time=120 계정잠김 후 마지막 계정 실패 시간부터 설정된 시간이 지나면 자동 계정 잠금 해제(단위:초)

auth required pam_tally2.so deny=5 unlock_time=120​


② pam_tally2 명령을 통해 실패 횟수 확인 및 초기화
- pam_tally2 -u 계정명 : 로그인 실패 횟수 확인
- pam_tally2 -u 계정명 -r :해당 계정의 실패 횟수 초기화

 

③ root 계정 su 제한(pam_wheel)

- 권한이 없는 일반 사용자가 su 명령을 사용하여 로그인을 시도하고 패스워드 무작위 대입 공격(Brute Force Attack)이나 패스워드 추측 공격(Password Guessing)을 통해 root 권한을 획득할 수 있다.

- su 명령어 사용자를 제한한다.

① wheel 그룹에 su 명령어를 허용할 사용자를 추가한다
- usermod -G wheel holly

② wheel 그룹의 사용자만 su 명령어를 허용하도록 /etc/pam.d/su 설정파일에 아래와 같이 주석을 해제한다.
cat /etc/pam.d/su

auth required pam_wheel.so use_uid debug # 이부분 주석 해제​
더보기

+ sudo 명령을 이용한 관리자(root) 권한 부여 

-sudo 명령은 다른 사용자 계정 권한으로 명령어를 실행하고자 할 때 사용하는 명령어다

- su 명령은 관리자 비밀번호를 알려줘야하는 부담이 있지만, 최소 권한의 원칙에 따라 sudo 명령을 사용하여 제한적으로 관리자 권한의 명령어를 실행하는 것을 보안관점에서 권장한다.

문법 sudo [-u 실행 권한 계정명] 명령어
옵션 -u 명령어를 실행할 때 가질 권한의 계정명. 생략 시 Root 권한
예문 #sudo /batch/log_batch.sh
#sudo -u holly /batch/batch.sh

 

- 관련 설정 파일 (/etc/sudoers)

cat /etc/sudoers

#계정명 호스트명=(실행권한계정명) [NOPASSWD:]명령어
holly ALL=(ALL) ALL
계정명 sudo 명령을 실행할 계정명,그룹명
그룹명을 줄 경우에는 "%그룹명"
모두에게 줄 경우에는 "ALL"
호스트명 sudo 명령을 실행할 호스트의 호스트명 or IP
모든 서버가 대상이면 "ALL"
실행권한계정명 명령어를 실행할 때 가질 권한의 계정명
root 포함한 모든 계정의 권한 부여시 "ALL", 생략시 root 권한 부여
NOPASSWD 해당 옵션 설정시 sudo명령을 실행하는 계정의 비밀번호를 물어보지 않는다.
명령어 실행을 허용할 명령어의 경로
모든 명령어 허용시 "ALL"