剛剛看到 google 提示今天是世界密碼日,當下決定來發篇跟密碼相關的網誌。所以翻出之前在搞伺服器時留下來的筆記,筆記內容 IT 也貢獻了不少,不過內容雜亂無序,希望最後整理完的時候今天還沒有過 XD
這篇要做事情有二:
- 設定密碼複雜度
- 強迫使用者登入更換密碼
世界密碼日(圖片來源: 今日頭條)
設定密碼複雜度
你知道每年五月的第一個星期四是世界密碼日嗎?很好,我也不知道,直到今天才知道 XD 反正這個節日就是提醒你關心下自己的密碼是否安全。
根據 Microsoft 的密碼原則建議可以朝兩個方向強化密碼強度:
-
密碼複雜度:
設定密碼規則,組成應包含大寫、小寫、數字、特殊符號跟最小長度。像我們公司 AD 帳號就密碼長度至少 15 字元以上,且要求至少包含數字、大寫、小寫、特殊符號。WTF…密碼越來越長了啦…。 -
更換密碼天數:
設定幾天後強制使用者換密碼,如 90 天一換。
Step1、安裝套件
在 Ubuntu 中密碼強度檢查的功能,是透過 libpam-pwquality 這個套件來強制設定密碼的最低複雜度,以避免弱密碼的出現。所以一開始需先安裝該套件:
1 | |
Step2、設定密碼複雜度
安裝完後,編輯 /etc/pam.d/common-password 設定檔來設定密碼複雜度
1 | |
找到以下這一行 pam_pwquality.so 的設定值:
1 | |
我這邊直接把它改成:
1 | |
其中:
-
retry=3
代表輸入密碼時最多嘗試次數,當密碼輸入超過3次就會產生錯誤。 -
minlen=15
設定最短的密碼長度為15。 -
maxrepeat=3
密碼中相同的字元最多只能連續出現3個,若超過則密碼就會被拒用,例如:maxrepeat=3,表示不接受pwwwwd為密碼。如果設為0,則不檢查。 -
difok=4
新密碼中必須有4個字元要與舊密碼不同。若設定為0則不檢查,只要新舊密碼不要完全一樣即可。 ucredit=-1、lcredit=-1、dcredit=-1、ocredit=-1
這邊就是密碼複雜度的主要控制部分。嚴格來說,前面的minlen並不完全是密碼最小長度,而是密碼最少應得貢獻值。貢獻值的計算是每個字元得1分,其中若字元為特定類別,會有額外貢獻,但這些貢獻會有上限的,舉例來說:-
ucredit=3、lcredit=2、dcredit=1、ocredit=0
ucredit、lcredit、dcredit、ocredit 分別對應到大寫、小寫、數字、特殊符號四個類別,其值則為其類別貢獻值上限。舉例來說,一密碼為
$$$$$Pwd012,其長度為11,其中包含1個大寫、2個小寫、3個數字、4個特殊符號,但因數字貢獻值上限為1,特殊符號不計算貢獻值,因此最終貢獻值為 $11+1+2+1+0=15$。因最終貢獻值等於最低貢獻值15,故雖長度不及15,但仍是符合所設定的複雜度。 -
ucredit=0、lcredit=0、dcredit=0、ocredit=0
這個例子就是所有類別都不算額外貢獻,直接看密碼長度。 -
ucredit=-1、lcredit=-1、dcredit=-1、ocredit=-1
如果覺得計算貢獻值太複雜,則可以用負數直接指定該類別所想要的數量。以這個例子來說,就是密碼中必須包含大寫、小寫、數字、特殊符號各一個字元。
-
-
reject_username
拒絕包含正、反向的 username。 enforce_for_root
設定 root 管理者亦需遵守密碼規定。說實話管理者往往是最不遵守密碼規定的 XD
Step3、禁止使用過往密碼
另一個討厭常見的功能是禁止使用過往用過密碼,這功能一樣透過編輯 /etc/pam.d/common-password ,找到以下這一行 pam_unix.so 的設定值:
1 | |
在尾端加上 remember=3,表不與前三次密碼相同:
1 | |
設定更換密碼天數
強化密碼強度的另一個方向則是設定密碼有效期限,迫使使用者定期更新密碼。
Step1、設定密碼有效期限
可透過編輯 /etc/login.defs 設定密碼有效期限:
1 | |
其中
PASS_MAX_DAYS:密碼效期,以天計算。PASS_MIN_DAYS:兩次密碼更換至少間隔天數。PASS_MIN_LEN:密碼最小長度。PASS_WARN_AGE:密碼到期前幾天通知使用者。
若時間的變動超過 PASS_MAX_DAYS,則登入時會要求使用者更新密碼並遵循新的密碼規則。但必須注意的是,這裡設定只會套用在之後新建的帳號。若要修改使現有使用者,需另外使用 chage 指令來進行變更。
Step2、設定現有使用者密碼有效期限
剛剛的設定只會套用在新使用者身上,但對於現有使用者於要額外指令變更:
1 | |
安裝完後,使用指令來更新天數設定:
1 | |
強迫使用者登入更換密碼
常見情境是我們生成亂數密碼給使用者,然後請使用者第一次登入時修改密碼,或是當我更新密碼複雜度時,請舊有使用者改密碼遵循新的密碼規則。這功能可以用剛剛的 chage 來達成:
1 | |
這樣會直接把它的到期日期設定成 1970/01/01,強迫它過期。
參考資料
- (2022/03/08)。密碼原則建議。檢自 Microsoft Docs (2022-05-05)。
- 只說區塊鏈 (2020-05-13)。世界密碼日,零極為網絡安全保駕護航!。檢自 今日頭條 (2022-05-05)。
- Chia-An Lee (2021-08-14)。Linux 上密碼相關設定。檢自 Chia-An Lee (2022-05-05)。
- James Kiarie(2020-08-12)。How to Enforce Password Policies in Linux (Ubuntu / CentOS)。檢自 LinuxTechi (2019-01-04)。
- Linux 強制密碼最低複雜度 pam_pwquality 設定教學與範例。檢自 Office 指南 (2022-05-05)。
- admin 。UNIX / Linux : how to force user to change their password on next login after password has reset。檢自 The Geek Diary (2022-05-05)。
- LinuxSysAdmin (2016-02-25)。Linux Password policy – /etc/login.defs No change for existing users。檢自 Linux SysAdmin (2022-05-05)。
- Sk (2016-03-01)。How To Set Password Policies In Linux。檢自 OSTechNix (2022-05-05)。
- Sk (2019-05-09)。如何設定 Linux 系統的密碼策略。檢自 IT人 (2022-05-05)。
- osc_v1ao43h5 (2020-12-16)。Linux 系統密碼策略設定。檢自 MdEditor (2022-05-05)。
- chage(1): change user password expiry info。檢自 Linux man page (2022-05-05)。
更新紀錄
最後更新日期:2022-05-06
- 2022-05-06 發布
- 2022-05-05 完稿
- 2022-05-05 起稿