본문 바로가기
정보보안기사 필기/1. 정보보안 일반

정보보안기사 필기 4-7. 유닉스/리눅스 서버 보안(PAM:장착형 인증 모듈)

by kkmin93 2022. 4. 19.
반응형

정보보안기사 필기 4-7. 유닉스/리눅스 서버 보안(PAM:장착형 인증 모듈)

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

 1) 개요

  • PAM은 리눅스 시스템 내에서 사용되는 각종 어플리케이션 인증(Authentication)을 위해 제공되는 다양한 인증용 라이브러리들을 말한다.
    • PAM을 이용하는 서비스나 어플리케이션은 독자적으로 인증처리 로직을 구현하는것이 아닌 PAM 설정파일을 이용 → PAM 모듈을 이용해서 인증처리를 진행하겠다는 의미이다.
  • 일반적으로 /lib/security 또는 /usr/lib/security 디렉터리에 해당 라이브러리가 저장되어 있다.

[ 그림 1-1. PAM 라이브러리 형태(*.so) ]

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

 

 2) PAM을 사용한 인증 절차

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

  2-1) PAM 라이브러리 관련 경로

  • /etc/pam.d : PAM 라이브러리를 이용하는 각 응용 프로그램(서비스)의 설정 파일이 위치한다. 설정파일명은 응용 프로그램(서비스)명과 동일하다.
  • /lib/security : PAM 라이브러리가 제공하는 다양한 인증 모듈들이 위치한다.
  • /etc/security : PAM 모듈 실행에 필요한 추가 설정 파일이 위치한다.

 

  2-2) PAM 설정파일(/etc/pam.d/remote 설정파일 일부)

[ 그림 1-2. /etc/pam.d/remote 설정파일 일부 ]

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

 

 3) PAM 활용 Ⅰ 예

  3-1) root 계정의 원격 접속 제한

  • root 계정은 시스템을 관리하는 매우 중요한 계정으로 직접 로그인이 가능하면 불법적인 침입자의 목표가 될 수 있다. 따라서 root 계정의 원격 접속을 금지한다.
  • 터미널 접속 시 /etc/security 파일에 등록되어 있는 터미널이 아니면 root의 접속을 허용하지 않도록 PAM 설정을 한다.
  • 관리자가 root 계정 접속은 "관리자에게 부여된 사용자 계정으로 원격 접속 → su(switch user) 명령어를 통해 root 계정으로 로그인"하는 방식으로 접속한다. (root 계정의 직접적인 원격 접속을 하지 않는다.)
  • /etc/security 파일 : pam_securetty.so 모듈이 사용하는 파일로 터미널 접속 시 root 접근 제한 설정 파일
  • 실습
    • 터미널 접근 시 root 계정을 사용하지 못하도록 하기 위해 /etc/pam.d 디렉터리에 있는 remote 서비스(또는 login 서비스) 설정파일에 아래와 같이 pam_securetty.so 모듈을 추가한다.
    • pam_securetty.so 모듈이 참조하는 /etc/securetty 파일에 "pts/~" 터미널을 모두 제거(또는 주석처리)한다.
    • "pts/~" 터미널을 모두 제거하게 되면 원격에서 접속할 수 있는 터미널이 없어지기 때문에 root 계정에 원격 접속이 불가능해진다.
    • tty(terminal-teleype) : 서버와 연결된 입/출력장치(모니터, 키보드 등)을 통해 사용자가 콘솔로 직접 로그인함
    • pts(pseudo-terminal, 가상터미널) : Telnet, 터미널 등을 통해 접속하는 가상 터미널을 의미

 

  3-2) 유닉스/리눅스 시스템별 root 계정 원격 접속 제한 설정

SOLARIS #cat /etc/default/login
CONSOLE=/dev/console ▶ #을 붙이지 않으면 콘솔을 통해서만 접근이 가능하게 된다.
LINUX #cat /etc/pam.d/login
auth required /lib/security/pam.securetty.so
#cat /etc/securetty
pts/0 ~ pts/x 관련 설정이 존재하지 않음
AIX #cat /etc/security/user
rlogin = false ▶ false로 하면 외부에서 접근이 불가능하다.
HP-UX #cat /etc/securetty
console ▶ #을 붙이지 않으면 콘솔을 통해서만 접근이 가능하게 된다.

 

  3-3) 취약점 점검

[ 그림 1-3. 'w' 명령어를 통한 root 사용자 정보 ]

  • 점검결과 중 TTY 컬럼(터미널 타입 정보)을 살펴보면, root 계정이 pts 타입으로 다수 접속한 것을 볼 수 있다. pts는 가상 터미널 타입으로 Telnet, 터미널 등을 통해 root 계정으로 접속한 것으로 판단할 수 있다.
  • 아무런 작업을 하지 않고 대기하고 있는 상태를 IDLE 컬럼의 시간으로 표시가 되는데 세션 타임 아웃 설정을 설정하여 일정시간 지난 후 세션을 끊어주도록 설정해주어야 한다.
  • /var/log/secure를 통한 pam 모듈 로그를 확인할 수 있다.

  3-4) SSH(Secure Shell) root 원격 접속 제한 설정

