PAM

markyang92·2021년 9월 30일
0

security

목록 보기
1/10
post-thumbnail

PAM

  • 선 마이크로 시스템에서 장착형 인증 모듈(Pluggable Authentication Modules, PAM) 표준 제안
    • 인증을 위한 공유 라이브러리 시스템 (오픈 소스 소프트웨어 재단 RFC 86.0, 1995. 6)
  • 사용자 인증을 위해 '응용 프로그램'사용자를 'PAM'으로 보내서 사용자가 스스로 성공적으로 식별할 수 있는지 확인 한다.
  • 리눅스에서 인증을 요구하는 거의 모든 프로그램은 PAM을 지원하고, 대부분의 배포판들이 PAM을 사용한다.
    • 기존 UNIX 인증 API 위에서 동작하기 때문에 지원을 클라이언트로 통합하는 데 별도의 작업이 거의 필요없다.

PAM 설정

  • /etc/pam.conf: PAM 설정 파일
  • **/etc/pam.d 디렉토리: PAM 설정 파일들 있음

  • 그중 사용자 디폴트 셸을 바꾸는 chsh를 보자.

    이 라인은 사용자가 chsh 프로그램을 통해 성공적으로 인증하려면 사용자의 셸이 /etc/shells에 있어야 한다는 것을 주석으로 이야기하고 있다.
  • 각 라인 설정은 아래와 같다.
    • 기능 유형: 사용자 응용 프로그램이 PAM에서 실행하도록 요구하는 기능
      • auth: 사용자를 인증하는 작업
      • account: 사용자 계정 상태를 확인한다. (사용자가 어떤 일에 대한 권한이 주어 졌는지 확인)
      • session: 사용자의 현재 세션을 위해서만 어떤 것을 실행한다. (그날의 메시지를 보여주는 것과 같은 일이 여기에 해당한다.)
      • password: 사용자의 비밀번호나 기타 자격을 변경한다.
    • 제어 인수: 현재 라인을 위해 실행한 것이 성공하거나 실패한 후에 PAM이 하는 일을 제어한다.
      • required: 이 규칙이 성공하면 PAM은 추가적으로 규칙들을 살피게된다. 이 규칙이 실패시 PAM은 추가 규칙들로 옮겨 가지만 추가된 규칙들의 최종 결과와 상관 없이 언제나 실패를 반환한다.
      • sufficient: 이 규칙이 성공하면 인증은 성공하고 PAM은 더이상 규칙들을 보려고 할 필요가 없다. 이 규칙이 실패 시, PAM은 다른 규칙들로 옮겨간다.
      • requisite: 이 규칙이 성공하면 PAM은 추가적으로 규칙들을 살피게된다. 실패한다면 인증이 성공하지 못한 것이고 PAM은 더이상 규칙들을 살펴볼 필요가 없게된다.
    • 모듈: 이 라인을 위해 실행되는 인증 모듈. 라인이 실제로 하는 일을 결정한다. 또한 모듈은 하나 이상의 기능 유형을 가질 수 있다.
      • pam_shells.so: pam_shells.so모듈은 사용자의 현재 셸이/etc/shells에 들어가 있는지를 확인한다.
      • pam_unix.so: auth 기능을 실행할 때 비밀번호를 확인한다. password 기능을 실행할 때는 비밀번호를 '지정'한다.
      • pam_rootok.so: 모듈은 루트 유저가 인증하려고 하는 당사자인지 확인한다.
      • pam_deny.so: 항상 실패한다. 제어인수가 required라면, PAM은 위 PAM 설정 프로그램 자체를 실패로 보고한다. 시도할 만한 것이 더이상 남아 있지 않을 때는 이것이 디폴트가 된다.
  • @include 구문은 '전체 설정 파일을 로딩'한다. 또한 특정 기능에 대한 설정만을 로딩하려면 제어 인수를 사용할 수 있다.


