PAM,即Pluggable Authentication Modules(可插入式身份驗證模塊)最初是由Sun公司發明的,Sun把它做爲一種驗證用戶身份的靈活方法。多年以來,UNIX環境下的身份驗證機制一直就是簡單地把用戶同他們在/etc/passwd文件裏的配置項關聯起來而已。後來,由於須要有更強的安全性,並且要支持更大範圍的驗證機制(像智能卡),因此對靈活性更好的驗證方法的需求也就應運而生。某些PAM LDAP模塊對全局的驗證目錄集中執行驗證。
全部完善的Linux發行版本都帶Linux-PAM,它和Sun公司PAM標準目前的實現沒有關係。PAM的概念很簡單:須要驗證功能的程序只須要知道有一個模塊能夠用來替它們執行驗證功能就好了。PAM的設置保證了模塊能夠隨時添加、刪除和從新配置—對於編譯工具程序的時候就被連接進來(甚至本來就有)的模塊來講,不必這樣作。這種結構的效果就是,PAM已經成爲系統管理員極其強大的工具。
PAM模塊是經過/etc/pam.d目錄下的文件來進行配置的。這個目錄下針對每種服務的文件所包含的配置項都有以下形式:
module-type control-flag module-path arguments
module-type字段能夠取的值有auth、account、session或者password。auth肯定用戶是誰,還可能肯定他是哪個組的成員。account實行不基於身份驗證的決策,好比根據一天中的時間來訪問。session實現了在提供給用戶服務的先後須要完成的任務。最後,password用於要求用戶提供驗證信息(好比口令)的狀況。
control-flag字段有4個可能的取值:required、requisite、sufficient和optional。required和optional最經常使用,它們分別表示:爲了程序繼續執行模塊必須取得成功,或者模塊成功與否沒有關係。
第3個和第4個字段是動態加載模塊對象的路徑和參數。若是路徑的第1個字符是/,它就被看成是一個絕對路徑。不然,這個字段的內容就被追加到默認路徑/lib/security的後面。
PAM是上述口令複雜性難題的解決方案之一。pam_cracklib模塊可以強制要求口令符合最低強度要求。具體要求則變化無窮,因此要使用grep找到正確的配置文件。例如,要保證用戶口令不能被John the Ripper破解(參考20.10.3節瞭解有關它的更多知識),Fedora上的/etc/pam.d/system-auth應該包括:
password required pam_cracklib.so retry=3 minlen=12 difok=4
有了這幾行,PAM就會把用戶提出的新口令同破解字典和規則集進行對照(這要求有系統庫libcrack,還有一個系統字典/usr/lib/cracklib_dict.*)。若是用戶的口令不符合cracklib的要求,那麼屏幕上就會出現像「The password is too simple(口令太簡單)」這樣的出錯信息。
cracklib的參數規則很複雜,不過下面是對上述特定配置的解釋。
— 參數retry=3指出用戶在輸入一個強口令的時候必須輸入三遍。
— 參數minlen=12指出口令的最短長度。大寫字母、數字和標點符號由庫特殊處理,從而減少了這個最短長度。參數爲minlen=12時,用戶能有的最短口令實際爲8個字符,不是12個字符,可是用戶設定一個8字符口令時必須包括全部4種字符類型。
— 參數difok=4指出新口令至少要有4個字符不會出如今老口令中。
現代Linux發行版本包含而且默認使用pam_cracklib模塊,但一般不啓用口令複雜性規則。
PAM模塊有數十種。您能夠從www.kernel.org/pub/linux/libs/pam下載專門的模塊以及它們的文檔。 linux
系統版本:
Red Hat Enterprise Linux AS release 4
Linux用戶密碼策略
Linux用戶密碼的有效期,是否能夠修改密碼能夠經過login.defs文件控制.對login.defs文件修隻影響後續創建的用戶,若是要改變之前創建的用戶的有效期等可使用chage命令.
Linux用戶密碼的複雜度能夠經過pam pam_cracklib module或pam_passwdqc module控制,二者不能同時使用. 我的感受pam_passwdqc更好用.
/etc/login.defs密碼策略
PASS_MAX_DAYS 99999 #密碼的最大有效期, 99999:永久有期
PASS_MIN_DAYS 0 #是否可修改密碼,0可修改,非0多少天后可修改
PASS_MIN_LEN 5 #密碼最小長度,使用pam_cracklib module,該參數再也不有效
PASS_WARN_AGE 7 #密碼失效前多少天在用戶登陸時通知用戶修改密碼
pam_cracklib主要參數說明:
tretry=N:重試多少次後返回密碼修改錯誤
difok=N:新密碼必需與舊密碼不一樣的位數
dcredit=N: N >= 0:密碼中最多有多少個數字;N < 0密碼中最少有多少個數字.
lcredit=N:小寶字母的個數
ucredit=N大寶字母的個數
credit=N:特殊字母的個數
minclass=N:密碼組成(大/小字母,數字,特殊字符)
pam_passwdqc主要參數說明:
mix:設置口令字最小長度,默認值是mix=disabled。
max:設置口令字的最大長度,默認值是max=40。
passphrase:設置口令短語中單詞的最少個數,默認值是passphrase=3,若是爲0則禁用口令短語。
atch:設置密碼串的常見程序,默認值是match=4。
similar:設置當咱們重設口令時,從新設置的新口令可否與舊口令類似,它能夠是similar=permit容許類似或similar=deny不容許類似。
random:設置隨機生成口令字的默認長度。默認值是random=42。設爲0則禁止該功能。
enforce:設置約束範圍,enforce=none表示只警告弱口令字,但不由止它們使用;enforce=users將對系統上的全體非根用戶實行這一限制;enforce=everyone將對包括根用戶在內的全體用戶實行這一限制。
non-unix:它告訴這個模塊不要使用傳統的getpwnam函數調用得到用戶信息,
retry:設置用戶輸入口令字時容許重試的次數,默認值是retry=3
密碼複雜度經過/etc/pam.d/system-auth實施
如:
要使用pam_cracklib將註釋去掉,把pam_passwdqc.so註釋掉便可.
#password requisite /lib/security/$ISA/pam_cracklib.so retry=3 difok=1
password requisite /lib/security/$ISA/pam_passwdqc.so min=disabled,24,12,8,7 passphrase=3
password sufficient /lib/security/$ISA/pam_unix.so nullok use_authtok md5 shadow
#password requisite /lib/security/$ISA/pam_cracklib.so retry=3 difok=1
新密碼至少有一位與原來的不一樣. 安全