doc:linuxpam

Thu Dec 19 01:52:56 CST 2002

前言

這是份對 Linux-PAM 大略的介紹,大致上是參考 Linux-PAM System Administrator's Guide。

甚麼是 Linux-PAM?

  • Linux-PAM (pluggable Authentication Modules for Linux)
  • 由一堆 share libraries 構成,讓 sysadm 決定要怎麼認證使用者

PAM 可以做甚麼

  • 以前的程式都是要自己動手去處理認證,hard coded,要更換不方便
  • 採用 PAM 的程式,認證部份交給 PAM 去處理,application 只會知道有沒有通過、使用者是誰的資訊。要怎麼認證,由 PAM 來決定,比如 trad. UNIX passwd、radius、甚至 database 等,application 不需要重新 complie or 改 code
  • PAM 提供 auth (認證使用者與取得 group perm)、account (設定使用者能存取的時間、資源等)、session (提供 login before/after 需要做的一些事情,eg. check mail)、password (更改 auth token, i.e. password) 等四種功能。
  +----------------+
  | 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 ]
                         +--------------+

PAM 不能做甚麼

  • application 不完全依靠 PAM 提供的服務時,還是需要 passwd entry,eg. OpenSSH, some pop3 daemon
  • FreeBSD 4-stable 上的 Linux-PAM 只有到 0.66,最新的是 0.76,所以能玩的把戲其實不多,而 FreeBSD 5-current 已經 switch 到 OpenPAM

PAM conf

+ /etc/pam.d/
  Linux 放這邊
+ /etc/pam.conf
  FreeBSD 放這邊,不過 5-current's OpenPAM 已經優先用 /etc/pam.d/
  除非沒有 /etc/pam.d/other 否則是不會動用到 /etc/pam.conf
+ 參數有五個 service-name, module-type, control-flag, module-path, args

PAM conf: service-name

+ 基本上是程式的名字,eg. ftpd, rlogin, su,當然也可以在 app 裡面指定,
  像 pop3, imap, smtp 之類。
+ first-match 而 other 會 match 沒 match 到的 services

PAM conf: module-type

+ auth
  這是透過提示 user 輸入 password 或者其他足以辨識的資訊,來確認 user
  是誰。
+ account
  提供一些非 auth 的授權,比方說限制能使用的系統資源、time policy
+ session
  處理一些在 user login/logout 要處理的東西,比方說 show some msg
+ password
  更新認證用的 token
  (通常會有一個相對應的 challenge/response based auth module)

PAM conf: control-flag

+ overview
  有四種,用來讓 libpam 決定要怎麼處理該 module 成功或失敗。
+ required
  通過的話,libpam 對於這個 module-type 的 service 就算通過,
  失敗的話,其他的的(同 module-type) module 會繼續跑完
+ requisite
  類似 required,不過當失敗的時候,剩下的不會跑,會將執行權還給 application
  而且 return value 是 *第一個* 失敗的 required/requisite 的 return value
+ sufficient
  通過而且之前沒有 required 的 module 失敗的話,剩下的不會跑
  失敗的話,沒差,繼續往下跑。
+ optional
  如同這個名字代表的,就是 optional,一般會 ignore,
  除非其他 module return PAM_IGNORE
+ newer syntax
  提供了更 flexible 的方式設定 module success/failure 的時候,
  該採取的 action
  我不打算詳細講,我舉個例子
  required 跟 [success=ok new_authtok_reqd=ok ignore=ignore default=bad]

PAM conf: module-path

+ 就是 module 放在哪,如果放預設的目錄,只要寫 module filename 即可
  FreeBSD 放在 /usr/lib
  Linux 放在 /lib/security

PAM conf: args

+ 要傳給該 module 的 argument,格式是 arg=value,用 spcae 分隔,
  如果你的 value 中有 space,要用 [ ] 包起來,有用到 ] 的話,要 \]。
+ 一些 generic optional arguments
  - debug: 丟給 syslog(3) debug msgs
  - no_warn: 不丟給 application warnings
  - use_first_pass: 不提示 user 輸入 password,而是直接用之前打過的 password
    如果失敗了,那 user 就不會被 authenticated
  - try_first_pass: 類似 use_first_pass,不過失敗的話,會提示 user 輸入
    password

PAM conf: directory based

+ 跟 file based 的 syntax 沒有差別,唯一的差別是每個 service 都是獨立成
  一個檔案,例如 sshd, login 等,另外會有 other 負責 match 沒有 match
  到的東西。而因為 service-name 就是 filename,所以 syntax 中的 service-name
  就不需要寫了。

some security issues

+ PAM 設錯導致不能 login 的話,麻煩請愛用 signle user mode
+ other 會 match 所有沒 match 到的 service,建議這邊用 deny all 的方式

sample conf for sshd

+ 底下是 FreeBSD 4.7 pam.conf 裡面的設定,sshd login 會先試試看 skey,
  opie 這兩種 one-time password 可不可以,不行的話,就採用一般的 unix passwd
  sshd    auth    sufficient      pam_skey.so
  sshd    auth    sufficient      pam_opie.so         no_fake_prompts
  sshd    auth    required        pam_unix.so         try_first_pass
  sshd    account required        pam_unix.so
  sshd    password required       pam_permit.so
  sshd    session required        pam_permit.so
+ 底下是 FreeBSD 5.0 pam.d/sshd 的設定
  # auth
  auth            required        pam_nologin.so      no_warn
  auth            sufficient      pam_opie.so         no_warn no_fake_prompts
  auth            required        pam_opieaccess.so   no_warn
  auth            required        pam_unix.so         no_warn try_first_pass
  # account
  account         required        pam_login_access.so
  account         required        pam_unix.so
  # session
  session         required        pam_permit.so
  # password
  password        required        pam_permit.so

modules

+ 每個 module 的功能跟可以調整的東西直接看 manual page 即可

some applications

+ tpop3d against pgsql
  透過 pam 來控制,讓 tpop3d 去跟 database 認證 user,
  其實這會有一個問題,tpop3d 如果跟 MySQL 溝通的話,就不會去要 pw entry,
  可是因為透過 pam 他會去 getpwname() 所以需要偷改一下 src
  tpop3d  auth    required        pam_pgsql.so
  tpop3d  account required        pam_pgsql.so
  pam_pgsql.so 指定在 /etc/pam_pgsql.conf 存放他所需要的 arguments
  database = YOUR_DB
  table = YOUR_TBL
  host = YOUR_HOST
  user = MYSQL_USER
  password = MYSQL_PASSWORD
  user_column = userid
  pwd_column = passwd
  expiared_column = expired
  newtok_column = newtok
  pw_type = crypt
+ Smart Card
  底下那個網頁講的蠻清楚的,基本上就是我們可以把 pam_unix,.so 換成
  pam_smartcard.so 然後指定 reader 是哪一個,大致上就是這樣子。
  http://www.strongsec.com/smartcards/
doc/linuxpam.txt · Last modified: 2007/03/06 13:54 (external edit)