用戶與組管理是 Linux 系統安全的基石。本文系統梳理用戶分類、核心配置文件解析、創建/修改/刪除/鎖定全生命周期操作、組管理細節,並提供生產環境常用最佳實踐與自動化腳本模板。
| 類別 | 用途 | UID 範圍 | 登錄權限 | 典型示例 |
|---|---|---|---|---|
| 超級用戶 | 系統完全控制 | 0 | 是 | root |
| 系統用戶/偽用戶 | 運行服務進程、擁有文件 | 1~999 (CentOS 7+) 1~499 (舊版) | 否 | nginx, mysql, www-data |
| 普通用戶 | 人工登錄、業務操作 | >=1000 (現代) >=500 (舊版) | 是 | dev, admin, deploy |
用戶名:密碼佔位符(x):UID:GID:描述信息:家目錄:登錄Shell
lee:x:1001:1001:Lee Admin:/home/lee:/bin/bash
字段說明:
x 表示真實哈希存放在 /etc/shadow/etc/group 中定義/sbin/nologin 或 /bin/false 可禁止登錄用戶名:加密哈希:最後修改天數(1970起):最小間隔:最大間隔:警告天數:非活動天數:過期天數:保留
lee:$6$...:19500:0:99999:7:::
# 0=可隨時改密碼, 99999=永不過期, 7=過期前7天警告
組名:組密碼(x):GID:附屬用戶列表(逗號分隔)
admin:x:1001:lee,devops
useradd / adduser# 標準創建:建家目錄、指定Shell、加入附屬組
useradd -m -s /bin/bash -G docker,sudo -c "DevOps Engineer" devops
# 系統服務賬號:無家目錄、UID<1000、禁止登錄
useradd -r -s /sbin/nologin -M -c "Nginx Service" nginx
# 參數速查
# -m 建家目錄 (默認複製 /etc/skel)
# -M 不建家目錄
# -d 指定家目錄路徑
# -s 指定登錄Shell
# -g 指定主組(GID或名稱)
# -G 指定附屬組(逗號分隔)
# -u 指定UID(需唯一)
# -e 過期日期 YYYY-MM-DD
# -f 密碼過期後寬限天數
# -r 創建系統賬號
passwdpasswd devops # 交互式設置
echo "password" | passwd --stdin devops # 腳本化(需 root)
usermodusermod -L devops # 鎖定賬號 (在 /etc/shadow 密碼前加 !)
usermod -U devops # 解鎖賬號
usermod -aG docker devops # 追加附屬組 (-a 必須,否則覆蓋)
usermod -d /newhome -m devops # 遷移家目錄
usermod -s /bin/zsh devops # 修改Shell
usermod -l newname devops # 重命名用戶 (需用戶未登錄)
userdeluserdel devops # 僅刪除賬號,保留家目錄
userdel -r devops # 連同家目錄、郵箱一併刪除
userdel -f devops # 強制刪除(即使用戶在線)
id devops # UID/GID/組列表
finger devops # 詳細信息(需安裝 finger)
getent passwd devops # 查詢 NSS 數據源(含 LDAP/SSSD)
groupadd docker # 創建組
groupadd -g 999 docker # 指定 GID
groupmod -n containerd docker # 重命名組
groupdel docker # 刪除組(需無用戶以此為主組)
gpasswd -a devops docker # 加入組
gpasswd -d devops docker # 移出組
gpasswd -A devops docker # 設為組管理員
PermitRootLogin no (sshd_config)/etc/security/pwquality.conf 或 PAM pam_pwquality.soawk -F: '$3==0 {print $1}' /etc/passwd 檢查 UID=0 賬號lastlog -b 90 找出 90 天未登錄用戶nologin、無家目錄、專用 UID/GID#!/bin/bash
# batch-create-users.sh
# CSV 格式: username,uid,gid,groups,shell,comment
INPUT_FILE="users.csv"
while IFS=',' read -r user uid gid groups shell comment; do
[[ "$user" == "username" ]] && continue # 跳過表頭
if id "$user" &>/dev/null; then
echo "User $user exists, skipping"
continue
fi
groupadd -g "$gid" "$user" 2>/dev/null || true
useradd -u "$uid" -g "$gid" -G "$groups" -s "$shell" -c "$comment" -m "$user"
echo "$user:Ch@ngeMe123" | chpasswd
chage -d 0 "$user" # 首次登錄強制改密
echo "Created: $user ($uid:$gid)"
done < "$INPUT_FILE"
核心原則: 用戶管理自動化、審計化、最小權限化。手工操作只用於緊急處理,日常讓腳本和配置管理工具來做。