摘要
Linux-PAM是一組共享庫,使用這些模塊,系統管理者可以自由選擇應用程序使用的驗證機制。也就是說,勿需重新編譯應用程序就可以切換應用程序使用的驗證機制。甚至,不必觸動應用程序就可以完全升級系統使用的驗證機制。(2002-07-09 13:08:42)
--------------------------------------------------------------------------------
By 書生, 出處:Morgan, Andrew G.
1.簡介
Linux-PAM(Pluggable Authentication Modules for Linux.基于Linux的插入式驗證模塊)是一組共享庫,使用這些模塊,系統管理者可以自由選擇應用程序使用的驗證機制。也就是說,勿需重新編譯應用程序就可以切換應用程序使用的驗證機制。甚至,不必觸動應用程序就可以完全升級系統使用的驗證機制。
在歷史上,需要對用戶進行驗證的應用程序,必須同某種驗證機制編譯到一起。例如,傳統的UN*X系統是使用密碼對用戶進行校驗的。用戶輸入的密碼經過crypt加密后,然后和/etc/passwd文件中的密文進行比較。在這種系統中,如果優先權的識別不是基于這種方式,就需要通過用戶識別符和用戶組識別符對優先權進行驗證。服務和應用程序可以使用基于用戶和用戶組識別的驗證方式。通常,用戶組的分配是通過/etc/group文件。
不幸的是,隨著計算機速度的加快和網絡的大范圍普及,使用這種驗證方式越來越不安全了。因此,人們開發了許多新的驗證方法。
Linux-PAM工程的目的就是分離應用軟件和驗證機制的開發。通過驗證函數庫可以實現上述目的。PAM庫由本地的系統配置文件/etc/pam.conf或者/etc/pam.d/目錄下的一些配置文件來設置。而模塊以動態可加載目標文件(使用dloptn(3)函數打開)的形式保存在/usr/lib/security目錄中。
2.關于本文的一些說明
在開始閱讀本文時,你應該清楚本文假定特定的文件是在特定的目錄中。我們遵照RFC-86的約定。有些Linux發布把這些文件放在不同的位置,因此如果你的系統是象RedHat之類的發布,那么你應該謹慎使用本文提供的例子。
例如,本文假設PAM可加載目標文件(模塊)是在/usr/lib/security/目錄下,而在RedHat Linux系統中它們被放在了/lib/security目錄下。因此,使用本文的例子時應該注意進行必要的轉換。
3.綜述
我們從一個例子開始討論。首先找一個能夠為用戶提供服務的應用程序,login就是一個這樣的程序。login要做兩件事,首先查詢用戶,然后為用戶提供所需服務,例如提供一個shell程序。
通常,login會提示用戶輸入密碼。然后對密碼進行校驗,這項任務就是Linux-PAM完成的。
從程序員的角度看,Linux-PAM的任務就是校驗用戶的合法性。
Linux-PAM具有很大的靈活性,系統管理者可以通過它自由選擇使用的驗證方式。你也可以自由選擇應用程序使用的驗證方式。Linux-PAM能夠提供的驗證方式多種多樣,從絕對信任(pam_permit)到視網膜掃描、音頻分析以及一次性口令,不一而足。
為了描述Linux-PAM的靈活性,我們可以假想一種情況:一個系統管理者(父母)希望提高用戶(他們的子女)的數學能力。他/她就可以通過一個孩子們非常喜歡的游戲“Shoot @#em up game”達成上述目的,當然前提是這個游戲能夠使用PAM提供的驗證機制。驗證可以設置:每次孩子們要玩游戲時,都需要回答出一組小于12的隨機數的乘積。這樣孩子們每次玩游戲之前都可以練習乘法運算。隨著他們的成長,可以增加數字的大小。
Linux-PAM處理四種類型的任務:驗證管理(auth)、帳戶管理(account)、會話管理(session)和口令管理(password)。應用程序使用的管理方式通過相關的Linux-PAM配置文件設置。管理功能是有配置文件指定的模塊完成的。
應用程序X,它通過一些接口調用Linux-PAM庫,而自己并不知道使用的驗證方法。Linux-PAM庫讀出PAM配置文件的內容,根據配置文件加載程序X需要的模塊。這些模塊進入某個管理組并且按照配置文件設置的順序層疊在一起。它們為應用程序執行各種驗證任務。應用程序和用戶之間通過conversation函數實現信息交換。
3.1 入門
下面是Seth Chaiklin說的一段話:
從這一點來看,PAM應該工作在理想世界中,在這里所有的應用程序都沒有錯誤。然而,事實遠非如此。因此,如果你要使用PAM,需要考慮一些實際的問題。
如果你把Linux用作一個單用戶系統,或者系統中的用戶是相互信任的,那使用PAM沒有多大意思。
你可以在沒有重要東西的系統上取消PAM,這實際上可以帶來一些方便。使系統象Win95。
在網絡環境下,就需要考慮用戶驗證的問題了。
如果你使用Linux作為一個服務器,用它來提供一些不同的服務,這時PAM就體現了它的價值。一般情況下,通過使用不同的模塊,程序可以搜索各種密碼數據庫,而程序本身勿需改寫。下面是一些例子:
apache有一個模塊能夠提供PAM服務。因此,對于特定目錄的驗證可以通過PAM完成,這意味著大量現有的PAM模塊可以用來進行驗證工作,包括RADIUS、NIS、NCP。
pppd有一個使用PAM驗證的版本(來自RedHat)。
我可以把PAM由于任何需要驗證的程序嗎?
可以說能也可以說不能。能,是指如果你能夠修改源代碼,就可以加入PAM驗證功能;不能是指如果你無法修改源代碼,那么在二進制可執行文件匯中是無法加入PAM驗證功能的。
我怎樣才能區分程序是否使用了PAM驗證?
使用ldd命令,如果這個程序的使用的動態連接庫沒有libpam和libpam_misc,那它肯定不使用PAM驗證。然而,還有可能已經包含這兩個庫了,但是因為某些問題,程序無法正常工作。因此需要更好的方法來測試。
對于需要使用PAM的程序,需要在/etc/pam.d目錄中為其設置配置文件。配置文件的名字被編寫進程序源代碼中,通常和程序的名字是一樣的,但不總是這樣。例如:有個程序叫作pamprog,它的PAM配置文件是/etc/pam.d/pamprog。在配置文件中,只有下面兩行: auth required pam_permit.so
auth required pam_warn.so
現在對其進行測試。第一行,表示所有的用戶都允許通過;第二行表示想syslog中寫入一條警告信息。如果測試成功,就表示程序能夠使用PAM進行驗證。然后你可以在配置文件中加入更為復雜的驗證功能。
4.Linux-PAM配置文件
Linux-PAM的目標就是為系統管理者提供最大限度的靈活性。系統管理者可以通過兩種形式對Linux-PAM進行配置:單一配置文件/etc/pam.conf;或者是/etc/pam.d/目錄。這一節我們將討論其配置文件的語法。
4.1 配置文件的語法
讀者首先應該明白Linux-PAM的記號是大小寫敏感的。有兩個特殊的符號:#和。配置文件中的注釋以#開頭,一般配置文件中每行是一個入口(除了注釋),但是如果某個入口的定義很長,可以通過使用轉義符回行,而下一行也被看作是這個入口的一部分。
一般/etc/pam.conf文件每行都是這種格式:
??service-name module-type control-flag module-path arguments
下面我們將對每個記號進行解釋。除了這種方式之外,還可以使用/etc/pam.d/目錄對Linux-PAM進行配置,稍后我們將對這種方式進行講述。
service-name
為這個入口分配的服務名。通常這是給定應用程序的會話名。例如:ftpd、rlogind、su等等。
Linux-PAM還為默認的驗證機制保留一個特殊的服務名,就是OTHER,大小寫均可。注意,如果某個模塊指定了以命名的服務,那OTHER就被忽略。
modle-type
Linux-PAM當前有四種類型的模塊:
auth
這種類型的模塊為用戶驗證提供兩方面的服務。
讓應用程序提示用戶輸入密碼或者其它的標記,確認用戶的合法性;
通過它的憑證許可權限,設定組成員關系(不同于上面討論的/etc/groups文件)或者其它優先權。
account
這類模塊執行基于非驗證的帳戶管理。它主要用來限制/允許用戶對某個服務的訪問時間,當前有效的系統資源(最多可以有多少個用戶),限制用戶的位置(例如:root用戶只能從控制臺登錄)。
session
這類模塊的主要用途是處理為用戶提供服務之前/后需要做的一些事情,包括:記錄打開/關閉交換數據的信息,監視目錄等。
password
用來升級用戶驗證標記。
control-flag
控制標志用來設置驗證成功或者失敗后PAM需要作出的反應。因為模塊可以層疊(stacked,同樣類型的模塊依次執行),控制標志可以決定每個模塊的重要性。應用程序不會意識到單個模塊成功或者失敗,它只會收到Linux-PAM庫成功或者失敗的綜合反應信息。層疊模塊的執行順序取決于/etc/pam.conf文件的入口順序,入口列前的模塊先執行。從Linux-PAM 6.0開始可以使用兩種語法定義控制標志。
簡單的一種是使用單一關鍵詞定義控制標志。有四個這樣的關鍵詞:required、requisite、sufficient和optional。
Linux-PAM通過如下方式解釋這些關鍵詞:
required
表示即使某個模塊對用戶的驗證失敗,也要等所有的模塊都執行完畢之后,PAM才返回錯誤信息。這樣做是為了不讓用戶知道被哪個模塊拒絕。如果對用戶驗證成功,所有的模塊都會返回成功信息。
requisite
如果特定的模塊對用戶的驗證失敗,PAM馬上返回一個錯誤信息,把控制權交回應用程序,不再執行其它模塊進行驗證。
sufficient
表示如果一個用戶通過這個模塊的驗證,PAM結構就立刻返回驗證成功信息,把控制權交會應用程序。后面的層疊模塊即使使用requisite或者required控制標志,也不再執行。如果驗證失敗sufficient的作用和optional相同。
optional
表示即使本行指定的模塊驗證失敗,也允許用戶享受應用程序提供的服務。使用這個標志,PAM框架會忽略這這個模塊產生的驗證錯誤,繼續順序執行下一個層疊模塊。
還有一種比較復雜的語法來設置控制標志,它由一組value=action形式的標記組成,標記之間以空格分開:
[value1=action1 value2=action2 ...]
valueN可以是下列Linux-PAM庫的返回值:success、open_err、symbol_err、service_err、system_err、buf_err、perm_denied、auth_err、cred_insufficient、authinfo_unavail、user_unknown、maxtries、new_authtok_reqd、acct_expired、session_err、cred_unavail、cred_expired、cred_err、no_module_data、conv_err、authtok_err、authtok_recover_err、authtok_lock_busy、authtok_disable_aging、try_again、ignore、abort、authtok_expired、module_unknown、bad_item和default。最后一個(default)能夠用來設置上面的返回值無法表達的行為。
actionN可以是一個非負整數或者是下面的記號之一:ignore、ok、done、bad、die和reset。如果是非負整數J,就表示需要忽略后面J個同樣類型的模塊。通過這種方式,系統管理者可以更加靈活地設置層疊模塊,模塊的層疊路徑由單個模塊的反應決定。
ignore
如果使用層疊模塊,那么這個模塊的返回值將被忽略,不會被應用程序知道。
bad
它表示這個返回碼應該被看作是模塊驗證失敗。如果這個模塊是層疊模塊的第一個驗證失敗的模塊,那么它的狀態值就是整個層疊模塊的狀態值。
die
終止層疊模塊驗證過程,立刻返回到應用程序。
ok
告訴PAM這個模塊的返回值直接作為所有層疊模塊的返回值。也就是說,如果這個模塊前面的模塊返回狀態是PAM_SUCCESS,那這個返回值就會覆蓋前面的返回狀態。注意:如果前面的模塊的返回狀態表示模塊驗證失敗,那么不能使用這個返回值覆蓋。
done
終止后續層疊模塊的驗證,把控制權立刻交回應用程序。
reset
清除所有層疊模塊的返回狀態,從下一個層疊模塊重新開始。
module-path
PAM驗證模塊的路徑。如果以/開頭,就表示是完整的路徑;如果不是以/打頭,就表示是相對于/usr/lib/security的相對路徑。
args
傳遞給模塊的參數。類似于通常的Linux Shell命令行參數。有效的參數包括一些通用參數和特定于給定模塊的參數。無效的參數將被忽略,并會把錯誤信息記錄到syslog。
注意:配置文件中的任何一行錯誤都會導致驗證失敗,同時相關錯誤信息被記錄到syslog。
4.2 基于目錄的配置形式
從Linux-PAM 5.6版開始引入了一種基于目錄的配置方式,通過/etc/pam.d/目錄下的文件對PAM進行配置。這種方式比單一的配置文件具有更大的靈活性。這個目錄下的所有配置文件都以某個服務名命名(小寫)。
不過,這兩種配置方式不能同時起作用,也就是說,你只能使用其中一種對Linux-PAM進行配置。一般/etc/pam.d/優先。
/etc/pam.d/目錄下的配置文件的語法和/etc/pam.conf文件的語法相似,形式如下:
??module-type control-flag module-path arguments
和/etc/pam.conf文件語法的唯一不同就是沒有服務名(service-name),服務名由文件名設置。例如:/etc/pam.d/login文件保存對login服務的設置。
這種配置方式與單一配置文件相比,具有很大的優越性:
減少了配置錯誤的幾率。
更易于維護。
可以通過使用不同配置文件的符號連接決定系統的驗證策略。
可以加快對于配置文件的解析。
可以對單個的Linux-PAM配置文件設置不同的存取權限。
更易于軟件包的管理。
4.3 通用參數
下面是一些通用參數,可以被所有的模塊解析:
debug
通過syslog系統調用記錄調試信息。
nowarn
使模塊不要向應用程序輸出警告信息。
use_first_pass
使模塊不提示用戶輸入密碼,而是使用為前一個驗證模塊輸入的密碼。如果無效,則驗證失敗。這個參數只能用于auth和password類型模塊。
try_first_pass
首先使用用戶為上一個模塊輸入的密碼進行驗證,如果不行,就提示用戶輸入密碼,這個參數只能用于auth類型的模塊。
use_mapped_pass
這個參數目前還不能被任何Linux-PAM模塊支持,主要因為美國加密算法的出口限制。
expost_account
通常,對于模塊來說泄露用戶的某些信息并非一個安全的策略。有時候用戶名、起始目錄或者用戶使用的shell等信息都可以被攻擊者用來攻擊一個用戶帳戶。這個參數是一個適用于每個模塊的標準參數,它可以使模塊盡量少地泄露用戶信息。
4.4 配置文件入口示例
在這一節,我們將給出一些例子,以便于理解。
4.4.1 默認策略
一個合理的OTHER入口對于加強系統安全非常重要。下面是一個非常偏執的例子。
??# 默認; 拒絕訪問
??#
??OTHER auth required /usr/lib/security/pam_deny.so
??OTHER account required /usr/lib/security/pam_deny.so
??OTHER password required /usr/lib/security/pam_deny.so
??OTHER session required /usr/lib/security/pam_deny.so
毫無疑問,這是最安全的OTHER策略了,但是不太合理。例如:如果這個文件的其它部分編寫不好,那么很容易把所有的用戶擋在門外。
pam_deny模塊在運行時不記錄任何信息,除非用戶在無法執行某個服務程序時能夠與系統管理人員聯系,否則系統管理者很長時間不會知道系統配置錯誤。
在上面例子的前面加入以下幾行,系統管理者就可以獲得有關的警告信息了:
??# 如果程序配置錯誤
??#
??OTHER auth required /usr/lib/security/pam_warn.so
??OTHER password required /usr/lib/security/pam_warn.so
這樣有兩行是auth模塊類型,形成模塊層疊。
在一個使用/etc/pam.d/配置的系統中,默認配置文件如下:
??# default configuration: /etc/pam.d/other
??#
??auth required /usr/lib/security/pam_warn.so
??auth required /usr/lib/security/pam_deny.so
??account required /usr/lib/security/pam_deny.so
??password required /usr/lib/security/pam_warn.so
??password required /usr/lib/security/pam_deny.so
??session required /usr/lib/security/pam_deny.so
對于不熟悉Linux-PAM的系統管理者,下列幾行可以作為最基本的系統配置:
??# default; standard UNIX access
??#
??OTHER auth required /usr/lib/security/pam_unix_auth.so
??OTHER account required /usr/lib/security/pam_unix_acct.so
??OTHER password required /usr/lib/security/pam_unix_passwd.so
??OTHER session required /usr/lib/security/pam_unix_session.so
通常這足以為大多數應用程序提供驗證服務了。但是,大多數并不表示全部。如果你需要打開FTP匿名登錄功能,就無法滿足要求了。
為了打開匿名FTP,需要使用以下的配置命令代替默認的配置(OTHER):
??# ftpd; add ftp-specifics. These lines enable anonymous ftp over
??# standard UNIX access (the listfile entry blocks access to
??# users listed in /etc/ftpusers)
??#
??ftpd auth sufficient /usr/lib/security/pam_ftp.so
??ftpd auth required /usr/lib/security/pam_unix_auth.so use_first_pass
??ftpd auth required /usr/lib/security/pam_listfile.so
??onerr=succeed item=user sense=deny file=/etc/ftpusers
由于需要忽略默認的配置入口,所以第二行是必須要有的。這還是一個層疊模塊的例子。使用sufficient控制標志,表示如果這個模塊驗證通過,就不必使用后面的層疊模塊進行驗證了;use_first_pass表示使用為前面的模塊(pam_ftp)輸入的密碼。
5.Linux-PAM的安全問題
這一章我們將討論如何安全使用Linux-PAM。
5.1 如果出現錯誤
如果發生錯誤,Linux-PAM可能會改變系統的安全性。這取決于你自己的選擇,你可以選擇不安全(開放系統)和絕對安全(拒絕任何訪問)。通常,Linux-PAM在發生錯誤時,傾向于后者。任何的配置錯誤都可能導致系統整個或者部分無法訪問。
能夠遇到最大的問題可能就是Linux-PAM的配置文件(/etc/pam.d/*或者/etc/pam.conf)被刪除了。如果發生這種事情,你的系統就會被鎖住。
不過,還是有辦法進行恢復的。最好的方法就是重新啟動系統進入單用戶模式,然后進行正確地設置。下面是David Wood在郵件中提出的解決步驟:
首先,以單用戶模式啟動系統,出現LILO boot:時輸入: LILO boot:linux single >——此處假設使用的內核標簽是linux,可以按TAB鍵列出可用的內核
這樣你不用登錄就可以進入系統了。
如果這個辦法不行,你還可以使用急救盤啟動系統。
假設你的PAM系統只是配置文件被破壞,先按照如下步驟進行處理: cd /etc
mv pam.conf pam.conf.orig
mv pam.d pam.d.orig
mkdir pam.d
cd pam.d
接著,使用編輯程序編輯/etc/pam.d/other文件,它應該包括以下四行:
auth required pam_unix_auth.so
account required pam_unix_acct.so
password required pam_unix_passwd.so
session required pam_unix_session.so
然后,你就可以登錄了。如果還是不行,那有可能是因為輸入錯誤或者更嚴重的問題。如果是輸入錯誤,會在日志文件中留下記錄,可以使用tail /var/log/messages查看。
現在,你已經重新登錄到系統了。下面的工作就是重新安裝Linux-PAM和其它軟件(假設是RedHat系統),使用如下命令重新安裝PAM軟件包: rpm -Uvh --force pam-*
然后,需要安裝(重新安裝)libc庫、util-linux、wuftp、NetKit等受影響的軟件包。如果使用X系統,也需要重新安裝。
5.2 不要使用脆弱的other文件
如果系統默認配置文件other的配置比較脆弱,系統很可能受到攻擊的威脅。
這是一個示例配置,pam_deny模塊將拒絕所有的訪問,而pam_warn模塊將向auth.notice日志設備發送一條警告信息:
??# The PAM configuration file for the `other@# service
??#
??auth required pam_deny.so
??auth required pam_warn.so
??account required pam_deny.so
??account required pam_warn.so
??password required pam_deny.so
??password required pam_warn.so
??session required pam_deny.so
??session required pam_warn.so
6.模塊使用參考
這一章我們將一塊介紹Linux-PAM模塊的用法
6.1 access模塊
6.1.1 概要
模塊名
pam_access
作者
Alexei Nogin
維護者
作者
提供的管理組功能
account
系統依賴性
需要一個配置文件。默認情況下,使用/etc/security/access.conf作為配置文件,也可以指定別的文件。
網絡支持
通過PAM_TTY變量獲得終端名,如果這個變量沒有設置,就通過ttyname()函數獲得標準輸入文件描述符的終端名。還可以使用gethostname(),yp_get_default_domain(), gethostbyname()函數獲得主機名、域名等信息,作為每個配置行的第三項。
6.1.2 綜述
提供一種日志監控風格的登錄訪問控制機制
6.1.3 account組件
能夠識別的參數
accessfile=/path/to/file.conf
描述
這個模塊提供一種日志監控風格的登錄訪問控制機制,這種機制是基于登錄名、主機名、域名、internet地址、網絡地址或者終端名的。A. Nogin把logdaemon-5.6(作者:Wietse Venema@#s)中的login_access.c文件做了許多改動,用到了這個模塊中。
這個模塊的行為可以使用如下參數進行修正:
accessfile=/path/to/file.conf 使用別的配置文件代替默認的配置文件/etc/security/access.conf。
示例和建議
例如:在一個NIS服務器或者一個郵件服務器上,有很多用戶,但是你不想讓這些用戶具有登錄(login)能力。這時,建議你使用這個模塊。
如果你的模塊放在/lib/security目錄,而且使用/etc/pam.d/風格的配置,可以在/etc/pam.d/login、/etc/pam.d/rlogin、/etc/pam.d/rsh和/etc/pam.d/ftp文件中加入下面一行,來啟動這個模塊:
account required /lib/security/pam_access.so
注意:除非你的系統可以忽略.rhosts文件的作用,否則這個模塊無法發揮作用。其中細節請參考對pam_rhost_auth模塊的介紹。
此外,在軟件的發布中有一個示例access.conf配置文件。
6.2 chroot模塊
6.2.1 概要
模塊名
pam_chrooot
作者
Bruce Campbell
維護者
作者
提供的管理組功能
account、session、authentication
網絡支持
本地主機
6.2.2 綜述
這個模塊為普通用戶提供一個假的文件系統,例如:在他們看來的/目錄實際上是/some/where/else。
如果系統中有幾類用戶,而你對安全問題又十分重視,就可以使用這個模塊。它可以對用戶能夠看到的系統信息和能夠運行的程序進行限制。
6.2.3 account組件
原著尚未完成
6.2.4 session組件
同上
能夠識別的參數
可以使用PAM的通用參數和日志級別作為其參數。
示例和建議
提供合理的程序,例如只提供cat、ls、rm、cp和ed等。
不要濫用這個模塊,例如:你可以為每個用戶安裝一個隔離的環境,但是這樣非常浪費磁盤空間。
6.3 密碼強度檢查模塊
6.3.1 概要
模塊名
pam_cracklib
作者
Cristian Gafton
維護者
作者
提供的管理組功能
password
系統依賴性
需要libcrack庫和字典/usr/lib/cracklib.dict。
6.3.2 綜述
這個模塊可以插入到實現password管理組功能的層疊模塊中,為給定的程序提供密碼強度檢查。
這個模塊以如下方式工作:首先調用cracklib例程檢查密碼強度,如果密碼不易破譯,就進行下面的強度檢查:
新密碼是否舊密碼的回文。
新密碼是否只是就密碼改變了大小寫
和舊密碼是否相似。主要由difok參數控制,如果新舊密碼之間不同的字符數目大于或等于這個參數就接受新的密碼,這個參數的默認值是10或者新密碼的1/2。為了避免對一個很長、很復雜的密碼進行查詢,還可以使用difignore參數。這個參數可以指定一個值,如果新的密碼長度超過這個值,就不必進行這種檢查,默認值是23。
是否新密碼太短。由5個參數控制:minlen、dcredit、ucredit、lcredit和ocredit。在此就不一一介紹了。
新密碼是否是舊密碼的回環
這個密碼以前是否用過。過去用過的密碼可以在/etc/security/opasswd文件中找到。
對于標準的UNIX密碼加密算法,即使沒有參數,這個模塊也會工作得很好。但是,對于MD5加密算法,密碼可以超過8個字符,使用默認的設置將使用戶很難找到滿意的密碼。MD5算法的默認設置要求新密碼中和舊密碼相同的字符不能超過1/2,而且是強制的。例如:舊的密碼是"the quick brown fox jumped over the lazy dog",那這個密碼是很難被替換的:)。除此之外,MD5算法的默認設置還允許密碼長度小于5個字符。因此,對于MD5系統需要對配置做一些調整,提高字符數的底限,減小對不同字符的比例限制。
6.3.3 password組件
能夠識別的參數
debug、type=XXX、retry=N、difok=N、minlen=N、dcredit=N、ucredit=N、lcredit=N、ocredit=N、use_authtok
描述
這個模塊提示用戶輸入一個密碼,然后根據一個系統字典和一組規則檢查它的強度。
默認情況下,它首先提示用戶輸入一個密碼,如果認為強度足夠,就提示用戶重新輸入一遍,以保證密碼輸入正確。完成這些動作后,就把這個密碼產地給subsequent模塊,由subsequent模塊安裝新的驗證記號(也就是密碼)。
這個模塊的動作可以通過一些參數改變:
debug
把模塊詳細的行為信息寫到syslog,但不包括密碼信息。
type=xxx
修改提示信息。默認的提示信息是:"New UNIX password:"和"Retype UNIX password"。設置這個選項可以使xxx代替UNIX。
retry=N
改變輸入密碼的次數,默認值是1。就是說,如果用戶輸入的密碼強度不夠就退出??梢允褂眠@個選項設置輸入的次數,以免一切都從頭再來。
difok=N
默認值為10。這個參數設置允許的新、舊密碼相同字符的個數。不過,如果新密碼中1/2的字符和舊密碼不同,則新密碼被接受。
minlen=N
密碼字符個數下限加一。除了限制新密碼字符的個數之外,還有一些參數可以限制每種字符(other、upper、lower和digit)的個數。minlen的默認值是9,這個值對于舊風格的UNIX密碼是非常合適的,但是對于MD5系統卻并不是很安全。
ucredit=N
限制新密碼中最多有多少個大寫字符。
lcredit=N
限制新密碼中最多有多少個小寫字符。
ocredit=N
限制新密碼中最多有多少個其它的字符。
use_authok
不讓模塊執行提示用戶輸入密碼的動作,使用前面層疊的password模塊提供的密碼。
示例和建議
下面我們舉一個例子,看一下這個模塊是如何與pam_pwdb的password組件實現層疊的:
# These lines stack two password type modules. In this example the
# user is given 3 opportunities to enter a strong password. The
# "use_authtok" argument ensures that the pam_pwdb module does not
# prompt for a password, but instead uses the one provided by
# pam_cracklib.
#
passwd password required pam_cracklib.so retry=3
passwd password required pam_pwdb.so use_authtok
下面是一個使用MD5加密算法的例子:
#
# These lines allow a md5 systems to support passwords of at least 14
# bytes with extra credit of 2 for digits and 2 for others the new
# password must have at least three bytes that are not present in the
# old password
#
password required pam_cracklib.so
difok=3 minlen=15 dcredit= 2 ocredit=2
password required pam_pwdb.so use_authtok nullok md5
6.4 拒絕模塊
6.4.1 概要
模塊名
pam_deny
作者
Andrew G. Morgan
維護者
當前Linux-PAM的維護者。
提供的管理組功能
account、authentication、password、session
clean code base
clean
6.4.2 綜述
這個模塊能夠用來拒絕任何訪問。它是向應用程序反饋驗證失敗的信息。這個模塊比較適合于other文件。
6.4.3 帳戶組件
描述
這個組件只是返回一個失敗信息。失敗的類型是PAM_ACCT_EXPIRED。
示例和建議
應用程序是通過引用Linux-PAM的帳戶管理函數pam_acct_mgmt(),讓用戶獲得系統的訪問權。但是,如果把這個模塊和account類型的模塊層疊,用戶將不能通過應用程序獲得系統訪問權。
下面的配置行將使任何用戶都無法登錄:
# add this line to your other login entries to disable all accounts
#
login account required pam_deny.so
6.4.4 驗證組件
描述
這個組件只是返回失敗信息,錯誤類型取決于應用程序調用的函數。如果應用程序試圖調用pam_authenticate()函數驗證用戶,則失敗類型是PAM_AUTH_ERR;如果應用程序調用pam_setcred()函數,以建立和設置用戶的驗證憑證,則失敗類型是PAM_CRED_UNAVAIL。
示例和建議
如果想使應用程序拒絕為用戶提供服務,可以在配置文件中加入以下配置行:
# add this line to your existing OTHER entries to prevent
# authentication succeeding with default applications.
#
OTHER auth required pam_deny.so
6.4.5 密碼組件
描述
這個組件能夠拒絕用戶修改密碼。如果收到修改密碼的企圖,它將返回PAM_AUTHOK_ERR類型的失敗信息。
示例和建議
這個組件用于阻止應用程序改變用戶的密碼。例如,為了阻止login在舊密碼失效時,自動提示用戶輸入新的密碼,你可以在配置文件中加入以下配置行:
# add this line to your other login entries to prevent the login
# application from being able to change the user@#s password.
#
login password required pam_deny.so
6.4.6 會話組件
描述
deny模塊的這個組件能夠阻止應用程序在主機上啟動會話過程。
示例和建議
這個模塊能夠阻止用戶啟動一個shell。如果和pam_motd模塊層疊,我們可以在配置文件中加入以下配置行,告訴用戶現在是系統維護時間:
# An example to see how to configure login to refuse the user a
# session (politely)
#
login session required pam_motd.so
file=/etc/system_time
login session required pam_deny.so
6.5 環境變量設置/取消模塊
6.5.1 概要
模塊名
pam_env
作者
Dave Kinchlea
維護者
作者
提供的管理組類型
authentication(setcred)
系統依賴性
/etc/security/pam_env.conf
6.5.2 綜述
使用這個模塊可以設置/取消環境變量的定義。
6.5.3 驗證組件
能夠識別的參數
debug、conffile=configuration-file-name、envfile=/env-file-name、readenv=/0|1
描述
你可以使用固定的字符串通過這個模塊設置變量或者取消對環境變量的設置。設置的環境變量值和PAM_ITEM是與或者或的關系。
這些由一個配置文件控制,默認情況下,配置文件是/etc/security/pam_env.conf。不過,可以通過connfile文件指定其它的配置文件。配置文件的每個配置行都是以環境變量名開頭,接著是兩個選項:DEFAULT、OVERRIDE。DEFAULT表示:把這個變量設置為默認值,如果不存在就把它的值設置為一個空字符串。OVERRIDE表示:使用新的值得覆蓋默認值。如果OVERRIDE之后,沒有定義變量值,就假定是空字符串,而且不會執行覆蓋動作。
VARIABLE [DEFAULT=[value]] [OVERRIDE=[value]]
環境變量可以以$(string)的語法使用,而PAM_ITEM可以通過@(string)的語法使用。如果string中含有$、@字符,需要在前面加上反斜杠作為轉義符,例如:$。當需要空格時,可以使用引號,但是空格不能環境變量的名字中出現。環境變量的值必須以引號分割。
這個模塊也能夠以KEY=VAL對的方式解析文件,每個KEY=VAL對占一行,默認文件是/etc/environment。你可以使用envfile選項改變需要解析的文件,使用readenv選項打開/關閉解析的文件。
這個模塊的行為可以修改以下參數來設置:
debug
向syslog寫入更多信息。
confile=filename
默認配置文件是/ec/security/pam_env.conf。這個選項指定的文件可以覆蓋默認文件。不過,你必須使用完整的文件路徑。
envfile=filename
默認是/etc/environment,使用這個選項指定其它的文件。也需要使用完整的文件路徑。
readenv=0|1
打開(1)/關閉(0)從envfile中讀取環境變量。默認情況下,這個選項為開(1)。
示例和建議
參考/etc/security/pam_env.conf文件。
6.6 過濾模塊
6.6.1 概要
模塊名
pam_filter
作者
Andrew G. Morgan
維護者
作者
提供的管理組功能
account、authentication、password、session
Clean code base
This module compiles cleanly on Linux based systems.
系統依賴性
需要安裝pam_filter程序。
6.6.2 綜述
這個模塊為應用程序提供了一個插入式的過濾器。由于為某個程序重新編寫過濾代碼實現過濾功能是不太現實的,簡直是開玩笑。這個模塊能夠對輸入流中的大小寫字符進行替換,然后輸出到輸出流。
6.6.3 Account+Authentication+Password+Session組件
能夠識別的參數
debug、new_term、non_term、runX
描述
這個模塊的所有組件都可能會執行所需要的過濾程序。過濾程序是以調用的程序的權限運行的,而不是以用戶的權限運行。因此,普通用戶只能關閉他們的會話過程才能殺死過濾進程。
pam_filter模塊的行為可以由Linux-PAM配置文件傳遞的參數改變:
debug
模塊運行時,syslog記錄更多的信息。
new_term
作為一種默認的行為,過濾器會設置PAM_TTY選項,指示用戶與應用程序進行聯系的終端。這個參數表示過濾程序應該把PAM_TTY設置為被過濾的偽終端。
no_term
不必設置PAM_TTY選項。
runX
為了使這個模塊能夠執行一個過濾程序,應該讓它知道何時執行??梢允褂眠@個參數實現上述目的。這個參數緊跟過濾程序的路徑名以及其命令行參數。
X的值可以是1和2。它表示過濾程序運行的確切時間。對于每種管理組功能,它會牽扯到不同的函數調用。
在authentication和session組件中,分別牽扯到兩個函數。對于authentication管理組,這兩個函數是_authenticate和_setcred。run1表示從_authenticate函數運行過濾程序;run2表示從_setcred函數運行過濾程序。對于session管理組,run1表示過濾程序從_open_session函數運行;run2是從_close_session函數運行。
對于account組件,run1和run2是一樣的。
對于password管理組組件,run1表示過濾程序在_chauthtok函數首次運行時(PAM_PRELIM_CHECK階段)執行;而run2表示過濾程序是在_chauthtok第二次運行時(PAM_UPDATE_AUTHOK階段)執行。
示例和建議
你可以在login的配置文件(/etc/pam.d/login)中加入下面入口,實際嘗試一下這個模塊的應用:
# An example to see how to configure login to transpose upper and
# lower case letters once the user has logged in(!)
#
login session required pam_filter.so
run1 /usr/sbin/pam_filter/upperLOWER
6.7 匿名訪問模塊
6.7.1 概要
模塊名
pam_ftp
作者
Andrew G. Morgan
維護者
作者
提供的管理組功能
authentication
網絡支持
提示用戶輸入email地址
6.7.2 綜述
這個模塊的用途是提供一種插入式的匿名FTP訪問模式。
6.7.3 authentication組件
能夠識別的參數
debug、users=xxx,yyy,....、ignore
描述
這個模塊解釋用戶名和密碼,如果用戶名是ftp或者anonymous,而用戶的密碼是以@分割的,它就會把@前后兩部分分別設置為PAM_RUSER和PAM_RHOST選項的值。用戶名被設置為ftp。模塊驗證成功。在其它情況下,這個模塊就會通過PAM_AUTHTOK選項返回需要輸入密碼和驗證失敗的信息。
這個模塊的行為可以使用如下參數修改:
debug
向syslog輸出調試信息
users=xxx,yyy,....
使用等號之后給出的用戶名代替ftp或者anonymous,作為匿名FTP的用戶名。
ignore
不理會用戶沒有email地址。
示例和建議
在第四章中,有一個使用匿名FTP模塊的例子。
6.8 組訪問模塊
6.8.1 概要
模塊名
pam_group
作者
Andrew G. Morgan
維護者
作者
提供的管理組功能
suthentication
系統依賴性
需要/etc/security/group.conf文件??梢耘clibpwdb連接。
網絡支持
只能通過正確設置PAM_TTY選項。
6.8.2 綜述
這個模塊根據用戶名和發起服務請求的終端,提供組分類功能。
6.8.3 authentication組件
描述
這個模塊不對用戶進行驗證,而是為用戶賦予組成員關系。這種組成員關系是根據用戶請求的服務劃分的,在/etc/security/group.conf文件中以文本的方式設置。
示例和建議
想要這個模塊正常工作,需要準確設置/etc/security/group.conf文件。其格式如下:
services; ttys; users; times; groups
前四項和pam_time配置文件:/etc/security/pam_time.conf或者time.conf中的相同。groups是一些以逗號或者空格分開的文本字符串,表示一些組名。如果用戶的應用程序滿足前四項,則用戶就被加入到第五項定義的組中。
這個模塊能否起作用取決于用戶對文件系統的訪問權限。這一點是指,一旦用戶成為一個組的成員,這個用戶就可能利用獲得的權限試圖建立一個setgid程序。而以后,如果這個用戶不再屬于這個組,他就可以通過這個程序非法回到這個組中。由于這個原因,用戶具有寫權限的文件系統需要非常嚴格的限制,如果文件系統在mount時,被設置為nosuid,那用戶就無法建立和執行這樣的程序。因此,使用這個模塊時,用戶具有寫權限的所有文件系統都需要使用nosuid參數mount。
pam_group的作用和/etc/group文件是并行的,如果用戶被加入的這個模塊定義的任何組中,同時也被加入到/etc/group文件中;反之亦然。
6.9 issue模塊
6.9.1 概要
模塊名
pam_issue
作者
Ben Collins
維護者
作者
提供的管理組功能
authentication(pam_sm_authenticate)
6.9.2 綜述
這個模塊能夠在提示信息中,加入一個文件的內容。
6.9.3 authentication組件
能夠識別的參數
issue=issue-file-name、noesc
描述
你可以使用這個模塊在用戶提示信息中加入一個issue文件的內容。這個模塊還可以解析issue文件中的轉義詞,例如:x。
有效的轉義碼如下:
d: 當前的日期
s: 操作系統名
l: 這個終端名
m: 系統的體系(i686、spacr、pwerpc、....)
n: 系統主機名
o: 系統域名
r: 操作系統版本號
t: 當前時間
u: 當前登錄的用戶數
U: 和u相同,只有后綴有所不同:u的后綴是user;U的后綴是users。
v: 操作系統的版本/建立日期
這個模塊的行為可以通過一下參數修改:
issue: 指定使用的文件
noesc: 關閉對轉義詞的解析
示例和建議
login auth pam_issue.so issue=/etc/issue
(作者:書生)