3. PAM (Pluggable Authentication Modules)

PAM은 현대 리눅스 배포판에서 사용자 인증의 핵심이다.

3.1. 왜

옛날 리눅스가 좋은 시절에는 su, passwd, login, xlock와 같은 프로그램들은 사용자 인증이 필요할 경우 간단히 /etc/passwd 파일에서 정보를 읽었다. 만약에 사용자 패스워드를 변경할 필요가 있을 경우, 간단히 /etc/passwd를 편집했다. 이러한 간단하나 투박한 방법은 시스템관리와 응용프로그램 개발자들에 많은 문제점을 제공했다. MD5와 쉐도우 패스워드가 굉장히 유행함에 따라 다른 방법을 다루고자 할 때 사용자 인증을 필요로 하는 각각의 프로그램 적절한 정보를 얻는 방법을 알아야 했다. 만약에 여러분들이 사용자 인증 방법을 변경하고자 한다면 모든 프로그램들은 새로 컴파일 해야 했다. PAM은 사용자정보의 저장방법과 관계없이 프로그램들이 투명하게 사용자를 인증하게 함으로써 이러한 혼잡함을 제거했다.

3.2. 무엇을

리눅스-PAM 시스템 관리자 설명서에 설명하기를 "리눅스-PAM프로젝트의 목적은 안전하고 적합한 인증방법의 개발과 소프트웨어에게 부여한 특권의 개발을 분리하는 것이다"라고 되어 있다. 이것은 사용자가 인증되어야 한다는 요청하기 위해 어떤 응용프로그램이 사용할 수 있는 함수의 라이브러리를 제공함으로써 가능하다. PAM을 사용하면 여러분들의 패스워드가 /etc/passwd 에 저장되었든지 또는 홍콩의 서버에 저장되었든지 중요하지 않다. 프로그램이 사용자 인증을 필요로 하면, PAM이 적절한 인증방법에 대한 함수를 포함하는 라이브러리를 제공한다. 이 라이브러리는 동적으로 할 당되기 때문에 인증스킴을 변경하는 것은 간단히 구성파일을 편집하면 된다.

PAM은 가장 큰 장점은 유동성이다. PAM은 사용자를 인증하는 사용자를 인증하는 어떤 프로그램의 권리를 부정하도록 구성될 수 있다. 어떤 사용자들에게 인증되도록 허가할 수 있고, 어떤 프로그램이 인증을 시도할 때 경고를 줄 수 있고, 모든 사용자들의 로그인 권한을 없앨 수도 있다. PAM의 모듈 디자인으로 인해 사용자 인증방법에 대해 확실한 통제를 할 수 있도록 한다.

3.2.1. PAM을 지원하는 리눅스 배포판

거의 모든 유행하는 배포판은 당분간 PAM을 지원한다. 여기에 PAM을 지원하는 불충분한 리눅스 배포판의 리스트가 있다:

  • 버전 5.0 이후의 RedHat

  • 버젼 5.2 이후의 Mandrake

  • 버젼 2.1이후의 Debian (부분적으로 2.1도 지원 -- 2.2에는완벽하게 지원)

  • 버젼 1.3 이후의 Caldera

  • 버젼 3.6 이후의 Turbolinux

  • 버젼 6.2 이후의 SuSE

이 목록은 확실히 불충분하고 아마도 부정확하다. 여러분들이 이목록에 대해 수정또는 추가할 사항을 로 보내주면 고맙겠다.

3.2.2. PAM 설치하기

아무생각없이 PAM을 설치하면 HOWTO의 범위를 벗어나서 시간이 오래 걸린다. PAM이 여러분의 시스템에 설치되어 있지 않다면 여러분들은 아마 오래된 리눅스를 운영하고 있으며 이것을 업그레이드 되어야 한다. 여러분들이 혼자선 해보고 싶다면 나의 도움이 필요한 사람이 아니다. 이러한 이유로 나는 여러분들은 이미 PAM이 설치되어 있다고 가정한다.

