第二十章 PAM 認 證 模 組
索引:
20.1 認識 PAM | ||
20.1.1 | PAM 的簡介 | |
20.1.2 | PAM 的相關檔案 | |
20.2 PAM 模組設定檔 | ||
20.2.1 | PAM 模組設定檔的設定格式 | |
20.2.2 | PAM 認證模組的功能 | |
20.3 PAM 的設定範例 |
PAM 全名為 Pluggable Authentication Module -- 可插入式認證模組,可以簡單的將其視為一個應用程式介面 (API),它是在傳統 UNIX 上頭,應用程式常使用的一種認證方式。就整個認證系統而言,PAM 可以說是認證系統的前端,而認證機制 (即真正要採取認證的方式,比如根據 /etc/passwd 或 LDAP 等來做認證) 則是屬於認證系統的後端。
舉個例子來說,當 client 端的 user 要使用 SSH 做遠端連線時,首先必須輸入帳號密碼,而在 SSH Sever 收到這個認證資訊時,sshd 會將其交給 PAM 去做處理,接著則是依 /etc/pam.d/sshd 檔案內的設定來決定依哪些認證模組來做確認的工作,而 PAM 則是會將最後處理的結果適時的回應給 sshd。由以上的例子說明不難發現 sshd 本身必須支援 PAM 認證才行,也就是說 sshd 程式本身的原始碼裡頭必須包含 PAM 函式。您可以使用 ldd 指令來查閱一下就知道了:
suselinux:~ # ldd /usr/sbin/sshd linux-gate.so.1 => (0xffffe000) libwrap.so.0 => /lib/libwrap.so.0 (0x40031000) libpam.so.0 => /lib/libpam.so.0 (0x40039000) libdl.so.2 => /lib/libdl.so.2 (0x40041000) libkafs.so.0 => /usr/lib/libkafs.so.0 (0x40044000) |
如您還不太清楚 PAM 所扮演的角色,請參考以下這個架構圖再配合上面的說明來看,應該就會有概念了:
圖一:PAM 的架構圖
至於為何要取名為可插入式的認證模組呢 ? 因為它是一組隨時可讓管理員來彈性使用的認證函式庫,比如您只希望有少數使用者可以執行 su 指令來切換成其他 user 或 root 的身份,那麼可以在 /etc/pam.d/su 檔案中去引用 pam_wheel.so 模組,而當您想取消此項功能時,就將此模組拿掉即可,如此一來,我們就不必為了達到這個目的而去重新編譯 su 程式了。看到這裡,大家是不是覺得使用這個 PAM 真的是非常具有彈性呢 ?
上一小節的觀念沒問題的話,緊接著就來說明一下與 PAM 有關的幾個相關檔案介紹:
˙ | /lib/libpam*.so: 支援 PAM 的應用程式,需使用這裡所提供的 PAM 函式來存取相關的模組設定檔。不過有的 Distribution 則是將 PAM 函式安置在 /usr/lib 目錄中。 |
|||
˙ | /etc/pam.d/*: PAM 認證模組的主要設定檔就是放在這個目錄下。我們需要為支援 PAM 的應用程式安置一個檔案在裡頭,至於檔名則是寫死在程式原始碼裡面 ; 通常這裡的檔名會取一個與程式本身的名稱相關或相同 (服務名稱),所以平常您千萬不要隨意去更改檔名,因為如果程式找不到 PAM 模組設定檔時,就會套用 /etc/pam.d/other 檔案裡的設定內容。
|
|||
˙ | /lib/security/*: PAM 所使用的認證模組就是安置在這裡,比如 pam_unix2.so、pam_time.so、pam_nologin.so 等等。 |
|||
˙ | /etc/security/*: 有些 PAM 認證模組會去讀取此目錄下的相關檔案,而套用裡邊的設定值。至於詳細的情形,我們後面的範例會有說明。 |
了解了相關檔案的配置之後,我們再以 PAM 認證的詳細流程圖來跟各位說明:
圖二:PAM 的認證流程
在圖二的流程圖中,是說明應用程式會先去呼叫 PAM 函式,然後再由其去讀取 /etc/pam.d/ 目錄下的 PAM 模組設定檔,並依裡面的設定來依序執行 PAM 模組,而這些模組是以在設定檔中所設定的順序被堆疊起來 ; 接著這些堆疊模組就開始為應用程式執行不同的認證工作,那當然執行結果或許成功,或許失敗,不過不論成功或失敗都需要將執行結果回應給 PAM 函式。比如第一個 PAM 模組驗證成功或失敗後,會回應給 PAM 函式知道,至於下一個 PAM 模組會不會接著執行驗證工作,則是要依照剛剛上一個 PAM 模組傳回的結果及所設定的控制旗標來決定 (下一節會說明),而等 PAM 模組都驗證完畢後,PAM 函式才會將最終結果傳回給應用程式。
模組堆疊的概念: 往往很多時候,管理者會希望對使用者所輸入的認證資訊不是只單純的檢查帳號密碼而已,可能還會希望能進一步的作各項控管,比如開放某些服務只能在規定的時間內才能使用,或者希望部分服務只有少數使用者能夠存取,其他使用者不能使用但可以存取其他的服務等等,此時管理者就可以根據不同的需求來引用 (插入) 不同的模組,那當然不同的模組所執行的檢查工作就不同囉,比如模組 1 檢查完後,可能換模組 2 接著進行其他的檢查,模組 2 檢查完畢後也可能會由模組 3 再進行檢查 (端看管理者在設定檔中如何配置這些模組),這就是利用模組堆疊 ( statcked modules ) 的概念來驗證用戶的合法性。 |
20.2 PAM 模組設定檔
20.2.1 PAM 模組設定檔的設定格式
這部分主要是探討 /etc/pam.d/ 目錄下的 PAM 模組設定檔的內容:
suselinux:~ # ls /etc/pam.d chage gdm-autologin passwd radiusd samba sudo xlock chfn login pop3 rexec shadow useradd xscreensaver chsh netatalk ppp rlogin squid vsftpd cups openwbem pure-ftpd rpasswd sshd xdm gdm other quagga rsh su xdm-np |
先簡單了解一下這些檔案的設定格式:
|
這其中除了 options 欄位外,其餘都是必要設定的欄位 ; 接著就分別來對這幾個欄位做相關說明:
˙ | 模組類型
共分四種 modules_type:
|
|||||||||
˙ | 控制旗標
一個認證模組在執行認證檢查時,有可能成功 (success),也有可能失敗 (failure),當其傳回 success 或 failure 時,PAM 將會採取什麼動作 ? 是要繼續執行下一個模組認證 (模組堆疊的特性),還是要結束認證工作不繼續往下,這就要看您是採用什麼 control_flags 了。所以簡單的說, control_flags 是用來告知 PAM 在執行模組認證成功或失敗之後,接下來要採取的動作為何。底下就來說說四個主要的控制旗標:
|
|||||||||
˙ | 模組路徑 如果這個欄位只設定模組名稱,未指定其實際的路徑,則表示這個模組是被安置在 /lib/security 目錄中。 | |||||||||
˙ | 模組參數
這裡舉幾個模組參數給各位參考:
|
20.2.2 PAM 認證模組的功能
PAM 模組是存放在 /lib/security 目錄中:
suselinux:~ # ls /lib/security pam_access.so pam_lastlog.so pam_permit.so pam_time.so pam_chroot.so pam_ldap.so pam_pwcheck.so pam_unix.so pam_cracklib.so pam_limits.so pam_radius_auth.so pam_unix2.so pam_debug.so pam_listfile.so pam_resmgr.so pam_unix_acct.so pam_deny.so pam_localuser.so pam_rhosts_auth.so pam_unix_auth.so pam_devperm.so pam_mail.so pam_rootok.so pam_unix_passwd.so pam_env.so pam_make.so pam_rpasswd.so pam_unix_session.so pam_filter pam_mkhomedir.so pam_securetty.so pam_userdb.so pam_filter.so pam_mktemp.so pam_selinux.so pam_userpass.so pam_ftp.so pam_motd.so pam_shells.so pam_warn.so pam_group.so pam_ncp_auth.so pam_smb_auth.so pam_wheel.so pam_homecheck.so pam_nologin.so pam_smbpass.so pam_winbind.so pam_issue.so pam_opensc.so pam_stress.so pam_xauth.so pam_krb5.so pam_opie.so pam_succeed_if.so pam_krb5afs.so pam_passwdqc.so pam_tally.so |
由於實在是太多了些,因此這裡就挑幾個 PAM 認證模組的功能來說明囉:
認證模組名稱
|
主 要 用 途
|
相 關 檔 案
|
搭配的模組類型 |
pam_access.so | 可允許或拒絕特定的使用者及群組從哪個特定來源端登入。 | access.conf | account |
pam_cracklib.so | 此模組搭配其後所設定的項目,如 difok、retry、minlen、dcredit、ocredit 等,可以用來確保您使用者所選用的密碼是夠安全的。 | password | |
pam_deny.so | 拒絕一切存取。 | 皆可 | |
pam_env.so | 此模組會載入 /etc/security/pam_env.conf 檔案,以載入額外的環境變數來使用。 | pam_env.conf | auth |
pam_limits.so | 此模組會參照 /etc/security/limits.conf 的設定,來限制使用者所能使用的資源,如 CPU 使用時間、user 能同時登入的次數、user 能開啟的檔案數等等。 | limits.conf | session |
pam_listfile.so | 此模組會依照我們所做的設定及所指定的檔案,來決定是否允許或拒絕使用者存取該服務。 | auth | |
pam_mail.so | 當使用者有新的信件進來時,會在該使用者登入時告知這個訊息。 | /var/spool/mail/* |
auth |
pam_nologin.so | 可用來拒絕一般 user 登入本機,包含遠端登入。 | /etc/nologin | auth、account |
pam_permit.so | 允許一切存取。 | 皆可 | |
pam_pwcheck.so | 當使用者變更密碼時,此模組會檢查使用者所建立的新密碼是否夠安全。 | pam_pwcheck.conf | password |
pam_rootok.so | 此模組設定在 /etc/pam.d/su 檔案中時,表示允許 root 在執行 su 指令來切換成其他 user 的身分時,可以不需輸入密碼。 | auth | |
pam_securetty.so | 限定 root 可從哪幾個安全的終端機登入。 | /etc/securetty | auth |
pam_time.so | 依照 /etc/security/time.conf 的設定,來限制使用者可以在什麼時間登入本機。 | time.conf | account |
pam_unix2.so | 此模組可用來檢查使用者所提供的帳號密碼是否正確或帳號密碼是否過期等,端看我們所設定的模組類型 (modules_type) 為何而有不同的功用。 | 皆可 | |
pam_wheel.so | 此模組設定在 /etc/pam.d/su 檔案中時,表示只允許 wheel 群組的成員可以執行 su 指令來變換成其他 user 的身份。 | auth |
註:上面 [相關檔案] 欄位如未指出路徑,即是存在於 /etc/security 目錄中。另外如您想找更多的說明文件,請自行查閱 /usr/share/doc/packages/pam/modules。
20.3 PAM 的設定範例
看了前面兩節的介紹後,可能還是有點模模糊糊的,不過沒關係,底下我們會舉幾個模組設定檔的範例來加以解說,這樣應該就可以對 PAM 認證模組有進一步的認識。
範例一:/etc/pam.d/login
這是 login 認證模組所要讀取的模組設定檔。您可以注意到模組類型為 auth 的第一筆,其所使用的控制旗標為 requisite,此乃表示 pam_unix2.so 模組若是傳回 failure,則不會再往下進行其他堆疊模組的認證,而是直接宣告認證失敗。那如果傳回 success, 則是會繼續往下進行其他堆疊模組的認證。 只有當 requisite 及所有的 required 都傳回 success,整個認證才算成功。 pam_unix2.so 模組運用在 auth 中時,是用來檢查使用者所提供的帳號密碼是否正確 ; 運用在 account 中時,是檢查使用者所提供的密碼是否有效,或者需要再建立新的密碼 ; 運用在 password 中時,是把使用者所修改的密碼進行加密後寫入資料庫裡 ; 運用在 session 中時,則是告知 syslogd 將使用者的登入資訊紀錄下來。 接著來對以下幾個 PAM 認證模組做個測試練習:
|
範例二:/etc/pam.d/pop3
這是跟收信有關的認證模組所要讀取的模組設定檔。而我們這裡引用了 pam_listfile.so 模組,它可以用來載入其後所指定的檔案 /etc/poplist,以決定要允許或拒絕使用者存取 pop3 服務。另外 " onerr=succeed " 的意思是說,如果 /etc/poplist 檔案不存在,驗證模組就把它當作是成功的 ; 反過來說,如果希望 /etc/poplist 檔案不存在時,就當成驗證失敗來處理的話,那設定成 " onerr=fail " 即可。 再來是 " sense=deny ",其表示存在於 /etc/poplist 中的使用者是無法存取 pop3 服務的,至於其他使用者則是會被允許。一樣道理,如設定成 " sense=allow ",則只有 /etc/poplist 中的使用者可以存取 pop3 服務,其他人則會被拒絕。 假使現在希望拒絕使用者 barry 及 mary 使用 pop3 服務,那麼就到 /etc/poplist 內將做設定:
夠簡單吧 ! 如果都沒問題的話,再來看個類似設定的檔案 /etc/pam.d/vsftpd:
|
範例三:/etc/pam.d/sshd
第二行設定是說不允許 tina 及 david 從不含 " . " 的來源主機名稱或 192.168.2.x 的來源端存取 SSH 服務。 最後一行的設定是說除了 group01 及 group02 的群組成員外,禁止其他人從 192.168.1.222 的來源端存取 SSH 服務。 當您在作測試時,請先稿定名稱解析方面的問題,比如可以先至 /etc/hosts 內去把來源端的主機名稱及 IP 位址設定上去。 如果現在您只希望能讓某個特定的一般使用者能存取 SSH 服務,其他人全部拒絕 (包括 root 在內),可這麼設定:
|
範例四:/etc/pam.d/su
先看看 auth 第一筆的設定,在這裡因為引用了 pam_rootok.so 模組,所以當 root 執行 su 指令來變換成其他 user 的身分時,不需輸入密碼即可轉換成功。 不過您有沒有注意到第一筆是採用 sufficient 控制旗標,這就表示當 pam_rootok.so 傳回 success 時,就不再執行 auth 中其他堆疊模組的認證。現在如果把 sufficient 改成 required 又如何呢 ? 此時當然是會要求 root 輸入密碼囉。
|
PAM 認證模組就介紹到這裡了。不過憑良心說,您要是初次接觸 PAM 的話,會覺得好像不是那麼容易入門,但偏偏它對系統安全方面的管理又非常有幫助,因此多花點時間在這上頭學習是有其必要的。