PAM 알아보기
PAM(Pluggable Authentication Modules)
리눅스 시스템에서 사용자의 인증을 담당하는 모듈
- 사용자의 서비스 접근 통합 관리
- 네가지 모듈(auth, account, password, session)로 구성됨
- 각 모듈을 활용해 root 접속 제한, 비밀번호 강도 설정, 비밀번호 만료 일자 등을 설정함 → 사용자 계정 보안 강화
모듈 설명
authentication | 비밀번호, 공개키를 이용하여 사용자의 신원을 확인하는 모듈 |
account | 계정 만료, 시간, 특정 서비스 접근 권한 등 인증 조건을 검사하는 모듈 |
password | 비밀번호 갱신, 복잡도 등을 설정하는 모듈 |
session | 사용자 세션의 시작부터 끝까지 가능한 작업을 정의하는 모듈 |
PAM을 통한 접근 제어
- 로그인 시도
- PAM이 /etc/pam.d 에 있는 서비스별 구성파일(로그인의 경우 system-auth)을 확인
- PAM 모듈에 사용자 신원확인, 비밀번호 일치 여부 등 요청
- 결과가 일치하면 로그인 허용
/etc/pam.d 구성파일
/etc/pam.d/ 디렉토리 밑에 모듈 타입, Control Flag, PAM 모듈, Module Arguments 총 네 가지 구성 파일이 있음.
- 모듈 타입 네 가지를 확인할 수 있다.
- passwd, su 등 사용자 권한과 인증에 대한 PAM 구성 파일이 있다.
cat /etc/pam.d/su 를 통해 su 명령에 대한 PAM 구성 파일을 확인해보자
cat /etc/pam.d/su
#
# The PAM configuration file for the Shadow `su' service
#
# This allows root to su without passwords (normal operation)
**auth sufficient pam_rootok.so**
(생략..)
**session required pam_env.so readenv=1**
# locale variables are also kept into /etc/default/locale in etch
# reading this file *in addition to /etc/environment* does not hurt
**session required pam_env.so readenv=1 envfile=/etc/default/locale**
# "nopen" stands to avoid reporting new mail when su'ing to another user
**session optional pam_mail.so nopen**
# Sets up user limits according to /etc/security/limits.conf
# (Replaces the use of /etc/limits in old login)
**session required pam_limits.so**
# The standard Unix authentication modules, used with
# NIS (man nsswitch) as well as normal /etc/passwd and
# /etc/shadow entries.
**@include common-auth
@include common-account
@include common-session**
Control Flag
PAM 구성 파일의 내용을 이해하려면 아래 표에 나오는 Control Flag 에 대해 이해해야 한다.
- PAM 모듈이 인증한 결과에 따라 어떠한 동작을 실행하는지 나타내는 플래그이다.
Control Flag 결과 설명
required (인증 결과 관계없이 무조건 다음 인증 실행) |
성공 | 최종 인증 결과는 무조건 성공 |
실패 | 최종 인증 결과는 무조건 실패 | |
requisite | 성공 | 다음 인증 모듈 실행 |
실패 | 인증 실패 결과 즉시 반환 | |
sufficient | 성공 | 인증 성공 결과 즉시 반환 |
실패 | 다음 인증 모듈 실행 | |
include(@include) | 성공 | 다른 PAM 구성 파일 호출 |
실패 | ||
optional | 성공 | 인증 결과에 반영되지 않지만, 다른 인증 모듈의 결과가 없다면 모듈 결과를 반환한다. |
실패 | ||
substack | 성공 | include와 비슷하지만 인증 결과 값에 따라 동작이 달라진다. |
실패 |
다시 한줄 씩 보면 구성 파일의 각 항목은
모듈 타입 | control flag | PAM 모듈 → 3가지로 작성된다.
# This allows root to su without passwords (normal operation)
auth sufficient pam_rootok.so
- 모듈 타입은 authentication으로 사용자 신원 확인을 수행하는 모듈이다.
- sufficient 플래그는 성공 시 인증 성공 결과를 즉시 반환하고, 실패하면 다음 인증 모듈을 실행한다.
- su 명령어는 사용자가 root라면 인증에 성공하고, 일반 사용자라면 그 다음 인증 모듈을 실행한다.
- pam_rootok.so : root 계정인 경우 추가 인증 없이 무조건 허용하는 PAM 모듈.
→ su 명령어는 사용자가 root면 인증 성공, 일반 사용자라면 다음 설정에 따라 인증해야한다.
PAM 모듈
구성 파일에서 PAM 인증 모듈을 선택하는 부분으로, 원하는 인증 기능을 선택할 수 있다. 대표적으로 pam_rootok , pam_wheel.so 등이 있다.
session required pam_env.so readenv=1
session required pam_env.so readenv=1 envfile=/etc/default/locale
session optional pam_mail.so nopen
- session 모듈 타입은 사용자 세션의 시작부터 끝까지 가능한 작업을 정의한다.
- required 플래그는 무조건 성공 or 무조건 실패 인증 결과를 반환한다.
- pam_env.so - 인증을 위한 환경 변수를 확인한다.
- optional : 결과가 반영되지 않는다. ( 다른 인증 모듈 결과 x 전제)
- pam_mail.so : 사용자에게 "새 메일이 있습니다" 서비스를 제공하는 PAM 모듈이다.
- nopen: 로그인 시 "새 메일이 있습니다" 또는 "메일이 없습니다"와 같은 메시지를 출력하지 않도록 한다.
session required pam_limits.so
- /etc/security/limits.conf 에 따라 사용자 리밋을 설정한다.
@include common-auth
@include common-account
@include common-session
- @include common 모듈을 통해 모듈 타입별 기본 인증 모듈을 추가한다.
PAM 보안 설정하기
현재 사용중인 pisecu 계정을 생성한 wheel 그룹에 추가한다.
wheel 그룹에 넣지 않은 nopamuser도 생성
su의 PAM 구성 파일 수정
주석을 제거하고 저장
/lib/security/pam_wheel.so 모듈
- root 권한을 얻을 수 있는 자격을 사용자가 wheel 그룹에 속한 경우에만 가능하도록 함.
su 명령어 실행 결과 비교
su - root 를 입력하면 정상적으로 root 사용자로 전환된다.
- wheel 그룹에 속한 사용자이기 때문
nopamuser는 Permission denied 가 뜨면서 root 사용자로 전환되지 않는다.
- wheel 그룹에 속한 사용자가 아니기 때문이다.
su pam 설정 파일로 가서 아까 pam_wheel.so 관련 설정을 주석처리하면 이젠 패스워드 입력 시 root 사용자로 전환이 되는 걸 확인할 수 있다.
계정 임계값 설정하기
PAM 설정 파일인 /etc/pam.d/system-auth 파일을 확인한다
pam_tally.so 은 로그인 시도 횟수를 추적해서 임계값을 초과하면 계정을 잠그는 모듈이다.
- deny=5 : 인증 실패 임계값 설정
- unlock_time=120 : 120초 후에 계정 잠금 해제
- no_magic_root : root 계정은 잠금 예외
- reset : 접속 시도 성공 시 실패 횟수 초기화
패스워드 복잡도 설정
/etc/security/pwquality.conf 파일을 열어서 패스워드 복잡성 설정을 변경한다.
- minlen = 8 주석처리 제거.
(설정 예)
minlen = 8 # 패스워드 최소 길이 설정
dcredit = -1 # 숫자 최소 1자 이상 요구
lcredit = -1 # 소문자 최소 1자 이상 요구
ocredit = -1 # 특수문자 최소 1자 이상 요구
minclass = 3 # 패스워드에 포함되어야 하는 다른 문자 클래스의 최소 개수 설정
maxrepeat = 3 # 같은 문자 반복 허용 횟수 설정
maxsequence = 3 # 연속된 문자나 숫자 반복 허용 횟수 설정
maxclassrepeat = 10 # 동일한 문자 클래스의 문자 반복 허용 횟수 설정
accountsecu:x:1003:1003::/home/accountsecu:/bin/sh
nopamuser:x:1004:1005::/home/nopamuser:/bin/sh
- 사용자 계정
- 패스워드를 암호화한 값 → x로 돼있으면 shadow 파일에 저장됨
- 사용자 id(root=0)
- 그룹 id (root=0)
- 사용자에 대한 참고 정보 - 여긴 빈칸으로 돼있다.
- 사용자의 홈 디렉토리
- 사용자 기본 쉘 종류 지정 → /bin/sh
pisecu:$y$j9T$y4ECjE37pdUfFk9voEKyj0$X63arjG6Hr/b.Fd6EsG4vfHhrvFO2xNbHF8vaR470Y2:20012:0:99999:7:::
- $y$ : Hashid를 의미한다. yescript 를 활용했다는 의미
- 1 이면 MD5, 2a면 Blowfish, 5면 SHA256, 6이면 SHA512를 의미한다.
- 노란색으로 표시한 부분은 패스워드 암호화값이다.
- 이런식으로 * 표시는 계정을 막아뒀다는 뜻, 공란이면 패스워드 없음
- 20012 : 1970년 1월 1일부터 계산한 패스워드가 수정된 날짜의 일수
- 0 : 패스워드가 변경되기 전 최소 사용기간 → 0이면 언제든지 변경할 수 있다.
- 99999 : 패스워드 최대 사용기간 → 99999 이면 변경없이 사용 가능
- 사용 만기일 전에 경고 메시지 제공 일수는 7일
- 나머지 빈칸 세개는 각각 만기 후 계정 로그인 접속차단 일수, 계정 로그인이 금지된 일수(1970년 1월1일부터 계산), 사용하지 않는 예약 필드 이다.