[ 그림 1-4. sshd_config 설정 ]

  • Telnet 또는 FTP를 사용하여 원격 접속 또는 파일 송수신을 할 경우 평문 통신을 하기 때문에 공격자의 스니핑 공격에 매우 취약하다. 이에 대한 대안으로 SSH를 사용할 수 있는데, SSH는 암호 통신을 이용하여 네트워크상의 다른 컴퓨터에 접속하여 원격으로 명령을 실행하거나 파일을 조작하는 응용 프로그램 또는 프로토콜을 의미하며 대표적인 서비스는 다음과 같다.
  • SSH 데몬 설정 파일인 /etc/ssh/sshd_config의 PermitRootLogin 항목을 no로 설정하여 root 계정의 원격 접속을 허용하지 않도록 한다. (PermitRootLogin이 주석(#)되어 있거나 yes로 설정되어 있으면 취약한 설정이다.)
  • 설정 파일을 저장하고 SSH 데몬을 재시작한다.

 4) PAM 활용 Ⅱ 예

  4-1) 계정 잠김 임계값 설정

  • 공격자에 의한 패스워드 무작위 대입 공격이나 사전 대입 공격 발생 시 암호입력 실패 횟수를 적절하게 제한하고 공격시간을 지체시켜 패스워드 유출 위험을 줄인다.
  • 계정 잠금 임계값을 지정하여(권장 5회 이하) 초과 시 패스워드를 일정시간 잠근다.
  • pam_tally2.so(또는 pam_tally.so) 모듈 이용
  • 계정 잠금 임계값을 설정하기 위해 /etc/pam.d 디렉터리에 있는 system_auth 서비스 설정파일에 아래와 같이 pam_tally2 모듈을 추가한다. 
    • deny=5 : 5회 입력 실패 시 패스워드를 잠근다.
    • unlock_time=120 : 계정 잠김 후 마지막 계정 실패 시간부터 설정된 시간이 지나면 자동 계정 잠금 해제

  • /var/log/secure를 통한 pam 모듈 로그를 확인할 수 있다.
  • pam_tally2 명령을 통해 실패 횟수 확인 및 초기화
    • "pam_tally2 -u 계정명" 명령을 통해 로그인 실패 횟수 확인
    • "pam_tally2 -u 계정명 -r" 명령을 통해 해당 계정의 실패 횟수 초기화

  4-2) 유닉스/리눅스 시스템별 계정 잠금 임계값 설정

[ 그림 1-5. 리눅스 계정 잠금 임계값 설정(/etc/pam.d/system-auth) ]

  • no_magic_root : root 계정은 패스워드 잠금 설정을 적용하지 않는다. (관리자 계정이 잠기게되면 시스템을 사용할 수 없으므로 예외하겠다는 옵션)
  • reset : 접속 시도 성공 시 실패한 횟수(누적) 초기화

 5) PAM 활용 Ⅲ 예

  5-1) root 계정 su 제한

  • 권한이 없는 일반 사용자가 su 명령을 사용하여 로그인을 시도하고 패스워드 무작위 대입 공격이나 패스워드 추측 공격을 통해 root 권한을 획득할 수 있다.
  • su 명령어 사용이 허용된 사용자만 root 계정으로 접속할 수 있도록 설정한다.
  • pam_wheel.so 모듈 이용

 

  5-2 ) 실습

  • su 명령을 사용할 수 있는 그룹인 'wheel'에 사용자를 추가한다.(보조그룹에 추가한다.)

[ 그림 1-6. wheel 그룹에 사용자 추가 ]

  • "usermod -G wheel 계정명" 명령어 또는 "/etc/group" 파일을 수정하여 필요한 계정을 추가한다.
  • wheel 그룹의 사용자만 su 명령어를 허용하도록 /etc/pam.d 디렉터리에 있는 su 서비스 설정파일에 아래와 같이 설정해준다.

[ 그림 1-7. /etc/pam.d/su 설정파일 ]

  • /var/log/secure를 통한 pam 모듈 로그를 확인할 수 있다.

 

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

  • sudo(superuser do) 명령은 다른 사용자 계정(root 포함) 권한으로 명령어를 실행하고자 할 때 사용하는 명령어이다.
  • su 명령을 사용할 경우 관리자(root)의 비밀번호를 알려줘야 한다는 부담이 있으며, 최소 권한의 원칙에 따라 관리자로 로그인하는 것을 차단하고 권한이 필요한 경우에만 sudo 명령을 사용하여 제한적으로 관리자 권한의 명령어를 실행하는 것을 보안 관점에서 권장한다.
  • sudo 명령은 실행하는 계정의 비밀번호를 물어보게 된다.
  • sudo 명령 설정 파일 : /etc/sudoers
  • sudo 명령어 및 sudoers 파일 설정
문법 sudo [-u 실행 권한 계정명] 명령어
옵션 -u 명령어를 실행할 때 가질 권한의 계정명, 생략시 root 권한을 실행권한으로 가진다.
예문 $ sudo /batch/log_batch.sh
$ sudo -u kkmin /batch.sh
계정명 호스트명 실행 권한 계정명 [NOPASSWD:] 명령어
  • 계정명 : sudo 명령을 실행할 계정명이나 그룹명, 그룹명을 줄 경우에는 "%그룹명"을 사용하고 모두에게 줄 경우에는 "ALL" 지정
  • 호스트명 : sudo 명령을 실행할 호스트의 호스트명 또는 IP, 모든 서버가 대상이면 "ALL" 지정
  • 실행 권한 계정명 : 명령어를 실행할 때 가질 권한의 계정명, root를 포함한 모든 계정의 권한을 부여할 경우 "ALL"로 지정하며 생략시 "root" 권한 부여
  • NOPASSWD : 해당 옵션을 설정할 경우 sudo 명령을 실행하는 계정의 비밀번호를 물어보지 않는다.
  • 명령어 : 실행을 허용할 명령어의 경로, 모든 명령어를 허용할 경우 "ALL" 지정

[ 그림 1-8. /etc/sudoers 설정 예시 ]

 

반응형