PAM
장착형 인증 모듈(Pluggable Authentication Modules)
PAM 이란?
① 개념
- 리눅스 시스템 내에서 사용되는 각종 애플리케이션 인증(Authentication)을 위해 제공되는 다양한 인증용 라이브러리
② 특징
- 리눅스는 로그인이나 Telnet,FTP 같은 각종 프로그램 사용 시 PAM을 통해 인증을 처리한다.
- 프로그램 개발 시 인증 모듈을 별도 개발하지 않고 플러그인 방식의 PAM을 사용함으로써 인증 방식 및 정책의 유연성과 중앙 통제가 가능하다는 장점이 있다.
- 리눅스 시스템의 사용자 인증의 핵심
- 각 응용프로그램에 대한 인증 형태, 사용자 권한, 접근 자원 등을 선택할 수 있다.
- 기존 응용프로그램을 수정할 필요 없이 인증 부분을 독립적이고 선택적으로 새롭고 다양한 인증 서비스 모듈을 추가하여 사용할 수 있다.
③ 인증 절차
- 각 프로그램은 인증이 필요한 부분에 PAM 라이브러리를 호출한다.
- PAM 라이브러리가 호출되면 해당 프로그램의 PAM 설정파일을 참조하여 등록된 여러 PAM 모듈을 수행하고, 그 결과를 응용 프로그램에 반환한다.
- 응용 프로그램은 반환된 결과를 이용해 인증 여부를 결정한다.
④ /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" |
'정보보안 > 시스템 보안' 카테고리의 다른 글
[UNIX/Linux 기본학습] 시스템 해킹 (0) | 2024.11.12 |
---|---|
[UNIX/Linux 기본학습] 서버보안4 (3) | 2024.11.12 |
[UNIX/Linux 기본학습] 서버보안2 (0) | 2024.11.11 |
[UNIX/Linux 기본학습] 서버보안1 (0) | 2024.11.10 |
[UNIX/Linux 기본학습] 시스템 시작과 종료 (1) | 2024.11.10 |