PAM 모듈 인수

  • PAM을 사용할 때 기능(function)과 동작(action) 에 대해 혼동하지 말아야한다.
    • 기능(function): 최종 목표. 즉, 사용자 응용프로그램 입장에서 PAM이 실행하기 원하는 것
    • 동작(action): PAM이 그 목표에 도달하기 위해 취하는 구체적인 단계.
  • 사용자 응용 프로그램은 먼저 기능(function)을 작동 시키고, PAM은 여러 동작(action)으로 상세한 부분을 처리한다.

  • PAM 모듈은 모듈명 다음에 인수를 취할 수 있다.
auth	sufficient	pam_unix.so	nullok
  • 여기서 nullok 인수는 사용자가 비밀번호를 갖고 있지 않을 수 있다는 의미이다. (디폴트는 사요자가 비밀번호를 갖고 있지 않으면 실패)

PAM Tips

  • PAM 모듈 설치 유무: $ man -k pam_
  • 모듈의 위치: $ locate unix_pam.so
  • /etc/pam.d/other 설정 파일은 디폴트 설정 파일이다. 자체적으로 설정 파일이 없는 애플리케이션을 위한 것
  • PAM 설정은 모듈인수로 끝나지 않는다. 일부 모듈은 사용자별로 제한을 설정하기 위해서 /etc/security의 추가 파일들에 접근할 수 있다.

PAM과 비밀번호

  • PAM을 지원하지 않는 애플리케이션이 있는데, 이 애플리케이션들은 아래의 것들을 사용한다.
    • Shadow, /etc/login.defs
    • /etc/login.defs: 기존의 Shadow 비밀번호를 위한 설정 파일이다. 이 파일은 Shadow 비밀번호 파일을 위해 사용된 암호화 알고리즘에 대한 정보를 담고 있다.
      하지만 현재 PAM 설정이 이런 정보를 담고 있기 때문에 사용되는 경우는 아주 드물다.
    • PAM을 지원하지 않는 애플리케이션에 대비해 PAM 설정과 /etc/login.defs의 암호화 알고리즘을 일치 시켜야한다.

  • PAM은 비밀번호 암호 체계에 대한 정보를 어디에서 얻었을까? PAM은 비밀번호와 상호작용을 하기 위해 두 가지 방법을 사용한다.
  1. 앞에서 언급한 auth 기능 (비밀번호 검증)과 password(비밀번호 설정) 이다.
    1.1. 비밀번호 설정 인수를 추적하는 것이 가장 쉽다.
$ grep password.*unix /etc/pam.d/*

일치하는 라인들은 'pam_unix.so'를 포함하고 있을 것이며 다음과 같은 형식이다.

password	sufficient	pam_unix.so	obscure	sha512
  • 인수 obscuresha512는 비밀번호를 설정할 때 PAM이 해야 할 일을 알려주고 있다.
    먼저 PAM은 비밀번호가 충분히 "잘 알려져 있찌 않은(obscure)" 것인지 확인하다. 그리고 PAM은 새로운 비밀번호를 암호화하기 위해 SHA512 알고리즘을 사용한다.
  • 그러나 이것은 오직 사용자가 비밀번호를 설정할 때 발생하는 것이지 PAM이 비밀번호를 확인할 때 일어나는 일은 아니다.
    아쉽지만, 설정에서는 우리에게 아무것도 알려주지 않는다. auth 기능의 경우 pam_unix.so에 대한 암호화 인수가 존재하지 않는다. pam_unix.so는 알고리즘을 단순히 추측하려는 시도를 하는 것으로 알려져 있다. 보통 어떤 것이든 효과가 나타날 때까지, 혹은 시도할 것이 남아 있지 않을 때까지 막대한 양의 작업을 하도록 libcrypt 라이브러리에 요구한다. 그렇기 때문에 검증에 관한 암호화 알고리즘에 대해 신경 쓸 필요가 없다.
profile
pllpokko@alumni.kaist.ac.kr

0개의 댓글