跳转至

07 - 用户与权限管理(sudoers、adduser)

前提条件

  • 已完成 Debian 12 Bookworm 基础部署、网络配置、时间同步
  • 以 root 身份登录,或具有 sudo 权限的 ops 用户
  • 虚拟机环境:VMware Workstation Pro
  • 全局约定:主机名 linuxdc,静态 IP 192.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 -iwhoami 输出 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 组

实践任务

  1. 创建或确认 ops 用户存在,并加入 sudo
  2. 用 ops 用户执行 sudo apt updatesudo -i 测试提权
  3. 创建 /etc/sudoers.d/ops-privileges 文件,授予 ops 用户对 systemctl restart ssh 的无密码执行权限,并用 visudo -c 验证语法
  4. idgroups 命令验证 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/ 目录方式便于版本控制与多人管理,强烈推荐在生产环境中使用。