sudo权限控制核心是通过/etc/sudoers(用visudo编辑)按序匹配的精确规则,定义“谁在哪些主机上以什么身份运行哪些命令”;推荐拆分策略至/etc/sudoers.d/并结合用户组实现细粒度、可维护的授权。

sudo权限控制的核心逻辑
sudo不是简单地“让普通用户执行root命令”,而是通过精确的规则定义“谁能在哪些主机上、以什么身份、运行哪些命令”。配置的关键在于/etc/sudoers文件(必须用visudo编辑)及其包含的片段,所有规则按顺序匹配,第一条生效,不满足则拒绝。
基础sudoers语法与安全写法
一条典型规则形如:
alice ALL=(root) /usr/bin/systemctl restart nginx
含义是:用户alice在任意主机(ALL)上,可切换为root身份,仅执行指定的systemctl重启nginx命令。
- 避免使用NOPASSWD: ALL——除非是开发测试环境,生产中应限定命令路径和参数
- 用Cmnd_Alias归类命令,例如:
Cmnd_Alias WEB_CMD = /usr/bin/systemctl start nginx, /usr/bin/systemctl stop nginx, /bin/journalctl -u nginx - 用User_Alias和Host_Alias提升可维护性,例如:
User_Alias WEBADMINS = alice, bob
WEBADMINS webserver01 = (root) WEB_CMD
ACL式细粒度控制:sudoers.d与组策略
现代Linux发行版推荐将策略拆分到/etc/sudoers.d/目录下,按功能或团队命名(如90-webteam),文件需无扩展名、权限644、不带空格。结合Linux用户组可实现批量授权:
- 创建系统组:groupadd webops
- 把用户加入组:usermod -aG webops alice
- 在/etc/sudoers.d/webops中写:
%webops ALL=(root) NOPASSWD: /usr/bin/nginx -t, /usr/sbin/nginx -s reload - 注意%前缀表示组;NOPASSWD仅对列出的命令生效,其他仍需密码
实战案例:限制DBA只能重启MySQL且验证配置
目标:dba组成员可无密重启MySQL服务,但不能停止、启动其他服务,也不能shell逃逸。
- 定义命令别名:
Cmnd_Alias MYSQL_CMD = /usr/bin/systemctl restart mysql, /usr/bin/mysqladmin ping - 禁止shell访问:
Defaults: %dba !shell, !sudoedit - 主策略行:
%dba ALL=(root) NOPASSWD: MYSQL_CMD - 验证方式:
切换到dba用户后运行sudo -l查看可用命令;尝试sudo systemctl stop mysql应被拒绝;sudo -i应失败










