Linux中visudo配置命令白名单本质是精确授权:只允许指定用户以特定身份、在指定主机上执行带参数的绝对路径命令;必须用visudo编辑以语法校验、设权限440,并推荐使用/etc/sudoers.d/下独立文件配合User_Alias、Cmnd_Alias、Host_Alias分层管理。

在 Linux 中通过 visudo 配置命令白名单,本质是“只开一条缝”——不开放 shell、不放行 ALL,而是精确指定用户能以什么身份、在哪些主机上、执行哪几个带参数的绝对路径命令。
必须用 visudo 编辑,不能直接改文件
直接用 vim 或 nano 修改 /etc/sudoers 极其危险:一个空格错位、少个括号或漏写斜杠,就会导致 sudo 全局失效,连 root 都无法恢复。visudo 的核心价值在于:
- 保存前自动语法校验,报错即中止,不写入非法配置
- 自动设置文件权限为 440(仅 root 可读写)
- 支持编辑
/etc/sudoers.d/下的独立规则文件,推荐做法
新增规则建议走这条路径:sudo visudo -f /etc/sudoers.d/webops
文件名不能含点或波浪号(如 webops.conf 或 webops~ 会被系统忽略),保存后自动生效。
命令必须写绝对路径,且参数要收口
白名单不是“允许 systemctl”,而是“允许 /usr/bin/systemctl restart nginx”。相对路径、通配符滥用、二进制裸调都等于开门揖盗:
- ✅ 正确:
alice ALL=(root) /usr/bin/systemctl restart nginx - ❌ 错误:
alice ALL=(root) systemctl restart nginx(没路径) - ❌ 错误:
alice ALL=(root) /usr/bin/systemctl(可加任意参数,等同于 shell) - ✅ 参数可控写法:
/usr/bin/tail /var/log/nginx/*.log(*只能在末尾用于路径通配) - ✅ 显式拒绝高危命令:
!/bin/sh, !/usr/bin/python3 -c, !/bin/bash
用别名分层管理,提升可读性和可维护性
避免在每条规则里重复写长路径或一堆用户名。用三类别名抽象逻辑:
-
User_Alias:如
User_Alias BACKUP = alice, %backup-team -
Cmnd_Alias:如
Cmnd_Alias NGINX_CTL = /usr/bin/systemctl start nginx, /usr/bin/systemctl reload nginx -
Host_Alias:如
Host_Alias WEB_HOSTS = web01, web02
组合起来就是:BACKUP WEB_HOSTS = (root) NGINX_CTL
后续增人、加机器、扩命令,只需改对应别名定义,主规则不动。
精细化控制执行条件
白名单还可叠加行为约束,让授权更贴合生产场景:
- 免密执行特定操作:
bob ALL=(root) NOPASSWD: /sbin/shutdown -r now(注意NOPASSWD:紧贴命令前,不可写成NOPASSWD: ALL) - 限制默认目标用户:
Defaults:alice runas_default=root - 启用日志审计:
Defaults logfile="/var/log/sudo.log"(加在配置顶部或/etc/sudoers.d/文件开头) - 强制 requiretty(防止后台提权):
Defaults requiretty
配置完成后,切换到对应用户执行 sudo -l,就能看到当前被允许执行的命令列表,验证是否符合预期。


















