3장. 소개

초심자를 위해 예시로 시작해 보겠다. 사용자에게 어떤 서비스를 허가하는 응용을 생각해 보자. login이 그런 프로그램 중 하나다. login은 두 가지 일을 하는데, 첫째로 서비스를 요청하는 사용자가 스스로 주장하는 그 사람이 맞는지 확인하고, 둘째로 그 사용자가 요청한 서비스를 제공한다. login의 경우 서비스란 그 사용자 신원으로 도는 명령 셸(bash, tcsh, zsh 등)이다.

전통적으로 앞쪽 단계를 수행하는 방식은 login 응용에서 사용자에게 패스워드를 물어 보고서 시스템에 있는 값과 일치하는지 확인하는 것이다. 그래서 그 시스템에 있어선 그 사용자가 스스로 주장하는 그 사람이다. 바로 그 작업을 Linux-PAM에게 맡긴다.

응용 프로그래머(이 경우 login 응용을 작성하는 사람) 입장에서는 Linux-PAM이 인증 작업(사용자 신원 검증)을 대신 해 주는 것이다.

Linux-PAM의 유연함은 여러분, 즉 시스템 관리자가 어떤 인증 체계를 쓸지 마음대로 규정할 수 있다는 점에 있다. 사용 중인 리눅스 시스템 상의 모든 PAM 이용 응용을 위한 체계를 마음대로 설정할 수 있다. 즉 무조건 신뢰(pam_permit)처럼 단순한 방식부터 망막 스캔과 성문 감별, 일회용 패스워드의 조합처럼 편집증적인 방식으로도 인증할 수 있다.

유연성의 예로 이런 상황을 생각해 보자. 시스템 관리자(부모)가 사용자(자식)들의 수학 능력을 향상시키고 싶어 한다. 이때 사용자가 좋아하는 (당연히 PAM을 이용하는) "마구 쏘기 게임"에서 12 이하의 난수 두 개의 곱을 요청해서 사용자를 인증하도록 구성할 수 있다. 뭔가 괜찮은 게임이라면 사용자들은 곧 구구단을 익히게 될 거다. 그리고 좀 더 컸을 때는 (긴) 나눗셈을 포함하게 인증을 업그레이드할 수도 있다!

Linux-PAM에선 네 가지 별개의 (관리) 작업을 다룬다. 그 작업은 인증 관리, 계정 관리, 세션 관리, 패스워드 관리다. 원하는 관리 체계를 응용 동작에 연계시키는 건 관련 Linux-PAM 설정 파일의 내용을 통해 이뤄진다. 관리 기능을 수행하는 건 설정 파일에 지정된 모듈이다. 그 파일의 문법을 이어지는 절에서 설명한다.

다음은 Linux-PAM 전체 구조를 보여 주는 그림이다.

  +----------------+
  | application: X |
  +----------------+       /  +----------+     +================+
  | authentication-[---->--\--] Linux-   |--<--| PAM config file|
  |       +        [----<--/--]   PAM    |     |================|
  |[conversation()][--+    \  |          |     | X auth .. a.so |
  +----------------+  |    /  +-n--n-----+     | X auth .. b.so |
  |                |  |       __|  |           |           _____/
  |  service user  |  A      |     |           |____,-----'
  |                |  |      V     A
  +----------------+  +------|-----|---------+ -----+------+
                         +---u-----u----+    |      |      |
                         |   auth....   |--[ a ]--[ b ]--[ c ]
                         +--------------+
                         |   acct....   |--[ b ]--[ d ]
                         +--------------+
                         |   password   |--[ b ]--[ c ]
                         +--------------+
                         |   session    |--[ e ]--[ c ]
                         +--------------+
      

설명하자면 그림 왼편은 응용을 나타낸다. 응용 X다. 그 응용은 Linux-PAM 라이브러리와 접하고 있으며 구성된 인증 방법의 세부 사항에 대해선 전혀 알지 못한다. Linux-PAM 라이브러리(가운데)는 PAM 설정 파일 내용물을 확인하고 응용 X에 맞는 모듈들을 적재한다. 그 모듈들은 네 가지 관리 그룹들(가운데 아래) 중 하나에 속하며 설정 파일에 등장한 순서대로 추가된다. Linux-PAM에서 그 모듈들을 호출하면 응용을 위한 다양한 인증 작업을 수행한다. 사용자에게 받아야 하거나 제공해 줘야 하는 텍스트 형태 정보를 응용에서 제공하는 대화 함수를 통해 교환한다.

프로그램에서 PAM을 쓰고 싶다면 PAM 함수 사용 코드를 명확히 프로그램에 집어넣어야 한다. 소스 코드에 접근 가능하다면 적절한 PAM 함수 사용 코드를 추가할 수 있다. 소스 코드에 접근할 수 없으며 그 바이너리에 PAM 함수가 포함돼 있지 않다면 PAM을 이용하는 게 불가능하다.