我們在使用linux系統設置密碼的時候,經常遇到這樣的問題,系統提示:您的密碼太簡單,或者您的密碼是字典的一部分。那么系統是如何實現對用戶的密碼的復雜度的檢查的呢?
系統對密碼的控制是有兩部分(我知道的)組成:
1 cracklib
2 login.defs
聲明:login.defs主要是控制密碼的有效期。對密碼進行時間管理。此處不細談。
login.defs --shadow password suite configuration
pam_cracklib.so 才是控制密碼復雜度的關鍵文件。
redhat公司專門開發了cracklib這個安裝包來判斷密碼的復雜度。
可以rpm -ql cracklib查看。
密碼的復雜度的判斷是通過pam模塊控制來實現的,具體的模塊是pam_cracklibpam_cracklib 的參數介紹:
debug
該選項使用模塊將信息寫入到日志(3)來指示組件的行為(這個選項不會記錄密碼信息到日志文件)。
type=XXX
默認的操作是為模塊,當請求密碼時,該模塊默認操作是使用以下提示:“新的UNIX密碼:”和“重新輸入密碼UNIX”。此選項就是替換默認單詞的UNIX。
retry=N
提示用戶最多N次會返回錯誤。默認值是1
difok=N
此參數會改變默認新密碼中必須有5個字符不同於舊密碼中字符,此外,如果新密碼中有一半字符不同於舊密碼,那么就可以使用新密碼。
difignore=N
密碼在少於多少個字符時,difok將被忽略,默認是23。
minlen=N
新密碼可接受的最小長度。
dcredit=N
(N < 0) 新密碼最小數字長度。
ucredit=N
(N < 0) 新密碼最小大寫字母長度。
lcredit=N
(N < 0) 新密碼最小小寫字母長度。
ocredit=N
(N < 0) 新密碼最小其他字符長度。
N>0表示密碼最大的位數,一般均設置為N<0 表示密碼最少的位數
use_authtok
此參數用於強制不提示用戶輸入新的密碼而由以前堆積的密碼模塊所提供。
dictpath=/path/to/dict
Path to the cracklib dictionaries.
dictpath=/path/to/dict //注:密碼字典,這個是驗證用戶的密碼是否是字典一部分的關鍵。
Path to the cracklib dictionaries.
例子:
在linux下設置密碼復雜度辦法:
(1)修改/etc/login.defs文件
PASS_MAX_DAYS 90 #密碼最長過期天數
PASS_MIN_DAYS 80 #密碼最小過期天數
PASS_MIN_LEN 10 #密碼最小長度
PASS_WARN_AGE 7 #密碼過期警告天數
(2)修改/etc/pam.d/system-auth文件
找到 password requisite pam_cracklib.so這么一行替換成如下:
password requisite pam_cracklib.so retry=5 difok=3 minlen=10 ucredit=-1 lcredit=-3 dcredit=-3 dictpath=/usr/share/cracklib/pw_dict
參數含義:
嘗試次數:5 最少不同字符:3 最小密碼長度:10 最少大寫字母:1 最少小寫字母:3 最少數字:3 密碼字典:/usr/share/cracklib/pw_dict
注意:以上設置對root用戶無效。修改后你可能會立即測試,會發現以上設置無效。你可以新建賬戶,並進入該賬戶。
useradd test
passwd test
su - test
此時你發現設置起作用了。