Mil*_*vić 7 security sudo shell-script
以非特权用户身份执行 root 命令的解决方案 - sudo 'ing 脚本- 很容易导致安全漏洞和意外行为和结果的可能性(这对于任何其他解决方案也是如此,例如带有 的二进制包装器setuid
);
很明显,脚本是使用 visudo 添加的,就像这样
www-data ALL=(ALL) NOPASSWD: /usr/local/sbin/mycommand
Run Code Online (Sandbox Code Playgroud)
chown root:root mycommand; chmod 700 mycommand
)root:root
与755
模式Defaults env_reset
in/etc/sudoers
应该设置(?这里需要帮助)还可以做些什么来保护 sudo 驱动的脚本?
我会稍微修改一下保护脚本的标准列表。鉴于此 - 或类似 - 条目/etc/sudoers
:
Run Code Online (Sandbox Code Playgroud)www-data ALL=(ALL) NOPASSWD: /usr/local/sbin/mycommand
我们可以声明脚本:
PATH
在使用任何外部命令之前定义它logger
)此外,在许多情况下,脚本实际上并不需要以 root 身份运行——它可以运行 setgid,甚至可以将 setuid 运行到某个其他帐户。在一般情况下,请考虑这些选项以避免授予对脚本的完全 root 访问权限。
对于 SELinux 环境,可以创建一个策略来防止脚本执行任何意外操作。CAP_NET_ADMIN 之类的功能比全面的 root 权限更精细,也可能值得考虑。
在您概述的特定情况下,您想要验证单个 IPv4 地址并将其传递给iptables
,您可能能够将 IP 地址验证为一系列非特定八位字节。在这种情况下,444.555.666.999 可能被认为是合理的,因为它知道它iptables
自己会拒绝任何不是真实 IP 地址的东西。在一种极端情况下,您可能会认为匹配 RE/^[0-9.]+$/
足以将值传递给iptables
. 另一方面,StackExchange 和其他地方有很多解决验证 IP 地址问题的答案。有些比其他的好。
要考虑的特殊情况是 RFC1918 地址、多播地址和您自己的外部 IP 地址范围。哦,还有以前称为 E 类的保留块。您需要 IPv6 支持吗?
如果您的脚本每分钟被调用数百次会发生什么?您需要为这种情况做好准备吗?你的iptables
链条会溢出吗?如果你认为你会需要数百条规则在链将是[更有效地使用ipset
扩展到iptables
而不是一个线性表。这是一个很好的教程。在保护方面,它允许您构建数千个(如果不是数万个)类似规则集,这些规则集可以运行而不会显着减慢流经您的规则集的流量。
突然之间,您看似简单的要求变得相当复杂。
最好的事情之一是使用文件中的“Digest_Spec”可能性sudoers
,以验证可执行文件的校验和
手册页摘录:
如果命令名称以 Digest_Spec 为前缀,则只有在可以使用指定的 SHA-2 摘要进行验证的情况下,该命令才会成功匹配。
使用 openssl,生成校验和:
Run Code Online (Sandbox Code Playgroud)$ openssl dgst -sha224 /usr/local/sbin/mycommand SHA224(/usr/local/sbin/mycommand)= 52246fd78f692554c9f6be9c8ea001c9131c3426c27c88dbbad08365
然后在你的 sudoers 文件中(在同一行):
www-data ALL=(ALL) NOPASSWD:
ssha224:52246fd78f692554c9f6be9c8ea001c9131c3426c27c88dbbad08365
/usr/local/sbin/mycommand
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5172 次 |
最近记录: |