passwd 不只是改密碼,更是帳號生命週期管理的核心工具。本文系統整理密碼複雜度強制、過期策略、鎖定/解鎖、批量初始化、sudo 免密授權與審計日誌分析。
passwd [選項] [用戶名] # root 可操作任意用戶,普通用戶只能改自己
# 關鍵選項
-d, --delete 刪除密碼(帳號無密碼,極度危險)
-l, --lock 鎖定帳號(在 /etc/shadow 第 2 欄前加 !)
-u, --unlock 解鎖帳號
-e, --expire 強制下次登入必改密碼
-n, --minimum 最小使用天數(0=可隨時改)
-x, --maximum 最大壽命天數(99999=永久)
-w, --warning 過期前警告天數
-i, --inactive 過期後幾天鎖定帳號
-S, --status 顯示狀態(僅 root)
--stdin 從標準輸入讀取密碼(適合腳本)
user PS 2024-01-15 0 90 7 30
│ │ │ │ │ │ │
│ │ │ │ │ │ └─ 非活動期限
│ │ │ │ │ └──── 警告天數
│ │ │ │ └──────── 最大壽命
│ │ │ └────────── 最小間隔
│ │ └──────────────────── 最後修改日
│ └─────────────────────── 狀態:P=可用, L=鎖定, NP=無密碼
└──────────────────────────── 用戶名
# 1. 安裝
yum install -y libpwquality pam_pwquality
# 2. 修改 /etc/security/pwquality.conf
minlen = 12
dcredit = -1 # 至少 1 個數字
ucredit = -1 # 至少 1 個大寫
lcredit = -1 # 至少 1 個小寫
ocredit = -1 # 至少 1 個特殊字元
minclass = 3 # 至少 3 類字元
maxrepeat = 3 # 同字元最多連續 3 次
maxsequence = 3 # 序列長度限制
dictcheck = 1 # 禁止字典詞
# 3. 確認 PAM 引用
grep pam_pwquality.so /etc/pam.d/system-auth
# password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
# password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok remember=5
#!/bin/bash
# batch_passwd.sh — 從 CSV 讀取 user,password
# 格式:user,password
INPUT="users.csv"
while IFS=, read -r user pass; do
if id "$user" &>/dev/null; then
echo "$user:$pass" | chpasswd
passwd -e "$user" # 強制首次登入改密
echo "[$(date)] $user password reset, forced change on next login"
else
echo "[$(date)] WARN: user $user not exist"
fi
done < "$INPUT"
# 鎖定並備份 SSH 金鑰
lock_user() {
local user=$1
passwd -l "$user"
usermod -s /sbin/nologin "$user"
[ -d "/home/$user/.ssh" ] && mv "/home/$user/.ssh" "/home/$user/.ssh.locked.$(date +%s)"
logger "ACCOUNT LOCKED: $user"
}
# 解鎖並恢復
unlock_user() {
local user=$1
passwd -u "$user"
usermod -s /bin/bash "$user"
logger "ACCOUNT UNLOCKED: $user"
}
# /etc/sudoers.d/helpdesk
%helpdesk ALL=(root) /usr/bin/passwd [a-z]*, !/usr/bin/passwd root
# helpdesk 群組可重置任意普通用戶密碼,但不可動 root
# 1. 找出無密碼/密碼過期/鎖定帳號
awk -F: '($2=="!!" || $2=="*" || $2=="") {print "NO PASS/LOCKED:", $1}' /etc/shadow
awk -F: '($8 > 0 && $8 < systime()) {print "EXPIRED:", $1}' /etc/shadow # 需轉換日期
# 2. 密碼修改歷史(需啟用 pam_unix.so remember=5)
grep "password changed" /var/log/secure | tail -20
# 3. 失敗嘗試統計
grep "Failed password" /var/log/secure | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head -10
| 坑 | 後果 | 修正 |
|---|---|---|
passwd -d user 刪除密碼 | 帳號無密碼可登入,極度危險 | 嚴禁使用,改用 passwd -l 鎖定 |
腳本用 echo "pass" | passwd --stdin user | 密碼殘留在歷史指令/進程表 | 用 chpasswd 或 openssl passwd -6 產生雜湊後 usermod -p |
未設 remember=5 | 用戶循環使用舊密碼 | PAM 加入 remember=5 |
| root 密碼未定期輪換 | 單點失效風險 | 納入密碼管理系統,90 天輪換 |
結語: passwd 是帳號安全的「大門鎖」。配合 PAM 複雜度、chage 策略、sudoers 委派、日誌審計,才能構建完整的身份存取治理閉環。下次幫同事改密碼,順手 passwd -e 強制他換新密碼,順便檢查一下 passwd -S 狀態。