sudoers 是什么
sudoers 是 sudo 的策略文件,一条规则由四段构成:谁(用户或别名)在哪些主机上、以什么身份(Runas)、可以执行哪些命令。它支持 User_Alias、Host_Alias、Cmnd_Alias、Runas_Alias 四类别名,把「角色」和「命令集合」从具体规则里抽出来,多人多机环境下才维护得动。文件必须用 visudo 编辑:它会先做语法检查再原子替换,避免把 sudo 锁死。
基本信息
| 适用平台 | Linux/Unix(sudo 包) |
|---|---|
| 规则格式 | 用户 主机=(目标用户:目标组) 命令 |
| 四类别名 | User_Alias、Host_Alias、Cmnd_Alias、Runas_Alias |
| 关键字段 | NOPASSWD 免密、! 取反、Defaults 默认项、%组名 表示用户组 |
| 推荐组织 | 主文件只保留 Defaults 与 include,规则拆到 /etc/sudoers.d/ 下按团队或服务分文件 |
| 权限要求 | 文件属主 root、权限 0440;目录 /etc/sudoers.d 通常 0750 |
典型使用场景
- 最小权限运维:只放行 restart、status 这类具体子命令,而不是整个 systemctl
- 按角色授权:用 User_Alias 把同一职责的人分组,规则只写一次
- 自动化免密:只给服务账号需要的少数命令配 NOPASSWD
- 禁止危险操作:用取反排除 shell 入口、编辑器与包管理命令
- 多机一致:把同一份 sudoers.d 文件分发到一批机器
企业常用范式
企业常用范式
User_Alias DEVOPS = alice, bob
Cmnd_Alias SVC = /usr/bin/systemctl restart app*, /usr/bin/systemctl status app*
Cmnd_Alias BACKUP = /opt/scripts/backup.sh
DEVOPS ALL=(root) NOPASSWD: SVC # 自动化与值守常用免密
DEVOPS ALL=(root) BACKUP # 默认仍要求输入密码
# 取反:先放行再排除更危险的形态
# DEVOPS ALL=(root) BACKUP, !/opt/scripts/backup.sh --purge
Defaults:DEVOPS !requiretty # 允许无 tty 的自动化执行校验与查看
校验与查看
sudo visudo -c # 全量语法检查,改前改后都跑
sudo visudo -cf /etc/sudoers.d/app # 只校验某个片段
sudo -l -U alice # 查看 alice 被授予的权限
sudo -l # 查看当前用户的实际权限与生效来源别名与写法读法
| 元素 | 作用 | 注意 |
|---|---|---|
| User_Alias | 把一批用户命名 | 别名名用大写,避免与用户名混淆 |
| Cmnd_Alias | 把一批命令命名 | 命令必须写绝对路径,相对路径不生效 |
| Runas_Alias | 把可选身份命名 | 用于切换到非 root 的特定账号 |
| Defaults | 全局或按用户的行为开关 | 如 !requiretty、secure_path、logfile |
| %组名 | 按用户组授权 | 组成员变化自动跟随 |
| ! 取反 | 在放行后排除特例 | 位置与顺序会影响最终匹配结果 |
| @includedir | 包含整个目录 | 用于拆分到 sudoers.d |
命令通配符可以被参数绕开:授权 /bin/sh、/usr/bin/vi、/usr/bin/systemctl 这类「能执行任意命令」的入口等于授了全权。凡是允许带参数执行的二进制都要显式排除,或用 !/usr/bin/sh -c 之类的取反规则收紧。
把规则拆进 /etc/sudoers.d/ 每个团队或服务一个文件,便于审计与回滚;文件属主 root、权限 0440,文件名不要带点号与波浪号,否则会被忽略。改完用 sudo -l -U 用户名 验证实际生效结果,而不是只读文件。