passwd 與 chage:密碼策略管理 文章首圖

passwd 與 chage:密碼策略管理

passwd 與 chage:密碼策略管理

在 Linux 系統管理中,帳號安全是重中之重。許多管理員往往只關注防火牆或 SELinux 配置,卻忽略了最基礎的「密碼策略」。當系統遭遇暴力破解或內部帳號洩漏時,良好的密碼生命周期管理能有效降低風險。在 Debian 與 Ubuntu 系列發行版中,我們主要透過 passwdchage 這兩個指令來掌控密碼的複雜度、過期時間與使用狀態。這篇文章將深入解析這兩個指令的實戰用法,幫助你建立更嚴謹的帳號安全機制。

使用 passwd 設定密碼基礎規則

passwd 指令最直觀的功能是設定或修改使用者密碼,但對於系統管理員而言,它更強大的地方在於透過選項強制實施密碼政策。

設定密碼最小長度與複雜度

預設情況下,Linux 允許使用者設定極簡單的密碼(例如僅有數字或重複字元)。你可以透過 passwd-n-x-w 參數來控制密碼的生存週期。

以下範例將使用者 alice 的密碼設定為:最小長度 8 碼,最大有效期間 90 天,過期前 7 天開始警告。

sudo passwd -n 8 -x 90 -w 7 alice

執行後,系統通常不會立即顯示成功訊息,而是靜默處理。若要驗證設定是否生效,請查看 /etc/shadow 檔案中對應的欄位,或使用 passwd -S alice 查看狀態。

鎖定與解鎖帳號

當發現異常登入行為或員工離職時,快速凍結帳號是標準程序。使用 -l (lock) 參數會在密碼雜湊值前加上 !,導致密碼驗證失敗;使用 -u (unlock) 則可解除鎖定。

# 鎖定帳號
sudo passwd -l bob

# 解鎖帳號
sudo passwd -u bob

值得注意的是,鎖定帳號僅限於密碼驗證。如果該帳號支援 SSH 金鑰登入,依然可以透過金鑰進入系統。因此,對於高階安全需求,建議結合 usermod -s /usr/sbin/nologin 來徹底禁止登入。

使用 chage 精細管理密碼過期

雖然 passwd 可以設定部分策略,但 chage (change age) 才是專門用於管理密碼過期時間的利器。它提供的選項更為直觀,特別適合自動化腳本或批次管理。

設定密碼過期時間

chage 提供了多個時間相關的參數,讓我們能精確控制密碼的生命週期:

  • -M:密碼的最大有效天數。
  • -m:密碼的最小修改間隔天數(防止使用者反覆更換密碼以避開舊密碼限制)。
  • -W:過期前的警告天數。
  • -E:帳號過期的絕對日期(格式為 YYYY-MM-DD)。

假設我們要強制使用者 charlie 每 60 天更換一次密碼,且在過期前 14 天開始警告,同時設定帳號在 2024 年 12 月 31 日失效:

sudo chage -M 60 -m 7 -W 14 -E 2024-12-31 charlie

檢查與強制立即修改

設定完策略後,管理員通常需要確認哪些帳號違反了政策,或強制使用者在下一次登入時修改密碼。

使用 -l 參數可以列出帳號的詳細過期資訊:

$ chage -l charlie
Last password change                    : Nov 15, 2023
Password expires                    : Jan 14, 2024
Password inactive                   : Jan 14, 2024
Account expires                     : Dec 31, 2024
Minimum number of days between password change      : 7
Maximum number of days between password change      : 60
Number of days of warning before password expires   : 14

若希望使用者在下一次登入時必須立即更改密碼,可以使用 -d 0 將「最後修改日期」設為 0。這會觸發系統強制使用者在登入時重置密碼:

sudo chage -d 0 charlie

常見問題與解決方案

Q1: 為什麼我執行了 chage 設定,但使用者依然可以登入且沒有被強制改密碼?

這通常是因為 chage 僅修改了 /etc/shadow 中的時間戳記,但使用者目前的密碼雜湊欄位並未標記為「已過期」。系統判斷是否強制改密碼的邏輯是:如果 last_change_date 小於 max_days 對應的日期,則強制修改。

若設定後無效,請手動觸發一次密碼變更來同步狀態,或直接檢查 /etc/shadow 中對應使用者的欄位是否正確更新。此外,確保 /etc/login.defs 中的 PASS_MAX_DAYS 等全域設定未覆蓋個別帳號設定(個別帳號設定優先級較高,但需注意衝突)。

Q2: 如何批量檢查所有帳號的密碼過期狀態?

對於擁有大量帳號的伺服器,手動檢查是不切實際的。你可以結合 awkchage 來篩選出即將過期或已過期的帳號。以下指令會列出所有帳號名稱及其密碼過期日期:

for user in $(cut -d: -f1 /etc/passwd); do
    expire_date=$(chage -l $user | grep "Password expires" | cut -d: -f2 | xargs)
    echo "$user: $expire_date"
done

這段腳本能幫助你快速建立密碼過期清單,便於後續的稽核工作。

小結

passwdchage 是 Linux 系統安全防護的第一道防線。透過合理的密碼複雜度設定與過期策略,我們可以大幅降低帳號被暴力破解或長期閒置帶來的安全風險。建議管理員定期檢視 /etc/shadowchage 的設定,並結合全域策略 /etc/login.defs 來建立一致且嚴格的密碼管理規範。記住,安全不是一次性的設定,而是持續的監控與調整。