如何在Linux系統中限制密碼長度的同時對密碼的複雜程度也進行管理,最近發現有人的密碼符合長度規則,可是卻很簡單很容易被猜出來,查了相關資料後發現了PAM中的pam_cracklib模塊就是用來作密碼複雜度檢測的。 session
先簡單的介紹一下PAM,PAM(Pluggable Authentication Modules )是由Sun提出的一種認證機制。它經過提供一些動態連接庫和一套統一的API,將系統提供的服務和該服務的認證方式分開,使得系統管理員能夠靈活地根據須要給不一樣的服務配置不一樣的認證方式而無需更改服務程序,同時也便於向系統中添加新的認證手段。 PAM模塊是一種嵌入式模塊,修改後即時生效。 ui
pam的重要文件以下: 加密
/usr/lib/libpam.so.* ## PAM核心庫 spa
/etc/pam.conf ## PAM配置文件 debug
/etc/pam.d/* ## PAM各個模塊的配置文件 unix
/lib/security/pam_*.so ## 可動態加載的PAM模塊 日誌
PAM配置文件的每一行的格式:Module-type Control-flag Module-path Arguments 接口
模塊類型 控制字符 模塊路徑 模塊參數 md5
Module-type: ci
auth:肯定有關用戶認證的兩方面。第一,他確認用戶就是他們本身,這經過應用程序提示用戶輸入密碼或者其餘正式身份的辦法。第二,這類模塊會賦予成員資格。
account:處理非認證級的帳號管理。典型的用法是基於一天的不一樣時間來限制、容許訪問某服務。限制當前可用的系統資源(最大用戶數)或者限制特定用戶—root只能從控制檯登錄。
session:一系列有關動做,只在用戶獲得/失去服務時要作的事。這包括記錄用戶的登陸/退出、掛載必要 的目錄等。
password:設置密碼。
Control-flag:
required:表示本模塊必須返回成功才能經過認證,可是若是該模塊返回失敗的話,失敗結果也不會當即 通知用戶,而是要等到同一stack中的全部模塊所有執行完畢再將失敗結果返回給應用程序。能夠認爲是一個必要條件。
requisite:與required相似,該模塊必須返回成功才能經過認證,可是一旦該模塊返回失敗,將再也不執行 同一stack內的任何模塊,而是直接將控制權返回給應用程序。是一個必要條件。注:Solaris不支持。
sufficient:代表本模塊返回成功已經足以經過身份認證的要求,沒必要再執行同一stack內的其它模塊,可是 若是本模塊返回失敗的話能夠忽略。能夠認爲是一個充分條件。
optional:代表本模塊是可選的,它的成功與否通常不會對身份認證起關鍵做用,其返回值通常被忽略。
include,從字面就知道什麼意思了。包含另一個配置文件。
Module-path:
Debian的PAM module存放目錄默認是在/lib/security。在各個模塊的配置文件裏,不用寫絕對路徑,直接寫這個默認目錄下面的模塊名就能夠了。固然,也能夠寫絕對路徑。
Arguments:
各個模塊的參數都不同,具體的要開發者的man手冊。無效參數不會對結果有影響,可是會被日誌記錄 下來。首先,看看/lib/security有沒有這個模塊,再:man 模塊名
下面開始介紹cracklib模塊
pam_cracklib是一個PAM模塊,用來檢查密碼是否違反密碼字典,這個驗證模塊能夠經過插入password堆 棧,爲特殊的應用提供可插入式密碼強度性檢測。 它的工做方式就是先提示用戶輸入密碼,而後使用一個系統字典和一套規則來檢測輸入的密碼是否不能知足強壯性要求。密碼的強度檢測分二次進行,第一次只是檢測密 碼是不是提供的對比字典中的一部分,若是檢測結果是否認的,那麼就會提供一些附加的檢測來進一步檢測其強度,例如檢測新密碼中的字符佔舊密碼字符的比例,密碼的長度,所用字符大小寫情況,以及是否使用了特殊字符等等。(libpam-cracklib)
下面是cracklib模塊的一些參數:
debug:將debug信息寫入syslog
type=XXX:提示輸入密碼的文本內容。默認是"New UNIX password: " and "Retype UNIX password: ",可自定
retry=N:用戶最多能夠幾回輸入密碼後報錯。默認是1次。
difok=N:新密碼有幾個字符不能和舊密碼相同,默認是5個。另外若是新密碼有1/2的字符於舊不一樣,也會被接受。
diginore=N:默認當新密碼有23個字符時,difok選項會被忽略。
minlen=N:最小密碼長度。
dcredit=N:當N>=0時,N表明新密碼最多能夠有多少個阿拉伯數字。當N<0時,N表明新密碼最少要有多少個阿拉伯數字。
ucredit=N:和dcredit差很少,可是這裏說的是大寫字母。
lcredit=N:和dcredit差很少,可是這裏說的是小寫字母。
ocredit=N:和dcredit差很少,可是這裏說的是特殊字符。
use_authtok:在某個與密碼相關的驗證模塊後使用此選項,例如pam_unix.so驗證模塊
pam_cracklib 模塊式PAM配置接口的基本模塊,在Debian系統中配置文件是 /etc/pam.d/common-password 可是在Redhat系統中配置文件是 /etc/pam.d/system-auth 他的配置看起來像如下這樣:
password required pam_cracklib.so retry=3 minlen=6 difok=3
password required pam_unix.so md5 use_authtok
第一行是 pam_cracklib模塊和設置的幾個模塊參數
第二行是 pam_unix模塊,MD5表示採用MD5加密
pam_cracklib能夠記錄用戶使用的歷史密碼,而且不容許用戶重複使用舊的密碼,實際上存儲用戶舊密碼的是經過pam_unix模塊實現的。
第一步是創建一個空文件用來存儲舊密碼/etc/security/opasswd,若是你沒有創建文件卻使用了歷史密碼記錄功能的話,全部的密碼更新都會失敗,由於pam_unix模塊會報錯。
opasswd就像/etc/shadow文件,由於他記錄用戶密碼的哈希
touch /etc/security/opasswd
chown root:root /etc/security/opasswd
chmod 600 /etc/security/opasswd
一旦創建了opasswd文件,就能夠在pam_unix模塊後面加上參數remember=N來開始記錄舊密碼,remember參數記錄你想記錄多少舊密碼,他的最大值是400,若是你設置的值超過400會當作400來對待,例如:
password required pam_cracklib.so retry=3 minlen=12 difok=4
password required pam_unix.so md5 remember=12 use_authtok
opasswd文件內容格式以下:
hal:1000:<n>:<hash1>,<hash2>,...,<hashn>
以‘:’分割,第一列是用戶名,第二列是用戶ID,第三列是目前記錄了該用戶多少箇舊密碼,hashN是每次密碼的MD5值,opasswd在某些系統安裝PAM模塊時會自動創建。
密碼字典檢查
pam_cracklib 也能夠檢查用戶設置的密碼是否是違反系統內部的密碼字典,在Debian系統中pam_cracklib的密碼字典在/var/cache/cracklib目錄下,並且天天晚上update-cracklib腳本會自動的rebuild密碼字典。
/etc/login.defs 文件設置密碼過時時間等一系列參數,注意login.defs中設置的參數只有是用系統的useradd程序新建的一個用戶時纔會有login.defs中設置的屬性,若是是用其餘機器新建的用戶,則沒有以上屬性,不過能夠試用chage命令手動添加相關屬性。
chage參數以下:
-m 密碼可更改的最小天數。 爲零時表明任什麼時候候均可以更改密碼。
-M 密碼保持有效的最大天數。
-W 用戶密碼到期前,提早收到警告信息的天數。
-E 賬號到期的日期。過了這天,此賬號將不可用。
-d 上一次更改的日期
-i 停滯時期。若是一個密碼已過時這些天,那麼此賬號將不可用。
-l 例出當前的設置。由非特權用戶來肯定他們的密碼或賬號什麼時候過時。
在密碼管理方面one time password(OTP)也頗有效果,動態密碼管理,有興趣的同窗能夠研究一下。