Ubuntu 用户与权限管理指南
Ubuntu 的用户与权限系统是 Linux 安全模型的核心,基于 DAC(自主访问控制) + sudo 特权提升 + AppArmor/MAC 补充。理解它能帮你避免 90% 的“权限拒绝”“sudo 失效”“误删系统文件”等常见生产事故。
本文针对 Ubuntu 24.04 LTS / 26.04 LTS(主流服务器版本),聚焦本地用户管理(/etc/passwd & /etc/group),不涉及 LDAP/AD/SSSD 等企业级集中认证。
1. 核心概念速览
- 用户(User):每个进程都运行在某个用户身份下。UID 0 = root(全权),普通用户 UID ≥ 1000(Ubuntu 默认从 1000 开始)。
- 组(Group):用户可属于多个组,主组(primary group)通常与用户名同名,补充组(supplementary groups)决定额外权限。
- 文件权限:rwx(读/写/执行) × 拥有者 / 所属组 / 其他用户。八进制:7=rwx, 6=rw-, 4=r– 等。
- sudo:允许普通用户以 root 或其他身份执行命令。Ubuntu 默认把初始用户加入 sudo 组,实现“无密码 root 账户”策略。
- /etc/sudoers:sudo 规则文件。用 visudo 编辑(语法检查 + 安全锁)。
2. 查看当前用户与组状态(日常诊断)
Bash
whoami # 当前用户
id # UID、GID、主组 + 所有补充组
groups # 只列出所属组(简洁)
id -u wu # 只看 UID
cat /etc/passwd | grep wu # 用户条目(密码占位 x 表示用 shadow)
cat /etc/group | grep sudo # 谁在 sudo 组里
getent group sudo # 更可靠(支持 NSS,如 LDAP)生产常用:lastlog 查看最后登录时间,排查异常账户。
3. 创建用户(推荐方式对比)
Ubuntu 强烈推荐用 adduser 而非 useradd(后者更底层,选项多但易出错)。
| 命令 | 交互式? | 创建家目录? | 设置密码? | 默认 shell? | 推荐场景 |
|---|---|---|---|---|---|
| sudo adduser wu | 是 | 是 | 是 | /bin/bash | 99% 日常创建普通用户 |
| sudo useradd -m -s /bin/bash -G sudo deploy | 否 | 是(-m) | 否(需 passwd) | 指定 | 脚本批量创建、CI/CD 账户 |
adduser 示例(最友好):
Bash
sudo adduser deploy
# 交互:全名、房间号、电话等可回车跳过
# 最后问是否加到 sudo 组 → 直接 y(生产常见)useradd + 后续设置(脚本化):
Bash
sudo useradd -m -s /bin/bash -c "Deploy User" -G sudo,www-data deploy
sudo passwd deploy系统/服务账户(无登录、无家目录):
Bash
sudo adduser --system --group --no-create-home --shell /usr/sbin/nologin nginx4. 修改用户(usermod 最常用)
Bash
sudo usermod -l newname oldname # 改用户名(慎用,家目录不自动改)
sudo usermod -aG docker,www-data wu # 加补充组(-a 必须有!否则覆盖所有组)
sudo usermod -G "" wu # 清空所有补充组(危险)
sudo usermod -L wu # 锁定账户(! 开头密码)
sudo usermod -U wu # 解锁
sudo usermod -e 2026-12-31 wu # 设置账户过期日期
sudo usermod -s /bin/zsh wu # 改默认 shell经典错误:忘了 -a,导致用户从 sudo 组被踢出。
5. 删除用户(小心家目录与进程)
Bash
sudo userdel wu # 只删用户条目(家目录残留)
sudo userdel -r wu # 删用户 + 家目录 + 邮件池先检查:
- ps -u wu 或 pkill -u wu 杀残留进程
- lsof -u wu 查看打开的文件
6. 组管理(groupadd / groupmod / gpasswd)
Bash
sudo groupadd monitoring # 创建新组
sudo groupmod -n newname oldname # 改组名
sudo gpasswd -a wu monitoring # 加用户到组
sudo gpasswd -d wu monitoring # 删用户从组
sudo gpasswd -A wu monitoring # 设 wu 为组管理员(可自己加人)查看组成员:getent group monitoring
7. 授予 sudo 权限(三种主流方式)
方式一:加 sudo 组(最简单,Ubuntu 默认推荐)
Bash
sudo usermod -aG sudo deploy
# 或创建时:adduser 时选 yes方式二:精细控制(编辑 /etc/sudoers.d/)
Bash
sudo visudo -f /etc/sudoers.d/deploy
# 内容示例:
deploy ALL=(ALL:ALL) ALL # 等同 sudo 组
deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx # 无密码重启 nginx
deploy ALL=(www-data) ALL # 以 www-data 身份运行所有命令
%monitoring ALL=(ALL) NOPASSWD: /usr/sbin/reboot # 整个组无密码重启方式三:现代替代 sudo-rs(Ubuntu Server 文档推荐,2025+ 逐渐流行)
- 安装 sudo-rs(Rust 重写,更安全、更快)
- 配置类似,但支持 TOML 格式,审计更强
8. 文件权限与所有权管理(每天都在用)
Bash
# 改拥有者(最常见 web 修复 403)
sudo chown -R www-data:www-data /var/www/html
# 只改组
sudo chgrp -R docker /data/volumes
# 权限(八进制最直观)
chmod 755 script.sh # rwxr-xr-x
chmod 640 config.yaml # rw-r-----
chmod -R 750 /app # 目录常用
chmod +x *.sh # 批量加执行权限
# setgid(新文件继承目录组,常用于协作目录)
chmod g+s /data/team
# sticky bit(/tmp 经典,只允许拥有者删)
chmod +t /tmp口诀:
- 可执行脚本/目录 → 755
- 配置文件 → 640 / 600
- 共享写目录 → 775 + setgid
- 绝不 777(除非临时测试)
9. 生产最佳实践
- 禁用 root SSH 登录:/etc/ssh/sshd_config → PermitRootLogin no → 重启 ssh
- 用密钥 + sudo:所有运维走普通用户 + 密钥,禁用密码登录
- 最小权限原则:服务跑专用用户(如 nginx、postgres),绝不 root
- 定期审计:sudo apt install acct → lastcomm、aureport(需 auditd)
- sudo 日志:默认在 /var/log/auth.log,监控 “COMMAND=” 异常
- 密码策略:/etc/login.defs 或 PAM(pwquality)强制复杂密码 + 过期
- 避免直接编辑 /etc/sudoers:永远用 visudo 或 /etc/sudoers.d/
- 备份关键文件:/etc/passwd /etc/shadow /etc/group /etc/gshadow /etc/sudoers*
掌握这些,你就能安全、优雅地管理一台或一群 Ubuntu 服务器的用户与权限。