如何在Linux系統中限制密碼長度的同時對密碼的復雜程度也進行管理,最近發現有人的密碼符合長度規則,但是卻很簡單很容易被猜出來,查了相關資料后發現了PAM中的pam_cracklib模塊就是用來做密碼復雜度檢測的。
先簡單的介紹一下PAM,PAM(Pluggable Authentication Modules )是由Sun提出的一種認證機制。它通過提供一些動態鏈接庫和一套統一的API,將系統提供的服務和該服務的認證方式分開,使得系統管理員可以靈活地根據需要給不同的服務配置不同的認證方式而無需更改服務程序,同時也便於向系統中添加新的認證手段。 PAM模塊是一種嵌入式模塊,修改后即時生效。
pam的重要文件如下:
/usr/lib/libpam.so.* ## PAM核心庫
/etc/pam.conf ## PAM配置文件
/etc/pam.d/* ## PAM各個模塊的配置文件
/lib/security/pam_*.so ## 可動態加載的PAM模塊
PAM配置文件的每一行的格式:Module-type Control-flag Module-path Arguments
模塊類型 控制字符 模塊路徑 模塊參數
Module-type:
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 例出當前的設置。由非特權用戶來確定他們的密碼或帳號何時過期。