You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

sudoers配置允许用户以root执行指定脚本后,用户修改脚本仍可通过sudo以root执行的安全问题咨询

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权限),这里有几个方案可选:

  1. 锁定脚本内容,禁止修改
    使用chattr +i /home/user123/specialscript.sh给脚本添加不可修改的扩展属性。添加后,即便是root用户,不先执行chattr -i解锁也无法修改脚本,自然user123就没机会篡改了。不过要注意,之后你自己要修改脚本的话,得先解锁再操作。

  2. 调整权限,限制编辑能力

    • 去掉脚本的组写权限:chmod g-w /home/user123/specialscript.sh,同时保持脚本所有者为root。这样user123只能查看和执行脚本,无法编辑。
    • 更彻底一点:把脚本移到user123没有写权限的系统目录,比如/usr/local/bin/,设置所有者为root,权限设为-rwxr-xr--,然后修改sudo规则指向新路径/usr/local/bin/specialscript.sh。这样user123连脚本所在目录的写权限都没有,根本没机会篡改脚本。
  3. 给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

火山引擎 最新活动