3.3. 어떻게

할 이야기가 충분하다. 그것을 해보자

3.3.1. PAM 구성파일

PAM 구성파일은 /etc/pam.d 디렉토리에 저장되어 있다(여러분이 /etc/pam.d/ 디렉토리가 없다면 걱정하지 마라. 다음 절에서 다룰 것이다.) 거기로 가서 살펴보자.

  ~$ cd /etc/pam.d
  /etc/pam.d/$ ls
  chfn	chsh	login	other	passwd	su	xlock
  /etc/pam.d/$ 
  

어떤 시스템인가에 따라 다르지만 여러분의 시스템에는 이 디렉토리에 다소 많거나 적은 파일들이 있을 것이다. 자세한 사항은 어떤지 간에, 시스템의 각각의프로그램에 대한 사용자들은 인증하는 파일을 보았을 것이다. 아마 이미 눈치챗듯이, 각각의 파일들은 그 이름을 딴 프로그램에 대한 PAM 인증구성을 포함하고 있다(other파일은 예외다. 이것은 나중에 조금 다룰 것이다). passwd 파일에 대한 PAM 구성을 보자(아주 간단하게 하기 위해 요약을 했다.)

  /etc/pam.d/$ cat login
  # PAM configuration for login
  auth       requisite  pam_securetty.so
  auth       required   pam_nologin.so
  auth       required   pam_env.so
  auth       required   pam_unix.so nulok
  account    required   pam_unix.so
  session    required   pam_unix.so
  session    optional   pam_lastlog.so
  password   required   pam_unix.so nullok obscure min=4 max=8
  

이 파일을 알아보기 전에 조금만 언급해야 겠다.

3.3.2. 조금

아주 일부의 사람들은 이렇게 생각할 것이다." 어 나는 /etc/pam.d 디렉토리가 없어!" 리눅스 목록에는 PAM을 가지고 있다고 적혀 있는데 나는 그 디렉토리를 찾을 수 없다. PAM없이는 내인생은 공허하고 무의미해! 어떻게 해야 하지?" 걱정하지 마라. 모든 것을 잃은 것은 아니다. 여러분이 리눅스에는 PAM이 포함되어 있다고 하는 데 /etc/pam.d 디렉토리가 없다면 PAM구성은 /etc/pam.conf에 저장되어 있다. 여러개의 파일에 걸쳐 퍼져 있는 것이 아니라 모든 PAM 구성은 하나의 파일에 저장되어 있다. 이것으로 인해 PAM 구성이 약간 꼬이게 된다. 그러나 3.3.2절에 적절하게 고치는 법을 설명해 놓았다.

3.3.3. 구성문법

PAM 구성파일은 다음과 같은 문법을 가지고 있다:

  type  control  module-path  module-arguments
  

로그인 구성파일(위를 봐라)을 예로 해서 PAM 구성파일에 대한 문법에 대해서 알아보자:

PAM 구성토큰

type

타입토큰은 PAM에 이 모듈에 어떤 타입의 인증이 사용될 것인지를 알려준다. 같은 타입의 모듈은 "쌓일" 수 있고, 사용자에 인증되기 위한 다중 요구사항을 만족하도록 요청할 수 있다. PAM은 네개의 타입을 인식한다.

account

계정은 사용자가 해당 서비스에 접근이 허용되었는지, 패스워드가 기간이 만료가 되었는지를 결정한다.

auth

주로 패스워드를 통하지만 생체인증과 같은 보다 정교한 방법을 통해서 사용자가 자신이 주장하는 사용자가 맞는지 결정한다.

password

패스워드는 사용자가 그들의 인증을 변경하도록 어떤 방법을 제공한다. 다시 이것은 주로 패스워드이다.

session

