07 - 用户与权限管理(sudoers、adduser)
前提条件
- 已完成 Debian 12 Bookworm 基础部署、网络配置、时间同步
- 以 root 身份登录,或具有 sudo 权限的 ops 用户
- 虚拟机环境:VMware Workstation Pro
- 全局约定:主机名
linuxdc,静态 IP192.168.1.100/24
详细步骤
1. 创建标准运维用户
若安装时未创建,现在创建 ops 用户:
adduser ops
按提示依次输入:
- 全名:Ops User
- 房间号、电话等:直接回车跳过
- 密码:设置高强度密码(与 root 不同,建议 16 位以上混合字符)
2. 将 ops 用户加入 sudo 组
Debian 默认使用 sudo 组控制提权权限(注意:Debian 使用 sudo 组,不同于 RHEL 的 wheel 组):
usermod -aG sudo ops
# 或
adduser ops sudo
验证组成员身份:
groups ops
# 应看到输出包含 sudo
id ops
检查点
groups ops 输出类似:ops : ops sudo
id ops 输出中 groups= 字段包含 sudo 组的 GID。
3. 测试 ops 用户的 sudo 能力
切换到 ops 用户并测试:
su - ops
sudo apt update # 测试普通提权(需输入 ops 密码)
sudo -i # 进入 root shell 环境
whoami # 应输出 root
exit # 退出 root shell
exit # 退出 ops 用户
检查点
sudo apt update 执行成功,无 is not in the sudoers file 错误。sudo -i 后 whoami 输出 root。
4. 优化 sudoers 配置(生产安全最佳实践)
重要
严禁直接用 vim 编辑 /etc/sudoers。语法错误会导致所有用户失去提权能力,系统需要用 LiveCD 修复。必须使用 visudo 命令,它会在保存时自动做语法校验。
使用 visudo 安全编辑:
visudo
推荐添加内容(在文件末尾):
# 允许 ops 用户无需输入密码执行特定命令(示例,按需调整)
# ops ALL=(ALL) NOPASSWD: /usr/bin/apt update, /usr/bin/systemctl restart ssh
# 禁用交互式 tty 要求(脚本自动化友好)
Defaults:ops !requiretty
更推荐的做法:创建独立配置文件(便于版本控制):
vim /etc/sudoers.d/ops-privileges
内容示例:
# ops 用户完整提权权限
ops ALL=(ALL:ALL) ALL
# 或更精细的控制(按需选择)
# ops ALL=(ALL) NOPASSWD: /usr/bin/apt update
# ops ALL=(ALL) /usr/bin/systemctl restart ssh
保存后验证文件语法:
visudo -c -f /etc/sudoers.d/ops-privileges
检查点
visudo -c -f /etc/sudoers.d/ops-privileges 输出 /etc/sudoers.d/ops-privileges: parsed OK。
5. 禁用 root 直接 SSH 登录(预备,完整配置见第 8 章)
grep PermitRootLogin /etc/ssh/sshd_config
# 确认当前值,第 8 章将修改为 no
6. 用户与组管理常用命令速查
id ops # 查看 uid / gid / 附属组
getent passwd ops # 查看用户条目
getent group sudo # 查看 sudo 组成员列表
passwd ops # 修改 ops 用户密码
chage -l ops # 查看密码过期信息
deluser --remove-home olduser # 安全删除用户及其主目录
addgroup developers # 创建新组
usermod -aG developers ops # 将 ops 加入 developers 组
实践任务
- 创建或确认 ops 用户存在,并加入
sudo组 - 用 ops 用户执行
sudo apt update和sudo -i测试提权 - 创建
/etc/sudoers.d/ops-privileges文件,授予 ops 用户对systemctl restart ssh的无密码执行权限,并用visudo -c验证语法 - 用
id和groups命令验证 ops 用户的组成员身份
自测问题
1. Debian 中 sudo 权限默认由哪个用户组控制?
Debian 中 sudo 权限由 sudo 组控制(通过 /etc/sudoers 中的 %sudo ALL=(ALL:ALL) ALL 规则)。这与 RHEL/CentOS 系使用 wheel 组不同,迁移时需注意。将用户加入 sudo 组即可获得完整 sudo 权限:usermod -aG sudo username。
2. 为什么强烈建议不要直接用 root 日常操作,而是创建普通用户并加入 sudo?
直接使用 root 有以下风险:所有操作无需确认直接以最高权限执行,误操作(如 rm -rf /)无任何保护;无法通过日志区分哪个操作员执行了哪条命令(多人共用 root 时审计困难);root 密码泄露导致系统完全沦陷。使用 ops + sudo 模式:日常操作以普通用户身份运行,降低误操作风险;sudo 操作会记录在 /var/log/auth.log 中,提供完整审计链;即使 ops 账户被攻破,攻击者还需知道 sudo 密码才能提权。
3. visudo 命令相比直接 vi /etc/sudoers 的最大优势是什么?
visudo 在关闭文件时会自动执行语法校验,若配置存在语法错误会提示用户修正,不会写入错误内容。而直接 vi /etc/sudoers 保存的任何语法错误都会立即生效,导致系统所有用户完全失去 sudo 能力,必须用 LiveCD 引导后手动修复。visudo 还会加锁防止多人同时编辑,是操作 sudoers 的唯一安全方式。
4. 如何让某个用户只能执行特定命令而不能完全提权为 root?
在 /etc/sudoers.d/ 中创建配置文件,使用 NOPASSWD 限定命令列表:
# 只允许执行特定命令
ops ALL=(root) NOPASSWD: /usr/bin/systemctl restart nginx, /usr/bin/journalctl
ops ALL=(root) /usr/sbin/service apache2 *
注意:命令路径必须使用绝对路径,且用户无法通过被允许的命令启动 shell(如 /bin/bash)来绕过限制。若命令本身可以执行任意 shell(如 vim 的 :!cmd),需额外配合其他机制(如 AppArmor)限制。
总结
建立了安全、可审计的运维用户模型(ops + sudo)。后续章节将结合 SSH 配置禁用 root 登录,形成"普通用户 + 最小权限提权"的生产标准。/etc/sudoers.d/ 目录方式便于版本控制与多人管理,强烈推荐在生产环境中使用。