Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學

Linux passwd 指令進階技巧:密碼策略、帳號鎖定、批量管理與審計

編輯:Linux 系統常見問題解答

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          從標準輸入讀取密碼(適合腳本)

狀態輸出解讀(passwd -S user)

user PS 2024-01-15 0 90 7 30
│   │  │         │ │  │ │
│   │  │         │ │  │ └─ 非活動期限
│   │  │         │ │  └──── 警告天數
│   │  │         │ └──────── 最大壽命
│   │  │         └────────── 最小間隔
│   │  └──────────────────── 最後修改日
│   └─────────────────────── 狀態:P=可用, L=鎖定, NP=無密碼
└──────────────────────────── 用戶名

密碼複雜度強制(PAM + libpwquality)

# 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"
}

sudo 免密授權 passwd(委派密碼重置權限)

# /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 狀態。

Copyright © Windows教程網 All Rights Reserved