PAM
1. 介紹
PAM全稱是可插拔身份認證子產品(Pluggable Authentication Modules);
Linux-PAM (Linux下的可插入式認證模組) 是一套共享函數庫,允許系統管理者來決定應用程式如何識别使用者.
換句話說,就是用不着(重寫和)重新編譯一個(支援PAM的)程式,就可以切換它所用的認證機制. 你可以整個的更新你的證系統而不用去管應用程式本身.
Linux-PAM 給系統管理者提供了相當大的彈性來設定系統裡程式的權限賦予. 由PAM控制的系統安全的本地配置可以包含
在以下兩個地方: 或者是一個單一的系統檔案: /etc/pam.conf; 或者是/etc/pam.d/ 目錄下的檔案.
2、配置檔案的内容(截選一行如下):
account required pam_nologin.so
認證 控制方式 調用的子產品
第一列是認證類型,可用的選項有:
accout: 執行基于使用者管理的非認證行為操作。典型的,它可以限制使用者的登陸時間、可用的系統資源。
auth: 這個子產品提供了驗證使用者的兩個方面。首先,它認證使用者是他聲稱的那個人(比如用密碼驗證);其次,它賦予使用者組成員身份或其他權限。
password: 當使用者修改密碼時,需要這個子產品。
session: 當賦予使用者某些服務之前或之後,要執行哪些操作。例如使用者在通路資料時執行寫日志操作。
第二列是控制方式,可用的選項有:
required: 檢查結果失敗,最終一定會失敗,但是仍然檢查後續項
requisite: 與required類似。隻不過該項檢查失敗,立即停止後續檢查項。
sufficient: 該項檢查成功,立即通過,不再檢查後續項。如果該項檢查失敗,也不意味着最終會失敗。
optional: 可選
include: 包含另一個檔案的内容
第三列是調用的子產品,這些子產品位于/lib64/security/目錄下
# ls /lib64/security/
pam_access.so pam_krb5afs.so pam_sepermit.so
pam_cap.so pam_krb5.so pam_shells.so
pam_chroot.so pam_lastlog.so pam_smbpass.so
pam_ck_connector.so pam_limits.so pam_sss.so
pam_console.so pam_listfile.so pam_stress.so
... ...
3.PAM應用執行個體:
例一:隻有wheel組的成員才可以切換成root使用者
# vim /etc/pam.d/su ->打開auth required 這行的注釋
以tom身份登陸,執行su –操作,即使輸入正确的root密碼,也不能登陸
# usermod -aG wheel tom ->把tom加入到wheel組
再次執行su –操作,tom可以切換成root使用者
例二:禁止tom從tty2登陸
# vim /etc/pam.d/login ,加入下面一行
account required pam_access.so
# vim /etc/security/access.conf ,尾部增加
- : tom : tty2
例三:隻允許tom使用者打開兩個檔案
檢視/etc/pam.d/system-auth中包含
session required pam_limits.so
# vim /etc/security/limits.conf ,尾部增加
tom hard nofile 2
不管是切換成為tom,還是以tom身份登陸 ,都被禁止。
例四:建立檔案/etc/vsftpd/ftpgrps,該檔案中的組不能通路ftp
# groupadd denyftp
# usermod -aG denyftp tom
# echo ‘denyftp’ > /etc/vsftpd/ftpgrps
# vim /etc/pam.d/vsftpd ,尾部增加
auth required pam_listfile.so item=group sense=deny file=/etc/vsftpd/ftpgrps onerr=succeed
驗證,tom登陸ftp,登陸不成功,檢查/var/log/secure日志
4.附上一份PAM系統管理者指南:
The Linux-PAM 系統管理者指南
作者:Andrew G. Morgan,
翻譯:孫國清(Thomas Sun),[email protected]
DRAFT v0.71 1999/11/8 這個文檔所涉的是系統管理者須知的關于Linux-PAM庫的知識. 它涉及了設定PAM的正确文法并讨
論維護一個可靠系統的正确的政策.
傳統上,當一個應用程式有身份識别的需求,它就不得不把某一種驗證算法寫進去. 例如,就傳統的UN*X系統而言,核對使用
者身份的方法就是要求使用者輸入正确的密碼. 這密碼,除了開頭的兩個字元作為"salt",剩下的是加密過的(經由crypt
(3)). 接著使用者被驗證這個加密過的密碼是否與他在密碼檔(就是/etc/passwd檔案)中他的那筆記錄的第二欄相符.在這樣
的系統裡,絕大部份權限的授予是基于這種單一的認證機制. 權限決定于個人的識别碼(uid)和不同群組的成員.服務和程
式是否可用由個人和群組的識别碼決定.傳統上,群組關系經由/etc/group檔案中的記錄來賦予.
不幸的是,随着計算機速度的不斷提高,再加上滿世界的關于網路計算的介紹,使得象這樣曾是安全的驗證機制,變得易受攻
擊了.面對這樣的現實,新的驗證方法正在持續的開發中.
Linux-PAM項目的目标是把賦權部分的開發以可靠的合适的鑒定模式從軟體中分離出來。這目标已經通過提供一組庫函數
實作了,應用程式可以用這些函數來請求驗證某個使用者。這個 PAM 由特定的系統檔案配置,/etc/pam.conf (或者是
在/etc/pam.d/裡的一系列配置檔案) 以經由特定的可用的認證模組來鑒定某個使用者的請求。 這些個模組通常位
于/usr/lib/security目錄并且以可動态加載的目标檔案的形式出現(參見 dlopen(3)).
2. 文中的說明
在繼續閱讀之前, 請記住本文假定提到的檔案位于預設的目錄。這個預設的目錄我們遵循RFC(RFC-86.0,見
bibliography)中的約定。如果你正用一個支援PAM但是卻選擇以不同的方式釋出這些檔案的釋出版的Linux(或是其他的
OS) (Red Hat就是這樣的釋出版), 那你從文章中直接拷貝例子的時候就要注意一下了.
舉個例子, where it is explicit, 本文假定PAM可加載目标檔案(就是 子產品)位于這個目錄: /usr/lib/security/. 可是
, Red Hat Linux, 為遵循Linux檔案系統标準(the FSSTND),把這些檔案放在/lib/security. 在使用本文的例子時請小心
的做一些轉換的工作。
3. 概觀
For the uninitiated,我們開始于考慮一個例子。我們來說說一個應用程式提供一些服務給使用者; login 就是這樣的程
序。 Login 做兩件事,它首先确認提出請求的使用者正是他們自己,第二步提供給他們所請求的服務: 就login而言服務
即是一個指令行外殼(command shell)(如bash,tcsh,zsh之類。)以這個使用者的身份去跑。
傳統上,前一個步驟通過login提示使用者輸入密碼然後确認系統是否同意登入;接着确認(就系統而言)使用者确實是提出
要求的那人。這類工作就是Linux-PAM的典型應用。
從應用程式員的角度看(在這個例子裡就是寫login程式的人), Linux-PAM處理認證的工作——确認使用者的身份。
Linux-PAM的彈性在于,你,系統管理者有權來決定實施怎樣的驗證方案。你有權來設定你的系統裡的任何支援PAM的應用
程式的驗證方案。就是說,你可以将驗證方案設計成單純的信任>;任何人(pam_permit)到像偏執狂似的通過視網膜掃描
,聲音識别和一個密碼!
舉例說明你所面對的彈性,考慮以下情形:系統管理者(家中的父母)希望提高他的使用者(孩子們)的算術能力。她可
以設定他們喜歡玩的“Shoot 'em up”(遊戲,當然得支援PAM)通過提問小于12的一對随機數的乘積的辦法來進行認證
。很明顯不管遊戲本身如何,他們會很快學會乘法表。等他們再大些,認證可以更新到包括多位除法!(譯者:我已經準
備用這種辦法來教我寶貝女兒學加減乘除了。)
Linux-PAM處理四種獨立的(管理)工作。它們是: 認證管理; 帳号管理; 會話期間管理;和密碼管理。 The
association of the preferred management scheme with the behavior of an application is made with entries in
the relevant Linux-PAM configuration file. 管理的功能由配置檔案中指定的子產品 來完成。這檔案的文法在 below部
分讨論。
下面的插圖描述了Linux-PAM的整個組織結構。
+----------------+
| application: X |
+----------------+ / +----------+ +================+
| authentication-[---->;--\--] Linux- |--;
如果 libpam 和 libpam_misc 不在程式所需的函數庫之列,那麼它将不會用PAM.
然而,這兩個函數庫還是可能已經包含程序式了,不過問題依然存在,因為把PAM
寫死在程式不會如你期望的工作.是以一個更可靠的方法是做一下的測試:
在/etc/pam.d目錄裡,需要為程式設有一個配置檔案.具體的檔案名是寫死在程式裡的.
通常和程式名一樣,但卻不總是這樣.為舉例說明,假設程式名字叫"pamprog",配置檔案
是/etc/pam.d/pamprog.
在/etc/pam.d/pamprog裡寫這兩行:
auth required pam_permit.so
auth required pam_warn.so
現在試着執行pamprog. 配置檔案的第一行是說所有使用者都被允許. 第二行會在你的
syslog 檔案(或者其它你的syslog會寫的檔案) 裡寫一個warning.
如果這測試是成功的,那麼你就知道你有一個"懂"pam的程式,并且你可以開始更有趣的工作:
決定如何在你的/etc/pam.d/pamprog裡堆徹PAM子產品.
4. Linux-PAM的設定檔
在以下兩個地方: 或者是一個單一的系統檔案: /etc/pam.conf; 或者是/etc/pam.d/ 目錄下的檔案. 本章我們來讨論這
些檔案的文法和一般的選項.
4.1 設定檔的文法
請注意, 在這些檔案裡 Linux-PAM 特有的符号是不區分大小寫的. 而子產品的路徑,是大小寫敏感的,因為它辨別的是Linux
下的檔案的名字. 而任何子產品參數的大小寫分别由各個子產品定義.
除以下的行之外,為系統管理者友善,還有兩個特殊的字元: 注解由'#'開頭,結束于行結束,另外,子產品的描述行可以以 '\'
脫字元延續到下一行.
通常/etc/pam.conf裡的每一行有以下格式:
service-name module-type control-flag module-path arguments
接下來,我們來解釋每個欄位的意思.另一種(也是常被采用的)設定Linux-PAM 的方法是通過/etc/pam.d/裡的檔案來實作.
在我們解釋完上面的那行之後, 我們就來讨論這種方法.
service-name
這筆記錄相關的服務名稱.通常這服務名稱是特定應用程式的名字.比如, `ftpd', `rlogind' 和 `su' 這些. .
有一個保留的服務名稱,它是用來定義預設的認證機制的. 它就是`OTHER',大小寫無關.注意,當已經有為指定服務定
義了子產品,那麼 `OTHER' 記錄會被忽略.
module-type
子產品的四種(目前是)類型.這四種類型是:
* auth; 這種子產品類型确定有關使用者認證的兩方面. 第一,它确認使用者就是他們自己,這通過訓示應用程式提示用
戶輸入密碼或者其它證明身份的方法.第二,這類子產品會賦予成員資格 Secondly, the module can grant group
membership (independently of the /etc/groups file discussed above) or other privileges through its
credential granting properties.
* account; 這些子產品處理非認證級的帳号管理. 典型的用法是基于一天的不同時間段來限制/允許通路某服務,
目前可用的系統資源 (最大使用者數)或者限制特定使用者---'root隻能從控制台登入.
* session; 首先, 這類子產品和一系列動作有關,指在使用者得到/失去服務時要做的事. 這包括記錄使用者的登入/登
出,挂載必須的目錄等等.
* password; 這最後一種類型在更新使用者的認證标志時需要. 通常,各個基于"質問/回答"(譯注:指傳統的使用者名
/密碼的認證方法)的認證方法(auth)有一個對應的此子產品.
control-flag
控制符用來訓示當某一子產品傳回成功或失敗時PAM如何動作. 既然子產品可以被堆疊 (同種類型的子產品按先後順序執行,
一個接一個), 控制符決定每個子產品的重要程度.應用程式不會直接接收'/etc/pam.conf' 裡列出的每一個子產品的成功或失
敗的結果. 相應的是,它隻從Linux-PAM接收一個 成功 或 失敗 的結論. 這些子產品的執行順序就是它們在 /etc/pam.conf
裡的記錄的順序;排在前面的記錄在排在後的記錄之前被執行. 在Linux-PAM 0.60版本裡, 這個control-flag 可以有兩種
文法來定義.
簡單一些(也是過去的)文法是用一個限定詞訓示相關子產品的重要程度. 有四個關鍵字: required, requisite,
sufficient 和 optional.
Linux-PAM 将這四個關鍵字解釋為:
* required; 需要的,這表明此子產品傳回成功值對于整個module-type的成功是必要的. 此子產品的傳回失敗并不會
傳回給使用者直到剩下的子產品(同樣module-type)都執行過.
* requisite; 必要的,類似 required, 隻不過, 當這類子產品傳回失敗時,整個控制會立刻回到應用程式. 傳回值
同第一個 需要的 或 必要的子產品傳回的失敗. 注意,這标志可以用來防止 required or requisite module to fail.
Note, this flag can be used to protect against the possibility of a user getting the opportunity to enter
a password over an unsafe medium. It is conceivable that such behavior might inform an attacker of valid
accounts on a system. This possibility should be weighed against the not insignificant concerns of
exposing a sensitive password in a hostile environment.
* sufficient; 充分的,這子產品傳回的成功會被認為已經 充分滿足Linux-PAM 庫确認這類子產品(module-type)是
成功的條件. 如果沒有先前的requisite 子產品傳回了失敗,那麼不再會有其它'堆疊' 的子產品被呼叫. (注意, 這種情況下,
随後的requisite 子產品就不會 被呼叫.). 這子產品傳回的失敗不會看作是緻命的錯誤而至影響應用程式從這module-type
得到成功的結果.
* optional; 可選的,正如這名字一樣,此?control-flag 緻使子產品對最終的成功或失敗的結果不會産生決定性的
影響. 一般,Linux-PAM 在确定整個子產品堆成功活失敗時忽略這子產品. 然而, 當從之前或後續的子產品得不到明确的成功或
失敗的結果時,這子產品将決定傳回給應用程式的狀态. 後種情況會出現在比如當其它子產品傳回PAM_IGNORE 時.
更複雜(新)的文法則更明确,使管理者有更多的控制使用者認證的空間. 這種控制符以方括号包含,由一系列的
value=action 對組成:
[value1=action1 value2=action2 ...]
這裡的 valueI 有以下值 return values: 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; conv_again; incomplete; 和 default. 最後的 (default) 被用來定義當沒有明确定義時
的預設動作.
actionI 可以是一個正數或者是以下辨別: ignore; ok; done; bad; die; 和 reset. 當以一個正數J 作為action
時,它的作用是訓示以下J個子產品将被跳過. 通過這種手段, 管理者可以開發出适度複雜的子產品堆疊,它以許多不同的路徑
執行. 至于以何種路徑則決定于某個子產品的反應.
* ignore - 此類子產品的傳回狀态将不會影響應用程式所得到的傳回值.
* bad - 這表示相應的傳回值将被認為是子產品失敗. 如果此子產品是堆疊中的第一個失敗的子產品, 它的狀态值将作
為整個堆疊的狀态.
* die - 和 bad 相同,不過會終止整個子產品堆疊,PAM立即傳回到應用程式.
* ok - 這告訴PAM 管理者要讓此傳回值直接作用于整個子產品堆疊的傳回. 換句話說, 如果堆疊的原先狀态會導
緻傳回 PAM_SUCCESS, 這子產品的傳回值将會覆寫這結果. 請注意:如果堆疊的原先狀态儲存着一些意為子產品失敗的值,
這'ok'将不會用來覆寫那樣的值.
* done - 和 ok 一樣, 不過會終止整個子產品堆疊, PAM立即傳回到應用程式.
* reset - 清除儲存子產品堆疊狀态的記憶體并且重新開始下一組堆疊.
來體會一下這種新文法的強大之處, 從 Linux-PAM-0.63起, 客戶插件代理的概念被引進. 這多少使PAM支援從C/S應
用程式固有的傳輸協定進行機器-機器的認證成為可能.(?) 通過 ``[ ... value=action ... ]'' 的文法, 使應用程式對
支援binary prompt?的用戶端采用binary prompt?, 而對舊有的用戶端則向後相容的采用另一種認證模式. 夠靈活吧?
module-path
是可動态加載目标檔案的路徑; 也即可插入式子產品 本身. 如果路徑的首字元是 `/', 那它被作為一個完整路徑. 如
果不是這樣, 那子產品的路徑則會加上預設的子產品路徑: /usr/lib/security (見 above).
args
args 是一組傳給子產品的參數. 類似一般Linux的指令的參數. 通常, 合法的參數是可選的并且是子產品特有的. 無效的
參數會被子產品忽略, 可是, 當抓到一個無效參數, 子產品被要求寫一個錯誤資訊到 syslog(3). 下一節有一個一般 選項的
清單.
設定檔裡如果有任一行有格式錯誤, 那通常會導緻認證流程失敗. 相應的錯誤資訊會通過呼叫syslog(3)寫入系統日志.
4.2 基于目錄的設定
從0.56版開始有比單個配置檔案更靈活的做法, 可以通過/etc/pam.d/裡的檔案來配置libpam. 這種方法,/etc/pam.d/裡
的檔案名和服務名(service-name)相同(小寫): 這是各服務的個性化設定檔.
Linux-PAM 可以編譯成兩種模式之一. 首選的模式是使用/etc/pam.d/ 或/etc/pam.conf設定,但不是同時兩者皆可.也就
是說, 如果; 那我先在還能做些什麼苦差呀?
好,不要驚慌. 你首先要認識到的是這種事情會發生在50%的從未碰過PAM的使用者身上.
這已經不止發生一兩次了,每次都不一樣,但是最終,每次解決方法總是一樣的.
首先,我希望你設定了LILO的延時.如果是的,重開機,按下shift或者tab或其它什麼鍵,
然後輸入:
LILO boot: linux single
(把 'linux' 替換成你的linux啟動字串).
這會把你帶進系統而不用登入. 想知道從控制台破掉一台Linux主機是多容的事?
現在知道了吧.
如果沒法那樣做,那你就要一個啟動軟碟和一個根檔案系統盤象slachware的rescue.gz.
(Red Hat的安裝盤有這樣的模式.)
總之,重點是要進入到root提示符.
然後, 我假設你還沒有完全打爛你的PAM安裝包 - 僅僅是破壞了設定檔.
這裡是重新設定PAM的步驟:
cd /etc
mv pam.conf pam.conf.orig
mv pam.d pam.d.orig
mkdir pam.d
cd pam.d
然後用vi在這目錄下建立一個叫"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
現在你有了PAM的最簡單的設定了, 這象你以前用的方式一樣工作.
所有的事情又魔法似的能運作了.
來試着按ALT-F2從另一控制台登入. 如果無法登入, 你就有了大麻煩了,或者打錯了什麼.
奇怪的是如果你在設定檔裡輸錯了東西, 你不會從控制台得到任何錯誤 - 錯誤隻會記錄
在日志檔裡. 是以看看那兒!(tail /var/log/messages.)
從現在起你可以回頭做實際設定, 但願這首次經曆沒把你搞懵了. :/
一些要點 (to make everything "right" with Red Hat...):
從RedHat安裝目錄安裝最新的pam, pamconfig, and pwdb , 下一個指令
rpm -Uvh [或需要加上 --force too] pam-* pamconfig-* pwdb-*
然後确認你安裝(或重裝)了最新版的libc, util-linux, wuftp, 和 NetKit. 或許
還有相關的x應用程式, 像xlock,但我還從沒有用過.(注:這篇文章寫的比較早,那時候
X程式很少)
5.2 防止采用一個脆弱的"other"設定.
擁有一個脆弱的預設設定(OTHER)是件壞事. OTHER是所有面向PAM的程式的預設設定,如果它很脆弱, 你的系統就有可能變
得易受攻擊.
這裡有個"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可用的各種子產品的具體說明. 通常這些子產品可以自由使用. 除非特别指出.
在拷貝下面的例子時也請注意 on text conventions above裡的備注.
6.1 access 子產品
概要
子產品名:
pam_access
作者:
Alexei Nogin ;
維護者:
作者
提供的管理組:
account
Cryptographically sensitive:
安全等級:
代碼清潔度:
系統依賴:
需要一個設定檔:/etc/security/access.conf
網絡接口:
如果設定了就通過PAM_TTY , 否則嘗試呼叫ttyname()從标準輸入檔案描述符得到tty名字.标準的 gethostname(),
yp_get_default_domain(), gethostbyname() 呼叫. NIS 用來提供網絡使用者組的支援.
概述
提供logdaimon(?)類型的登入通路控制.
Account component
識别的參數:
描述:
這子產品提供基于登入名稱和主機(或域名),internet位址(或網絡數),或者非網絡登入的終端名字的錄通路控制.診斷
資訊通過syslog(3)記錄. 來自Wietse Venema的logdaemon-5.6裡的login_access.c經過A. Nogin修改後采用.
例子/建議用法:
推薦使用. 例如,在管理像NIS伺服器和郵件伺服器時, 你需要有一些活動的帳号, 但卻不想所有這些帳号都有登入的
權限.
對于/etc/pam.d類型的設定方式,你的子產品放在/lib/security裡, 把下面一行加在 /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_rhosts_auth的文檔.
在釋出包裡包含有一個 access.conf 的樣本.
6.2 Chroot
pam_chroot
Bruce Campbell ;
Author; proposed on 20/11/96 - email for status
account; session; authentication
Unwritten.
要求是 localhost.
這子產品的目的是對一般使用者進行透明的包裹, 這可以把他們置于一個僞裝的檔案系統 (比如, 他們的'/' 實際上是
/some/where/else).
如果你有幾個不同類的使用者, 并且你對于安全性有一點點偏執, 那這子產品将非常有用. 這可以用來限制哪些使用者能看到什
麼, 并且限制他們隻能執行哪些程式.
Account component:
Need more info here.
Authentication component:
Session component:
Arguments and logging levels for the PAM version are being worked on.
範例/建議用法:
提供一組合理的程式 - 僅放入 'cat', 'ls', 'rm', 'cp' 和 'ed' 有點...
不要太極端 (比如, 你可以為每個使用者設定各自分開的環境, 但這樣會太浪費磁盤空間.)
6.3 Cracklib 可插入的密碼強度檢查程式
pam_cracklib
Cristian Gafton ;
作者.
password
需要系統庫 libcrack 和系統字典: /var/cache/cracklib/cracklib_dict.
這子產品可以插入給定程式的password堆疊來提供密碼的強度檢驗.
這子產品以以下流程運作: 它首先呼叫Cracklib例程來檢查密碼的強度; 如果Cracklib認可, 那麼子產品會經行額外一些檢查
. 這包括:
* Palindrome - 新密碼是否為舊密碼的回文?
* Case Change Only - 新密碼是否隻是拿舊密碼改了些大小寫?
* Similar - 新密碼是否太像舊密碼? 這由一個參數控制, difok 這是新舊密碼的相差字元能被接受的最小個數, 模
式是10個或者新密碼的1/2長, 二者取小的那個.
* Simple - 新密碼是否太簡單? 這由五個參數控制: minlen, dcredit, ucredit, lcredit 和 ocredit. 這些參數
如何生效以及預設值是什麼見參數一節.
* Rotated - 新密碼是否為舊密碼的輪轉?
* Already used - 密碼是否曾經用過? 先前用過的密碼儲存在/etc/security/opasswd裡.
不帶參數的配置這子產品可以很好的工作在标準的unix密碼加密環境. 對于MD5加密, 密碼可以長于8個字元,那麼這子產品的
預設設定就使使用者選擇一個滿意的密碼變得困難了. 顯然, 對于新密碼不能包含多于一半的舊密碼的字元的要求就成了一
個不一般的限制了. 比如, 舊密碼"the quick brow fox jumped over the lazy dogs" 将難于更改... 此外, 預設設定
允許密碼短至5個字元. 對于采用md5加密算法的系統, 加大允許的最短密碼長度會是個好主意. One can then allow
more credit for different kinds of characters but accept that the new password may share most of these
characters with the old password.
Password component
debug; type=XXX; retry=N; difok=N; minlen=N; dcredit=N; ucredit=N; lcredit=N; ocredit=N;
這部件的動作是提示使用者輸入密碼然後通過比對系統字典和一連串規則來檢查它的強度以識别出差勁的選擇.
預設動作是提示使用者輸入一個密碼, 檢查強度, 然後, 如果通過檢查, 提示第二次輸入密碼 (用來檢驗第一次的輸入
是正确的). 這之後, 密碼被當作新的認證辨別傳送給随後的安裝的子產品.
預設的動作可以用一些參數改成許多不同的方式:
* debug - 這選項令此子產品寫入資訊到syslog(3)以顯示此子產品的現為(此選項不會 把密碼資訊寫入日志檔).
* type=XXX - 提示使用者輸入密碼的預設提示符是: ``New UNIX password: '' 和 ``Retype UNIX password:
''. 用此參數可以把 "UNIX" 替換成 XXX.
* retry=N - 本模組要求新密碼(用來檢查強度)的預設次數是1次. 用這參數可以增加到N次.
* difok=N - 這參數會改變允許新舊密碼的字元差異為至少10個這樣的預設值. 此外, 如果有一半的字元不同,
新密碼就會被采用.
* minlen=N - 可接受的最短的密碼長度+1. 此外對于新密碼的長度, 對于每個不同種的字元 (其它,大寫,小寫
和 數字),會得到"加分" (長度+1). 此參數的預設值是9, 這對于舊的UNIX密碼體系已經夠了, 但是對于利用md5的額外安
全性或許太小了. 注意, Cracklib本身有一對長度的限制: 4, 寫死在程式裡的"路太短"的限制;6,定意的限制.這兩個限
制會不經過參考minlen 而被檢查出來. 如果你要允許密碼長度短至5, 你要麼不要使用此子產品要麼重新編譯crack庫并重
新編譯此子產品.
* dcredit=N - 這是對于新密碼因包含數字而得到"加分"的限制. 如果你有小于或等于N個數字, 每個數字将會
對整個長度+1來迎合目前minlen 的值. dcredit的預設是1, 對于小于10的minlen 推薦此值.
* ucredit=N - 這是對于新密碼因包含大寫字元而得到"加分"的限制. 如果你有小于或等于N個大寫字元, 每個
大寫字元将會對整個長度+1來迎合目前minlen 的值. ucredit的預設是1, 對于小于10的minlen 推薦此值.
* lcredit=N - 這是對于新密碼因包含小寫字元而得到"加分"的限制. 如果你有小于或等于N個小寫字元, 每個
小寫字元将會對整個長度+1來迎合目前minlen 的值. lcredit的預設是1, 對于小于10的minlen 推薦此值.
* ocredit=N - 這是對于新密碼因包含其它字元而得到"加分"的限制. 如果你有小于或等于N個其它字元, 每個
其它字元将會對整個長度+1來迎合目前minlen 的值. ocredit的預設是1, 對于小于10的minlen 推薦此值.
為舉例說明如何使用此子產品, 我們列出如何将此子產品和pam_unix 部件堆疊:
# 下面兩行堆疊了兩個password類型的子產品. 在這例子裡, 使用者有3次機會輸入健壯的密碼.
# "use_authok"參數確定pam_unix子產品不再另外提示輸入密碼,
# 而是采用由pam_cracklib提供的密碼.
passwd password required pam_cracklib.so retry=3
passwd password required pam_unix.so use_authtok
另外一個例子(以/etc/pam.d/passwd的格式)是用md5密碼加密的情形:
#%PAM-1.0
# 下面兩行采用MD5系統, 密碼長度最少14+出現數字的最多2個"加分"+
# 出現其它字元的最多2個"加分", 并且至少有3個字元沒有出現在舊密碼中.
password required pam_cracklib.so \
difok=3 minlen=15 dcredit= 2 ocredit=2
password required pam_unix.so use_authtok nullok md5
6.4 死鎖子產品
pam_deny
Andrew G. Morgan ;
current Linux-PAM maintainer
account; authentication; password; session
清潔的.
這子產品用來拒絕通路. 它永遠透過PAM架構告知程式失敗. 正如概述 above裡提到的, 這子產品适合用在預設(OTHER)條目.
這部件除了傳回失敗外不做任何動作, 傳回類型是 PAM_ACCT_EXPIRED.
把這子產品堆疊在account 裡将會阻止使用者通過應用程式(引用Linux-PAM的帳戶管理函數pam_acct_mgmt())擷取通路.
下面的例子使登入變得不可能:
# add this line to your other login entries to disable all accounts
login account required pam_deny.so
Authentication component
這部件除了傳回失敗什麼也不做, 當pam_authenticate()被呼叫(當應用程式試圖認證使用者時)時傳回值是
PAM_AUTH_ERR; 當pam_setcred()被呼叫(當建立連接配接并設定使用者證書時 -- 在具體實作中這函數不太可能被呼叫)時傳回
PAM_CRED_UNAVAIL .
範本/建議用法:
為拒絕預設程式的通路, 在你的Linux-PAM裡包含下面一行:
# add this line to your existing OTHER entries to prevent
# authentication succeeding with default applications.
OTHER auth required pam_deny.so
子產品的這部件會阻止使用者有機會修改密碼. 它總是傳回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
Session component
子產品的這一方面會阻止應用程式在主機上開啟會話.
和其它的session子產品一起工作, 那子產品也許顯示一下"當日消息". 這子產品可以用來阻止使用者開啟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 Set/unset 環境變量
pam_env
Dave Kinchlea ;
Author
Authentication (setcred)
/etc/security/pam_env.conf
這子產品允許(取消)設定環境變量. Supported is the use of previously set environment variables as well as
PAM_ITEMs such as PAM_RHOST.
debug; conffile=configuration-file-name; envfile=/env-file-name; readenv=/0|1
這子產品允許你(取消)設定任意的環境變量為固定字串, 先前的環境參數和/或PAM_ITEM.
通過設定檔(預設是,/etc/security/pam_env.conf, 但是可由connfile 參數改變) 進行所有的控制. 每行由變量名
開始, 每個變量有兩個可選項: DEFAULT和OVERRIDE. DEFAULT 用來設定變量的預設值, 如果沒有指定預設值則設為空字
串. OVERRIDE 告訴pam_env如果變量以設定就覆寫(覆寫" "預設值). 如果未設定OVERRIDE, 則假定為""并且不會覆寫其
它值.
VARIABLE [DEFAULT=[value]] [OVERRIDE=[value]]
(也許不存在的)環境變量可以指定值為${string} 并且(也許不存在的)PAM_ITEM 可以用來指定值:&{string} .
$和& 可以由反斜線脫意為一般字元 (成為\$本生). 雙引号可以用來封裝有空格的值 (但是不可以用作變量名)必須
整個被引号包含并且裡面不應該有引号或者脫意的引号.
這子產品還可以解析包含單純的每行是鍵=值格式的檔案(預設是/etc/environment). 可以用 envfile 旗标設定預設文
件并且可以設定readenv 旗标為1或0來決定是否啟用這選項.
這子產品的行為可以由以下旗标來更改: flags:
* debug - 往syslog(3)寫更多的資訊.
* conffile=filename - 預設的設定檔是/etc/security/pam_env.conf. 這選項可以覆寫此預設. 必須提供完整
的檔案名,目錄+檔案名.
* envfile=filename - 預設從/etc/environment 裡讀鍵=值對來設定變量. 這選項覆寫預設檔案. 必須提供完
整的檔案名,目錄+檔案名.
* readenv=0|1 - 打開或關閉讀取envfile指定的檔案(0=關閉,1=開啟). 預設是開啟.
更多的用法見pam_env.conf .
6.6 filter 子產品
pam_filter
Not yet.
在Linux系統下可以幹淨的被編譯.
需要安裝filters .
這子產品用來提供給類似ttysnoop(需要一些參考)的程式一個可選的插件. 因為還沒有為這功能所寫的插件出現, 這子產品目
前隻是個玩具. 提供給這子產品的唯一一個插件僅是對輸入輸出流做大小寫轉換. (這會變得非常讨厭并對基于termcap的編
輯器不太友好)
Account+Authentication+Password+Session components
debug; new_term; non_term; runX
每個組建都有呼叫過濾器的能力. 過濾器總是以所屬應用程式的權限被execv(2) 而 不是 以使用者的權限. 是以這些
過濾器并不總能被使用者不經關掉相關會話而殺掉.
這子產品的行為會被傳給它的參數相當程度的左右:
* debug - 這選項增加子產品被執行時寫進syslog(3)的資訊量.
* new_term - 過濾器的預設動作是會設定PAM_TTY 為使用者連上應用程式時所用的終端代号. 此參數訓示過濾器
可以設定PAM_TTY 為一個過濾了的僞終端.
* non_term - 不要試圖設定PAM_TTY .
* runX - 子產品必須得知道何時呼叫過濾器. 這參數告知過濾器何時被呼叫, 參數後面是各自的過濾器的完整路
徑和過濾器執行時的參數.
X 所允許的值是 1 和 2. 這訓示過濾器執行的确切時間. 閱讀 Linux-PAM的子產品開發指南會對解釋此觀念有
所幫助. 基本上, 針對每個管理組都有多至兩個呼叫此子產品的函數.
在 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
訓示第二次時(tt/PAM_UPDATE_AUTHTOK/階段)時呼叫.
在寫作本時, 這子產品鮮有實際應用. 如興趣所緻, 你可以試着把下面幾行加入你的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 匿名通路子產品
pam_ftp.so
authentication
提示使用者輸入email位址; 易受欺騙的.(XXX - 需要加工)
此子產品的意圖是提供一個可插入式的匿名ftp通路模式. mode of access.
debug; users=XXX,YYY,...; ignore
此子產品會攔截使用者名和密碼. 如果使用者名是 ``ftp'' 或 ``anonymous'', 使用者的密碼以
[email='@']'@'[/email]
為分隔符被分解成
PAM_RUSER 和 PAM_RHOST 兩部分; these pam-items being set accordingly. The username is set to ``ftp''. In
this case the module succeeds. Alternatively, the module sets the PAM_AUTHTOK item with the entered
password and fails.
此子產品的行為可以有以下旗标修改:
* debug - 往syslog(3) 寫更多的資訊.
* users=XXX,YYY,... - 替代 ``ftp'' 或 ``anonymous'', 提供給以逗号分開的使用者以匿名通路;
``XXX,YYY,...''. 申請人可以輸入這些使用者名之一, 傳回的使用者名設定為清單中的第一個使用者;``XXX''.
* ignore - 不關心使用者的email位址(如果提供).
見 above.
6.8 群組通路子產品
pam_group
對于針對setgid狀态的檔案可通路性敏感.
需要/etc/security/group.conf 檔案. 可被編譯成帶有或不帶libpwdb.
僅通過正确的PAM_TTY 項.
此子產品提供基于使用者名以及他們從哪個終端請求服務的群組設定. It takes note of the time of day.
此子產品不用于認證使用者, 而是用來賦予使用者組的身份(在認證子產品的憑證設定階段). 這些組身份基于他們請求的服務
. 組身份列在/etc/security/group.conf .
為使這子產品正常運作,必需先要有格式正确的/etc/security/groups.conf . 此檔案的格式如下.組身份基于服務應用
程式滿足此設定檔的任意行來賦予. 沒一行有如下格式(注解以`#'開頭):
services ; ttys ; users ; times ; groups
前四個欄位和pam_time的etc/security/pam_time.conf文法相同, 最後的欄位, groups, 是以逗号(或者空格)分開的
一個組的清單. 如果使用者的應用程式滿足前四個欄位, 使用者就被賦予清單中的組身份.
通常, 這子產品對于配置設定使用者特有的檔案通路權限有幫助. 問題是一旦使用者得到了組身份, 他就可以建立一個setgid
的屬于某群組的程式. 這之後, 當使用者不再是這個組的成員時, 他們可以通過這程式擷取組身份. 之是以使用者通路的檔案
系統如此重要, 是一旦檔案系統被加載為nosuid時, 這樣的程式就無法執行. 為使這子產品提供任何級别的安全性, 使用者能
有寫權限的所有檔案系統都應該被加載成nosuid模式.
pam_group 子產品的功能和/etc/group平行. 如果使用者已被此子產品賦予了任何組身份, 他還另外被賦予/etc/group裡的
相關組身份.
6.9 Add issue file to user prompt
pam_issue
Ben Collins ;
Authentication (pam_sm_authenticate)
此子產品在當提示輸入使用者名時顯示釋出檔案(/etc/issue).
issue=issue-file-name; noesc;
此子產品允許你在提示使用者輸入使用者名之前顯示出釋出資訊. 預設狀态下也會解析釋出檔案中的脫意代碼,類似有些通
用的getty(\x 格式).
識别的脫意代碼:
* d - 目前日期
* s - OS名稱
* l - 目前tty的名字
* m - 本系統的架構(i686, sparc, powerpc, ...)
* n - 主機名
* o - 域名
* r - OS的版本發行号(例如 2.2.12)
* t - 目前時間
* u - 目前登入的使用者數
* U - 類似u, 它能區分用"user" 還是 "users" (比如. "1 user" or "10 users")
* v - OS版本/建構日期(比如. "#3 Mon Aug 23 14:38:16 EDT 1999" on Linux).
以下旗标可以用來改變此子產品的行為:
* issue - 替換預設釋出檔案
* noesc - 不解析脫意代碼
login auth pam_issue.so issue=/etc/issue
6.10 The Kerberos 4 module.
pam_krb4
Derrick J. Brashear ;
authentication; password; session
采用相關 API
相關庫- libkrb, libdes, libcom_err, libkadm; 和一組Kerberos的頭檔案.
從網絡上的Kerberos的票據中心得到Kerberos的票據授權票.
此子產品提供了進行Kerberos密碼認證的界面, 它能從Kerberos的票據授權伺服器取得票據授權票, 離線時毀掉票據, 和修
改Kerberos密碼.
此部件目前會設定環境變量 KRBTKFILE (雖然目前還沒法export這變量), 以及當登出時删除使用者的票據(要等到
login 支援 PAM_CRED_DELETE ).
直到我們能通過Linux-PAM 改變環境.
use_first_pass; try_first_pass
這部件改變使用者的Kerberos密碼, 它首先憑舊密碼從密碼修改服務得到活動鑰匙, 然後發送新密碼給那服務.
僅能用于真實的real Kerberos v4 kadmind. It cannot be used with an AFS kaserver unless special
provisions are made. Contact the module author for more information.
此子產品通過從Kerberos伺服器申請票據授權票來驗證使用者的Kerberos密碼, 并且可選的如果本機鍵檔案存在就從嘗試
此票據中擷取本機的主機鍵并和本機的鍵檔案比對.
它還會把票據記錄在檔案以便後序使用, 并且在當離線是删除票據檔案(目前還不行,除非login會呼叫
PAM_CRED_DELETE).
此子產品可以同采用MIT v4 的Kerberos伺服器協同工作. 可以加以修改已使其支援AFS類型的Kerberos. 為防止密碼算
法的不一緻,目前還沒有支援.
本文轉自Jx戰壕 51CTO部落格,原文連結:http://blog.51cto.com/xujpxm/1403232,如需轉載請自行聯系原作者