sudoers配置允许用户以root执行指定脚本后,用户修改脚本仍可通过sudo以root执行的安全问题咨询
这确实是一个很容易被忽略的sudo配置安全隐患,我来帮你梳理下问题本质和可行的解决办法:
问题场景回顾
你原本的配置思路是合理的:
- 让user123能以root身份运行
specialscript.sh,于是在他的目录下创建了脚本,权限设为-rwxr---- 1 root deployers 142 Jul 16 14:07 specialscript.sh - 在
sudoers.d/specialscripts里添加规则:user123 ALL=(root) NOPASSWD: /home/user123/specialscript.sh - 测试时user123能正常用
sudo specialscript.sh以root执行,其他用户因目录权限无法访问脚本,看起来安全可控。
但很快就发现了致命漏洞:
因为user123属于deployers组,脚本的组权限包含读写,所以他不仅能查看脚本内容(这是你有意的),还能直接编辑脚本。编辑后脚本的所有权变成了-rwxr---- 1 user123 user123 142 Jul 16 14:07 specialscript.sh,更严重的是,他依然能通过sudo以root身份执行修改后的脚本——这意味着他可以往脚本里添加任何恶意命令(比如rm -rf /),直接获取完全的root权限。
问题根源
sudo的默认规则是基于文件路径匹配,而不是校验脚本的内容、所有者或哈希值。只要指定的路径存在且用户有执行权限(sudo会帮他提权),不管脚本被改成什么样,sudo都会允许执行。
可行的解决办法
针对你的需求(允许user123查看脚本,但不能通过修改脚本获取root权限),这里有几个方案可选:
锁定脚本内容,禁止修改
使用chattr +i /home/user123/specialscript.sh给脚本添加不可修改的扩展属性。添加后,即便是root用户,不先执行chattr -i解锁也无法修改脚本,自然user123就没机会篡改了。不过要注意,之后你自己要修改脚本的话,得先解锁再操作。调整权限,限制编辑能力
- 去掉脚本的组写权限:
chmod g-w /home/user123/specialscript.sh,同时保持脚本所有者为root。这样user123只能查看和执行脚本,无法编辑。 - 更彻底一点:把脚本移到user123没有写权限的系统目录,比如
/usr/local/bin/,设置所有者为root,权限设为-rwxr-xr--,然后修改sudo规则指向新路径/usr/local/bin/specialscript.sh。这样user123连脚本所在目录的写权限都没有,根本没机会篡改脚本。
- 去掉脚本的组写权限:
给sudo规则添加校验条件(更严谨)
你可以在sudo配置里增加对脚本的所有者、组和权限的校验,只有满足条件时才允许执行。比如修改sudoers.d/specialscripts为:Cmnd_Alias SPECIAL_SCRIPT = /home/user123/specialscript.sh user123 ALL=(root) NOPASSWD: SPECIAL_SCRIPT Defaults!SPECIAL_SCRIPT owner=root,group=deployers,mode=0750这样只有当脚本的所有者是root、组是deployers、权限为0750时,sudo才允许执行。如果user123修改了脚本的所有者或权限,sudo会直接拒绝执行。不过这个方案需要注意sudo版本,部分旧版本可能不支持这些校验选项。
备注:内容来源于stack exchange,提问作者SledgehammerPL




