字数 3474,阅读大约需 18 分钟
用户管理基础
用户文件详解
# 查看用户信息文件
cat /etc/passwd
# 查看用户密码文件(需要 root)
sudo cat /etc/shadow
# 查看用户组信息
cat /etc/group
# 查看组密码文件(需要 root)
sudo cat /etc/gshadow
/etc/passwd 文件格式
root:x:0:0:root:/root:/bin/bash
longge:x:1000:1000:Long Ge,,,:/home/longge:/bin/bash
nginx:x:991:991:Nginx web server:/var/cache/nginx:/sbin/nologin
字段说明(冒号分隔):
- 2. 密码占位符(x 表示在 /etc/shadow 中)
UID 范围
创建用户
# 基本创建(自动创建主目录)
sudo useradd -m newuser
# 指定 UID
sudo useradd -m -u 1500 newuser
# 指定主组
sudo useradd -m -g users newuser
# 指定附加组
sudo useradd -m -G wheel,developers newuser
# 指定 Shell
sudo useradd -m -s /bin/zsh newuser
# 指定注释
sudo useradd -m -c "Web Developer" newuser
# 创建系统用户(无主目录,不能登录)
sudo useradd -r -s /sbin/nologin myservice
# 创建时设置密码
sudo useradd -m newuser
sudo passwd newuser
# 一条命令完成(设置加密密码)
sudo useradd -m -p $(openssl passwd -1 'password123') newuser
修改用户
# 修改用户名
sudo usermod -l newname oldname
# 修改用户主目录
sudo usermod -d /new/home newuser
# 移动主目录内容
sudo usermod -d /new/home -m newuser
# 修改 Shell
sudo usermod -s /bin/bash newuser
# 添加到附加组
sudo usermod -aG wheel newuser
# 替换附加组(慎用)
sudo usermod -G wheel newuser
# 锁定用户(禁止登录)
sudo usermod -L newuser
# 解锁用户
sudo usermod -U newuser
# 设置密码过期天数
sudo chage -M 90 newuser
# 查看密码过期信息
sudo chage -l newuser
删除用户
# 删除用户(保留主目录)
sudo userdel newuser
# 删除用户及主目录
sudo userdel -r newuser
# 强制删除(即使用户已登录)
sudo userdel -f newuser
# 删除前备份主目录
tar -czvf /backup/newuser-home.tar.gz /home/newuser
sudo userdel -r newuser
查看用户信息
# 查看当前用户
whoami
# 查看用户详细信息
id newuser
# 查看用户所属组
groups newuser
# 查看用户登录历史
last newuser
# 查看用户登录时间
lastlog | grep newuser
# 查看用户进程
ps -u newuser
# 查看用户磁盘使用
du -sh /home/newuser
组管理基础
组文件详解
# 查看组信息
cat /etc/group
# 查看组密码(需要 root)
sudo cat /etc/gshadow
/etc/group 文件格式
wheel:x:10:longge,admin
developers:x:1001:dev1,dev2,dev3
nginx:x:991:
字段说明(冒号分隔):
创建组
# 基本创建
sudo groupadd developers
# 指定 GID
sudo groupadd -g 2000 developers
# 创建系统组
sudo groupadd -r myservice
# 创建时设置密码(很少用)
sudo groupadd -p $(openssl passwd -1 'grouppass') mygroup
修改组
# 修改组名
sudo groupmod -n newname oldname
# 修改 GID
sudo groupmod -g 2500 developers
删除组
# 删除空组
sudo groupdel developers
# 删除非空组(先移除成员)
sudo gpasswd -M "" developers
sudo groupdel developers
组成员管理
# 添加用户到组
sudo usermod -aG developers newuser
# 从组中移除用户
sudo gpasswd -d newuser developers
# 设置组成员列表(替换)
sudo gpasswd -M user1,user2,user3 developers
# 添加组管理员
sudo gpasswd -A adminuser developers
# 查看组成员
getent group developers
# 查看用户所属的所有组
groups newuser
# 或
id -nG newuser
用户批量管理
批量创建用户
# 方法 1:循环创建
for user in alice bob charlie; do
sudo useradd -m -G developers "$user"
echo "$user:TempPass123" | sudo chpasswd
done
# 方法 2:从文件读取
# users.txt 格式:username:password:fullname
while IFS=: read -r username password fullname; do
sudo useradd -m -c "$fullname" "$username"
echo "$username:$password" | sudo chpasswd
done < users.txt
# 方法 3:使用 newusers(批量导入)
# 准备批量文件 batch.txt
cat > batch.txt << EOF
alice:password1:1001:1001:Alice Developer:/home/alice:/bin/bash
bob:password2:1002:1001:Bob Developer:/home/bob:/bin/bash
charlie:password3:1003:1001:Charlie Developer:/home/charlie:/bin/bash
EOF
# 执行批量创建
sudo newusers batch.txt
批量修改用户
# 批量添加到组
for user in alice bob charlie; do
sudo usermod -aG developers "$user"
done
# 批量设置密码过期
for user in alice bob charlie; do
sudo chage -M 90 "$user"
done
# 批量锁定用户
for user in alice bob charlie; do
sudo usermod -L "$user"
done
# 批量解锁用户
for user in alice bob charlie; do
sudo usermod -U "$user"
done
批量删除用户
# 批量删除(保留主目录)
for user in alice bob charlie; do
sudo userdel "$user"
done
# 批量删除(包括主目录)
for user in alice bob charlie; do
sudo userdel -r "$user"
done
# 删除用户前备份主目录
for user in alice bob charlie; do
sudo tar -czvf /backup/${user}-home.tar.gz /home/$user
sudo userdel -r "$user"
done
用户导入导出
# 导出用户列表
cut -d: -f1 /etc/passwd > users-backup.txt
# 导出特定组的用户
getent group developers | cut -d: -f4 > developers.txt
# 导出用户详细信息
for user in $(cut -d: -f1 /etc/passwd); do
id "$user" >> users-info.txt
done
sudo 权限配置
sudo 配置文件
# 编辑 sudo 配置(推荐方式)
sudo visudo
# 检查语法
sudo visudo -c
配置示例
# /etc/sudoers 配置片段
# 允许 wheel 组所有命令
%wheel ALL=(ALL) ALL
# 允许特定用户所有命令
longge ALL=(ALL) ALL
# 允许无需密码执行(危险!)
longge ALL=(ALL) NOPASSWD: ALL
# 允许执行特定命令
%developers ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx
%developers ALL=(ALL) NOPASSWD: /usr/bin/docker *
# 拒绝特定命令
%developers ALL=(ALL) ALL, !/usr/bin/passwd
命令别名
Cmnd_Alias WEB_CMDS = /usr/bin/systemctl restart nginx, /usr/bin/systemctl reload nginx
Cmnd_Alias DOCKER_CMDS = /usr/bin/docker *
%webteam ALL=(ALL) WEB_CMDS
%devops ALL=(ALL) DOCKER_CMDS
sudo 日志
# 启用 sudo 日志(/etc/sudoers)
Defaults logfile="/var/log/sudo.log"
# 查看日志
sudo cat /var/log/sudo.log
sudo grep "longge" /var/log/sudo.log
用户环境配置
用户配置文件
# 系统级配置(所有用户)
/etc/profile # 登录 Shell
/etc/bashrc # 非登录 Bash
/etc/environment # 环境变量
# 用户级配置
~/.bash_profile # 登录 Shell
~/.bashrc # 非登录 Bash
~/.profile # 通用配置
~/.bash_logout # 退出时执行
环境变量管理
# 查看所有环境变量
env
# 或
printenv
# 查看特定变量
echo $HOME
echo $PATH
# 临时设置变量
export MY_VAR=value
# 永久设置(~/.bashrc)
echo 'export MY_VAR=value' >> ~/.bashrc
source ~/.bashrc
# 添加到 PATH
export PATH=$PATH:/usr/local/bin
用户默认配置
# 新用户默认文件(模板)
ls -la /etc/skel/
# 自定义默认配置
sudo cp ~/.bashrc /etc/skel/
sudo cp ~/.vimrc /etc/skel/
# 修改默认 Shell
sudo usermod -s /bin/zsh newuser
# 修改默认主目录位置
# 编辑 /etc/default/useradd
# HOME=/home 改为 HOME=/data/users
资源限制(ulimit)
# 查看当前限制
ulimit -a
# 查看文件描述符限制
ulimit -n
# 临时修改
ulimit -n 65535
# 永久修改(/etc/security/limits.conf)
cat >> /etc/security/limits.conf << EOF
longge soft nofile 65535
longge hard nofile 65535
%developers soft nofile 32768
%developers hard nofile 65535
EOF
安全最佳实践
密码策略
# 设置密码复杂度(/etc/pam.d/system-auth 或 /etc/pam.d/common-password)
# 至少 8 位,包含大小写、数字、特殊字符
password requisite pam_pwquality.so retry=3 minlen=8 dcredit=-1 ucredit=-1 ocredit=-1 lcredit=-1
# 设置密码历史(记住最近 5 次)
password remember=5 pam_pwhistory.so
# 设置密码过期策略
sudo chage -m 7 -M 90 -W 14 newuser
# -m: 最小修改间隔(天)
# -M: 最大有效期(天)
# -W: 提前警告天数
账户安全
# 锁定长期不用的账户
sudo usermod -L olduser
# 设置账户过期日期
sudo usermod -e 2026-12-31 tempuser
# 删除不需要的账户
sudo userdel -r games
sudo userdel -r ftp
# 禁用 root 远程登录(/etc/ssh/sshd_config)
PermitRootLogin no
# 禁止空密码用户登录
# /etc/pam.d/common-auth
auth required pam_unix.so nullok_secure
最小权限原则
# ❌ 错误:给所有权限
%developers ALL=(ALL) ALL
# ✅ 正确:只给需要的命令
%developers ALL=(ALL) NOPASSWD: /usr/bin/docker *, /usr/bin/kubectl *
# ✅ 更好:限制命令参数
%developers ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart webapp-*
审计用户行为
# 启用审计日志
sudo systemctl enable auditd
sudo systemctl start auditd
# 监控用户登录
sudo auditctl -w /var/log/lastlog -p wa -k logins
# 监控 sudo 使用
sudo auditctl -w /usr/bin/sudo -p x -k sudo_usage
# 查看审计日志
sudo ausearch -k logins
sudo ausearch -k sudo_usage
# 生成报告
sudo aureport --login
sudo aureport --exec
审计与日志
登录日志
# 查看成功登录
last
# 查看失败登录
lastb
# 查看当前登录用户
who
# 查看用户登录历史
lastlog
# 查看特定用户登录
last | grep longge
# 查看登录时间统计
ac
命令历史
# 查看命令历史
history
# 查看特定用户的命令历史
cat /home/longge/.bash_history
# 搜索历史命令
history | grep docker
# 清除历史
history -c
# 防止记录敏感命令
HISTIGNORE="passwd:*password*"
# 记录时间戳
echo 'HISTTIMEFORMAT="%F %T "' >> ~/.bashrc
系统日志
# 查看认证日志(CentOS/RHEL)
sudo tail -f /var/log/secure
# 查看认证日志(Ubuntu/Debian)
sudo tail -f /var/log/auth.log
# 查看失败登录
sudo grep "Failed password" /var/log/secure
# 查看 sudo 使用
sudo grep "sudo:" /var/log/secure
# 使用 journalctl(systemd 系统)
sudo journalctl -u ssh
sudo journalctl --since "2026-03-01" --until "2026-03-23"
实战案例
案例 1:创建开发团队账户
# 1. 创建开发组
sudo groupadd developers
# 2. 批量创建用户
for user in alice bob charlie; do
sudo useradd -m -G developers -s /bin/bash -c "Developer" "$user"
echo "$user:TempPass123!" | sudo chpasswd
sudo chage -d 0 "$user" # 首次登录强制改密码
done
# 3. 配置 sudo(/etc/sudoers.d/developers)
sudo visudo -f /etc/sudoers.d/developers
# 添加:%developers ALL=(ALL) NOPASSWD: /usr/bin/docker *, /usr/bin/systemctl restart webapp-*
# 4. 设置资源限制
sudo tee -a /etc/security/limits.conf << EOF
%developers soft nofile 32768
%developers hard nofile 65535
%developers soft nproc 4096
%developers hard nproc 8192
EOF
# 5. 创建共享目录
sudo mkdir -p /data/shared
sudo chown root:developers /data/shared
sudo chmod 775 /data/shared
sudo chmod g+s /data/shared # SGID
案例 2:部署 Web 服务账户
# 1. 创建系统用户(无登录权限)
sudo useradd -r -s /sbin/nologin -d /var/www -M webapp
# 2. 创建应用目录
sudo mkdir -p /var/www/{app,logs,config}
# 3. 设置权限
sudo chown -R webapp:webapp /var/www
sudo chmod 755 /var/www/app
sudo chmod 644 /var/www/config/*
sudo chmod 777 /var/www/logs
# 4. 配置 systemd 服务
sudo tee /etc/systemd/system/webapp.service << EOF
[Unit]
Description=Web Application
After=network.target
[Service]
Type=simple
User=webapp
Group=webapp
WorkingDirectory=/var/www/app
ExecStart=/usr/bin/python3 /var/www/app/main.py
Restart=always
[Install]
WantedBy=multi-user.target
EOF
# 5. 启动服务
sudo systemctl daemon-reload
sudo systemctl enable webapp
sudo systemctl start webapp
案例 3:临时账户管理
# 1. 创建临时用户(7 天后过期)
EXPIRE_DATE=$(date -d "+7 days" +%Y-%m-%d)
sudo useradd -m -e "$EXPIRE_DATE" -c "Temporary Contractor" tempuser
echo "tempuser:TempPass123!" | sudo chpasswd
# 2. 限制权限(只能执行特定命令)
sudo visudo -f /etc/sudoers.d/tempuser
# 添加:tempuser ALL=(ALL) NOPASSWD: /usr/bin/docker ps, /usr/bin/docker logs
# 3. 监控活动
sudo auditctl -w /home/tempuser -p wa -k tempuser_activity
# 4. 到期自动清理(cron 任务)
sudo tee /etc/cron.daily/cleanup-temp-users << 'EOF'
#!/bin/bash
for user in $(cut -d: -f1 /etc/passwd); do
expiry=$(chage -l "$user" | grep "Account expires" | cut -d: -f2)
if [[ "$expiry" == *"no"* ]]; then
continue
fi
expiry_epoch=$(date -d "$expiry" +%s)
now_epoch=$(date +%s)
if [[ $expiry_epoch -lt $now_epoch ]]; then
userdel -r "$user"
echo "Deleted expired user: $user"
fi
done
EOF
sudo chmod +x /etc/cron.daily/cleanup-temp-users
案例 4:多用户共享服务器
# 1. 创建项目组
sudo groupadd project_a
sudo groupadd project_b
# 2. 创建用户并分配
sudo useradd -m -G project_a -s /bin/bash dev1
sudo useradd -m -G project_a -s /bin/bash dev2
sudo useradd -m -G project_b -s /bin/bash dev3
# 3. 创建项目目录
sudo mkdir -p /data/{project_a,project_b,shared}
# 4. 设置权限隔离
sudo chown root:project_a /data/project_a
sudo chmod 770 /data/project_a
sudo chmod g+s /data/project_a
sudo chown root:project_b /data/project_b
sudo chmod 770 /data/project_b
sudo chmod g+s /data/project_b
# 5. 共享目录(只读)
sudo chown root:root /data/shared
sudo chmod 755 /data/shared
# 6. 配置 sudo 隔离
sudo visudo -f /etc/sudoers.d/projects
# %project_a ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart project_a-*
# %project_b ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart project_b-*
避坑指南
坑 1:误删最后一个 sudo 用户
# ❌ 错误:删除前没留后手
userdel -r longge
# 结果:无法使用 sudo
# ✅ 正确:先创建新用户
useradd -m -G wheel newadmin
passwd newadmin
# 测试新用户的 sudo
su - newadmin
sudo whoami
# 确认无误后再删除
userdel -r longge
坑 2:sudoers 语法错误
# ❌ 错误:直接用 vim 编辑
vim /etc/sudoers
# 语法错误导致无法使用 sudo
# ✅ 正确:使用 visudo
visudo
# 或指定编辑器
EDITOR=vim visudo
# 保存前会自动检查语法
坑 3:权限继承问题
# ❌ 错误:SGID 没设置
mkdir /shared
chown root:team /shared
chmod 775 /shared
# 新用户创建的文件不属于 team 组
# ✅ 正确:设置 SGID
mkdir /shared
chown root:team /shared
chmod 2775 /shared
# 或
chmod g+s /shared
坑 4:密码策略过严
# ❌ 错误:要求太高导致无法设置密码
# minlen=20 dcredit=-1 ucredit=-1 ocredit=-1 lcredit=-1
# ✅ 正确:合理策略
# minlen=8 dcredit=-1 ucredit=-1 ocredit=-1
坑 5:home 目录权限
# ❌ 错误:home 目录权限过大
chmod 777 /home/longge
# ✅ 正确:保护用户隐私
chmod 700 /home/longge
# 或允许同组读取
chmod 750 /home/longge
坑 6:系统账户被误用
# ❌ 错误:给系统账户设置密码
passwd nginx
# ✅ 正确:系统账户不应登录
usermod -L nginx
usermod -s /sbin/nologin nginx
练习题
基础题
- 1. 创建用户
testuser,主目录 /home/testuser,Shell /bin/bash - 2. 将
testuser 添加到 developers 组 - 3. 设置
testuser 密码为 Test123!
进阶题
- 5. 批量创建 5 个用户(user1-user5),都添加到
testgroup 组 - 6. 配置
testgroup 组成员可以无需密码执行 systemctl restart nginx - 7. 设置用户密码 90 天过期,提前 7 天警告
答案
# 1
sudo useradd -m -s /bin/bash testuser
# 2
sudo usermod -aG developers testuser
# 3
echo "testuser:Test123!" | sudo chpasswd
# 4
id testuser
# 5
for i in {1..5}; do
sudo useradd -m -G testgroup "user$i"
echo "user$i:TempPass123" | sudo chpasswd
done
# 6
sudo visudo -f /etc/sudoers.d/testgroup
# 添加:%testgroup ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx
# 7
sudo chage -M 90 -W 7 testuser
# 8
sudo groupadd testgroup
sudo mkdir /data/team
sudo chown root:testgroup /data/team
sudo chmod 2775 /data/team
📊 命令速查表
| | |
|---|
| useradd | useradd -m newuser |
| userdel | userdel -r newuser |
| usermod | usermod -aG wheel user |
| passwd | passwd user |
| groupadd | groupadd developers |
| groupdel | groupdel developers |
| groupmod | groupmod -n newname oldname |
| gpasswd | gpasswd -a user group |
| id | id username |
| groups | groups username |
| chage | chage -M 90 user |
| visudo | visudo |
| last | last username |
| history | history | grep docker |
| ulimit | ulimit -n |