前言:身份與存取控制的基石
Linux 多使用者、多任務架構的安全核心在於「誰能做什麼」。/etc/passwd、/etc/shadow、/etc/group、/etc/gshadow 四大檔案構成了帳號資訊的權威來源。本文將逐欄位拆解這四個檔案,揭示密碼策略、Shell 限制、群組巢狀等進階機制,並提供生產環境常用的管理指令與最佳實踐。
一、四大核心檔案架構總覽
| 檔案 | 用途 | 權限 | 關鍵特性 |
/etc/passwd | 使用者基本資訊 | 644 (root:root) | 全域可讀,UID/GID 映射 |
/etc/shadow | 加密密碼與策略 | 000 (root:root) | 僅 root 可讀,含過期/鎖定資訊 |
/etc/group | 群組定義與成員 | 644 (root:root) | 支援群組密碼(極少用) |
/etc/gshadow | 群組密碼與管理員 | 000 (root:root) | 群組管理員可代管成員 |
二、/etc/passwd:使用者身份證
user1:x:500:500::/home/user1:/bin/bash
| 欄位 | 說明 | 備註 |
| 1. 使用者名 | 登入識別碼,1-32 字元 | 建議小寫、無特殊符號 |
| 2. 密碼佔位 | x 表示密碼在 /etc/shadow | 若為空則無需密碼登入(極度危險) |
| 3. UID | 使用者識別碼 | 0=root,1-999 系統保留,1000+ 一般使用者 |
| 4. GID | 主要群組 ID | 對應 /etc/group 第 3 欄 |
| 5. GECOS/描述 | 全名、辦公室、電話等 | 逗號分隔,chfn 修改 |
| 6. 家目錄 | 登入後預設工作目錄 | 不存在時回退至 / |
| 7. 登入 Shell | 啟動的解釋器 | /bin/bash、/bin/sh、/sbin/nologin |
特殊 Shell:/sbin/nologin
- 將使用者 Shell 設為
/sbin/nologin 可禁止互動式登入
- 但仍可運行
sudo -u user cmd、su -s /bin/bash user、SFTP、Cron 任務
- 適用於服務帳號(如
www-data、mysql、nginx)
三、/etc/shadow:密碼金庫與策略引擎
user1:$6$2WJEp9K7$h.NRfJsaEm8VMksBQHZm7.:14668:0:99999:7:::
| 欄位 | 名稱 | 說明 |
| 1 | 使用者名 | 同 passwd |
| 2 | 加密密碼 | $id$salt$hash,id: 1=MD5, 5=SHA-256, 6=SHA-512, yescrypt |
| 3 | 最後修改日 | 自 1970-01-01 起的天數(date -d "1970-01-01 +14668 days") |
| 4 | 最小間隔 | 天數,0=隨時可改 |
| 5 | 最大壽命 | 天數,99999=永不過期 |
| 6 | 警告天數 | 到期前幾天開始警告 |
| 7 | 非活動期 | 過期後寬限天數,鎖定帳號 |
| 8 | 絕對過期日 | 自 1970 起天數,帳號完全失效 |
| 9 | 保留 | 未來擴展 |
密碼鎖定標記
! 或 !! 前綴:帳號被鎖定(passwd -l / usermod -L)
*:無有效密碼(系統帳號常見)
- 解鎖:
passwd -u user 或編輯移除前綴
四、/etc/group 與 /etc/gshadow:群組協作模型
# /etc/group
developers:x:1001:alice,bob,charlie
# /etc/gshadow
developers:!::alice,bob
| 欄位 | group | gshadow |
| 1 | 群組名 | 群組名 |
| 2 | 密碼佔位 (x/!) | 群組密碼雜湊(極少用) |
| 3 | GID | 群組管理員清單(逗號分隔) |
| 4 | 成員清單 | 群組成員清單(同 group 第 4 欄) |
群組管理員 可執行 gpasswd -a user group 新增成員,無需 root 權限。
五、實戰管理指令速查表
| 任務 | 指令範例 | 影響檔案 |
| 新增使用者(含家目錄、Shell) | useradd -m -s /bin/bash -G docker,developers alice | passwd, shadow, group, gshadow |
| 設定密碼 | passwd alice / echo "Passw0rd" | passwd --stdin alice | shadow |
| 修改 UID/GID(需停止該使用者所有進程) | usermod -u 2000 -g 2000 alice | passwd, group |
| 鎖定/解鎖帳號 | usermod -L alice / usermod -U alice | shadow |
| 設定密碼過期策略 | chage -M 90 -W 7 -I 30 alice | shadow |
| 新增群組 | groupadd -g 2001 devops | group, gshadow |
| 管理群組成員 | gpasswd -a alice devops / gpasswd -d bob devops | group, gshadow |
| 設定群組管理員 | gpasswd -A alice,charlie devops | gshadow |
| 驗證使用者完整資訊 | id alice / getent passwd alice / chage -l alice | - |
六、進階主題:權限邊界與審計
6.1 ACL 存取控制清單
# 給特定使用者單獨權限
setfacl -m u:alice:rwx /project/secret
getfacl /project/secret
6.2 Sudo 權限最小化原則
# /etc/sudoers.d/alice
alice ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx, /usr/bin/docker ps
6.3 審計關鍵檔案變更
auditctl -w /etc/passwd -p wa -k identity_change
auditctl -w /etc/shadow -p wa -k identity_change
ausearch -k identity_change
七、常見錯誤與避坑指南
❌ 直接用 vim 編輯 /etc/passwd:易導致格式錯誤、UID 衝突、Shell 路徑不存在
✅ 使用 useradd/usermod/vipw:vipw 會鎖定檔案並語法檢查
❌ 刪除使用者未清理家目錄與排程:userdel alice 預設保留家目錄
✅ 完整清理:userdel -r alice 並檢查 crontab -u alice -l、atq -u alice
❌ 系統帳號設定弱密碼或解鎖:mysql、nginx 等服務帳號應保持 /sbin/nologin + 鎖定狀態
✅ 定期掃描:awk -F: '($2 != "x" && $2 != "*" && $2 != "!" && $2 != "!!") {print $1}' /etc/shadow
使用者與群組管理看似基礎,實則是安全合規的第一道防線。掌握四大檔案結構、善用標準管理工具、落實最小權限與審計追蹤,才能在審計師敲門時從容應對,更能在日常運維中避免「誤刪 root」「密碼永不過期」等低級災難。