사용자가 인증받기 전에 또는/그리고 후에 되어야 할 것이다. 이것은 사용자 홈 디렉토리를 마운팅/언마우팅하는 것과 로그인/로그아웃 그리고 사용자에게 제공하는 서비스를 제한/제공하는 것과 같은 것을 포함할 수 있다.

로그인 구성 파일에는 각각의 타입하나에 적어도 한 개의 목록을 볼 수 있다. 이것 때문에 프로그램이 사용자들에 로그인을 허용한다. 모든 다른타입의 인증에 접근할 필요가 있다는 것을 이해할 수 있다.

control

통제 토큰은 이 모듈이 동작하지 않는다면 PAM에게 무엇을 해야할 지 알려주는 것이다. PAM은 네가지의 통제 형식을 인식한다.

requisite

이 모듈을 이용하는 인증이 실패할 경우, 즉시 인증을 거부하도록 한다.

required

인증이 거부되기 전에 비록 PAM이 이 서비스에 등록된 다른 모든 모듈들을 요구함에도 불구하고 실패할 경우 인증을 거부하도록 한다.

sufficient

비록 이전에 요청되어진 모듈이 실패하더라도 이 모듈에 의해서 인증이 성공할 경우, PAM은 인증을 승인한다.

optional

이 모듈이 성공 또는 실패하는 지는 그 모듈이 서비스에 대한 형식에 대한 유일한 모듈일 경우에 중요하다.

로그인에 대한 구성파일에서 거의 모든 통제타입이 다르다는 알 수 있다. 대부분의 요청되어지는 모듈들은 pam_unix.so(주요 인증 모듈)이고, 단 한 개의 requitsite 모듈은 pam_securitty.so 이다(사용자가 안전한 콘솔에 로그인한다는 것을 확인하는 것이다). 그리고 유일한 선택모듈은 pam_lastlogin.so 이다(사용자의 가장 최근 로그 정보를 가지고 오는 모듈)

모듈-경로

모듈경로는 PAM에게 어떤 모듈을 사용할 것인지(선택적으로) 그리고 그것을 어디서 찾을 지를 알려준다. 대부분 구성은 로그인 구성파일의 경우와 마찬가지로 모듈의 이름만 가지고 있다. 이와 같은 경우, PAM은 기본 PAM 모듈의 디렉토리에서(보통 /usr/lib/security) 모듈을 찾는 다. 그러나 여러분의 리눅스가 리눅스 파일시스템의 표준을 따른다면 PAM모듈은 /lib/security에 있다.

모듈-인수

모듈-인수는 모듈에게 전달되는 인수이다. 각각의 모듈은 각각의 인수를 가지고 있다. 예를 들어 로그인 구성에서 "nulok"가 그것이다. ("null ok", pam_unis.so 모듈로 전달되어 지는 인수로서 공백(null)패스워드를 허용한다는 것이다("ok")).

3.3.4. pam.conf 구성

여러분의 PAM구성은 /etc/pam.d가 아니라 /etc/pam.conf에 저장되어 있다면 PAM 구성줄은 조금 다르다. 각각의 서비스들이 각자의 구성파일을 가지고 있지 않고, 한줄의 구성에 첫 번째 토큰으로 서비스 이름을 가지는 모든 구성들이 /etc/pam.conf에 저장되어 있다. 예를 들어 /etc/pam.d/login에 다음과 같은 줄이:

    auth       required   pam_unix.so nulok
    

/etc/pam.conf에는 다음과 같은 줄로 나타나 있다.

    login	auth       required   pam_unix.so nulok
    

이러한 사소한 차이를 제외하고는 PAM의 나머지 문법은 같이 적용된다.

3.4. 다른 정보 얻기

PAM구성과 완벽한 PAM 모듈에 대한 참고에 관한 정보라면 Linux-PAM 시스템 관리자 설명서를 찾아봐라. 이 설명서는 PAM 구성에 관한 완벽하고 최신의 참고를 제공한다.