시스템 해킹

PAM 알아보기

kchabin 2024. 10. 22. 19:11

PAM(Pluggable Authentication Modules)

리눅스 시스템에서 사용자의 인증을 담당하는 모듈

  • 사용자의 서비스 접근 통합 관리
  • 네가지 모듈(auth, account, password, session)로 구성됨
  • 각 모듈을 활용해 root 접속 제한, 비밀번호 강도 설정, 비밀번호 만료 일자 등을 설정함 → 사용자 계정 보안 강화

모듈 설명

authentication 비밀번호, 공개키를 이용하여 사용자의 신원을 확인하는 모듈
account 계정 만료, 시간, 특정 서비스 접근 권한 등 인증 조건을 검사하는 모듈
password 비밀번호 갱신, 복잡도 등을 설정하는 모듈
session 사용자 세션의 시작부터 끝까지 가능한 작업을 정의하는 모듈

PAM을 통한 접근 제어

  1. 로그인 시도
  2. PAM이 /etc/pam.d 에 있는 서비스별 구성파일(로그인의 경우 system-auth)을 확인
  3. PAM 모듈에 사용자 신원확인, 비밀번호 일치 여부 등 요청
  4. 결과가 일치하면 로그인 허용

/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
  1. 사용자 계정
  2. 패스워드를 암호화한 값 → x로 돼있으면 shadow 파일에 저장됨
  3. 사용자 id(root=0)
  4. 그룹 id (root=0)
  5. 사용자에 대한 참고 정보 - 여긴 빈칸으로 돼있다.
  6. 사용자의 홈 디렉토리
  7. 사용자 기본 쉘 종류 지정 → /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일부터 계산), 사용하지 않는 예약 필드 이다.