By 書生, 出處:Morgan, Andrew G.
1.簡介
Linux-PAM(Pluggable Authentication Modules for Linux.基於Linux的插入式驗證模塊)是一組共享庫,使用這些模塊,系統管理者能夠自由選擇應用程序使用的驗證機制。也就是說,勿需從新編譯應用 程序就能夠切換應用程序使用的驗證機制。甚至,沒必要觸動應用程序就能夠徹底升級系統使用的驗證機制。
在歷史上,須要對用戶進行驗證的應用程序,必須同某種驗證機制編譯到一塊兒。例如,傳統的UN*X系統是使用密碼對用戶進行校驗的。用戶輸入的密碼通過crypt加密後,而後和/etc /passwd文件中的密文進行比較。在這種系統中,若是優先權的識別不是基於這種方式,就須要經過用戶識別符和用戶組識別符對優先權進行驗證。服務和應 用程序可使用基於用戶和用戶組識別的驗證方式。一般,用戶組的分配是經過/etc/group文件。
不幸的是,隨着計算機速度的加快和網絡的大範圍普及,使用這種驗證方式愈來愈不安全了。所以,人們開發了許多新的驗證方法。 linux
在廣大開發人員的努力下,各版本的 UNIX 系統陸續提供對 PAM 的支持。其中,Linux-PAM 是專門爲 Linux 機器實現的,包括 Caldera 1.三、2.二、Debian 2.二、Turbo Linux 3.六、Red Hat 5.0 以及 SuSE 6.2 及它們的後續版本都提供對 PAM 的支持。FreeBSD 從 3.1 版開始支持 PAM。須要注意的是,除了具體實現不一樣外,各類版本 Unix 系統上的 PAM 的框架是相同的,因此咱們在這裏介紹的 Linux-PAM 框架知識具備廣泛性。所以在下文介紹其框架的過程當中能夠看到,咱們並無刻意區分 PAM 與 Linux-PAM 這兩個術語 git
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的記號是大小寫敏感的。有兩個特殊的符號:#和。配置文件中的註釋以#開頭,通常配置文件中每行是一個入口(除了註釋),可是若是某個入口的定義很長,能夠經過使用轉義符回行,而下一行也被看做是這個入口的一部分。 shell
下面是一個示例配置文件: 數據庫
通常/etc/pam.conf文件每行都是這種格式:
service-name module-type control-flag module-path arguments
下面咱們將對每一個記號進行解釋。除了這種方式以外,還可使用/etc/pam.d/目錄對Linux-PAM進行配置,稍後咱們將對這種方式進行講述。
爲這個入口分配的服務名。一般這是給定應用程序的會話名。例如:ftpd、rlogind、su等等。
Linux-PAM還爲默認的驗證機制保留一個特殊的服務名,就是OTHER,大小寫都可。注意,若是某個模塊指定了以命名的服務,那OTHER就被忽略。
Linux-PAM當前有四種類型的模塊,
auth表示鑑別類模塊;account表示賬戶類模塊;session表示會話類模塊;password表示口令類模塊。注意,每行只能指定一種類型模塊,若是程序須要多種模塊的話,可在多行中分別規定。
auth
這種類型的模塊爲用戶驗證提供兩方面的服務。
讓應用程序提示用戶輸入密碼或者其它的標記,確認用戶的合法性;
經過它的憑證許可權限,設定組成員關係(不一樣於上面討論的/etc/groups文件)或者其它優先權。 apache
account 安全
這類模塊執行基於非驗證的賬戶管理。它主要用來限制/容許用戶對某個服務的訪問時間,當前有效的系統資源(最多能夠有多少個用戶),限制用戶的位置(例如:root用戶只能從控制檯登陸)。
session
這類模塊的主要用途是處理爲用戶提供服務以前/後須要作的一些事情,包括:記錄打開/關閉交換數據的信息,監視目錄等。
password
用來升級用戶驗證標記。
規定如何處理模塊的成功和失敗狀況。
單個應用程序能夠調用多種底層模塊,這一般稱爲"堆疊",對應於某程序的按照配置文件中出現順序執行的全部模塊成爲"堆",堆中的各模塊的地位與出錯時的處理由control_flag欄的取值決定。層疊模塊的執行順序取決於/etc /pam.conf文件的入口順序,入口列前的模塊先執行。從Linux-PAM 6.0開始可使用兩種語法定義控制標誌。
簡單的一種是使用單一關鍵詞定義控制標誌。有四個可用的值:required、requisite、sufficient和optional。
Linux-PAM經過以下方式解釋這些關鍵詞:
required
只有當對應於應用程序的全部帶 required標記的模塊所有成功後,該程序才能經過鑑別。同時,若是任何帶required標記的模塊出現了錯誤,PAM並不馬上將錯誤消息返回給應用程序,而是在全部模塊都調用完畢後纔將錯誤消息返回調用它的程序。這樣作是爲了避免讓用戶知道被哪一個模塊拒絕。若是對用戶驗證成功,全部的模塊都會返回成功信息。
requisite
它與required相仿,只有帶此標記的模塊返回成功後,用戶才能經過鑑別,不一樣之處在於其一旦失敗就再也不執行堆中後面的其它模塊,而且鑑別過程到此結束。
sufficient
表示若是一個用戶經過這個模塊的驗證,PAM結構就馬上返回驗證成功信息,把控制權交會應用程序。後面的層疊模塊即便使用requisite或者required控制標誌,也再也不執行。若是驗證失敗sufficient的做用和optional相同。
optional
表示即便本行指定的模塊驗證失敗,也容許用戶享受應用程序提供的服務。在PAM體系中,帶有該標記的模塊失敗後將繼續處理下一模塊。
服務器
sufficient
網絡
表示該模塊取得成功是用戶經過鑑別的充分條件,也就是說只要標記爲sufficient的模塊一旦成功,那麼PAM便當即嚮應用程序返回成功而沒必要嘗試任何其餘模塊。當標記爲sufficient的模塊失敗時,sufficient模塊當作 optional對待。
PAM驗證模塊的路徑。若是以/開頭,就表示是完整的路徑;若是不是以/打頭,就表示是相對於/usr/lib/security的相對路徑。
傳遞給模塊的參數。相似於一般的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文件。能夠與libpwdb鏈接。 網絡支持 只能經過正確設置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: 系統的體系(i68六、spacr、pwerpc、....) n: 系統主機名 o: 系統域名 r: 操做系統版本號 t: 當前時間 u: 當前登陸的用戶數 U: 和u相同,只有後綴有所不一樣:u的後綴是user;U的後綴是users。 v: 操做系統的版本/創建日期 這個模塊的行爲能夠經過一下參數修改: issue: 指定使用的文件 noesc: 關閉對轉義詞的解析 示例和建議 login auth pam_issue.so issue=/etc/issue