tl;dr - 在 /etc/passwd 中给 Apache 一个 shell 有什么危险?
我正在努力使用 Apache 设置 mod_evasive 以对抗 DOS 尝试。我使用DOSSystemCommand
运行一个脚本,将有问题的 IP 地址添加到 iptables 中的 BANNED 链中。
我发现让这个过程正常工作的唯一方法是将 Apache 的 shell 从 更改/sbin/nologin
为/bin/bash
. 但实际上只有脚本的一部分因没有更改外壳而失败。这DOSSystemCommand
是它运行的行和脚本:
DOSSystemCommand "/usr/bin/sudo /bin/bash /var/www/html/ban_ip.sh %s"
和脚本......(注意我只是在测试......这就是为什么我有详细的输出和短暂的禁止期)
#!/bin/bash
IP=$1
IPTABLES=/sbin/iptables
sudo $IPTABLES -I BANNED -p tcp -s $IP --dport 443 -j DROP
sudo $IPTABLES -I BANNED -p tcp -s $IP --dport 80 -j DROP
echo sudo $IPTABLES -v -D BANNED -p tcp -s $IP --dport 80 -j DROP | at -m now + 1 minutes
echo sudo $IPTABLES -v -D BANNED -p tcp -s $IP --dport 443 -j DROP | at -m now + 2 minutes
echo rm -fv /tmp/dos-$IP | at -m now + 2 minutes
因此,Apache 的外壳为/sbin/nologin
,它将添加 IPTABLES 规则并创建at
作业,但是当我收到一封包含 at 作业结果的电子邮件时,它指出User is currently unavailable
,因此永远不会删除 iptables 规则。如果我将 Apache /bin/bash 作为其 shell,则会添加 iptables 规则,创建 at 作业,并且 iptables 删除将在指定时间按预期工作。
所以我的问题是:通过给 Apache 用户一个 shell,我以什么方式将我的服务器置于危险之中?
相关代码在 mod_evasive.c 的第 224 行:
现在,让我们检查一下
man 3 system
:然后,我们可以看到,指定的命令正在 shell 中运行。诚然,
system(3)
文档在这一点上令人困惑,但我们当然可以看到正在发生的事情并做出适当的推断——它在用户的默认 shell 中运行,而不仅仅是/bin/sh
.正确的解决方案相对简单:只需将
system(3)
调用替换为 afork(2)
和 anexecve(2)
(或类似的东西)。如果您不想这样做,您还可以编写一个非常小的限制性外壳来适当地锁定事物。巧合的是,这个问题促使我仔细检查,你会很高兴知道一个有能力编写 .htaccess 文件的用户不能仅仅因为安装了 mod_evasive 就接管了你的盒子(
RSRC_CONF
是正确的设置,所以在这一点上对 mod_evasive 的作者表示敬意)。但是,鉴于您对配置的描述方式,极有可能至少,任何能够以 Apache 运行代码的用户(例如,禁止mod_su*
等,任何可以运行 PHP、Perl、CGI 等的用户)都可以使用 Apache。 ),可以禁止您使用 IPTables 访问您自己的服务器。为什么 apache 需要运行这个脚本?看起来您正在将 apache 提升为 root,并在您可以以 root 身份运行脚本时为其分配一个 shell。
授予 apache sudo 访问权限很像锁定建筑物的所有门窗......而且还为装运码头安装高架门并将其敞开。(理论上,用户只能访问运输区中的某些东西……但他们仍然可以进入建筑物,并且可以开始窥探更多的入口点。
为 apache 用户提供一个 shell 来使用 sudo 访问权限很像将钥匙切割机留在所述运输区。运气好的话,攻击者可以制作他/她需要的密钥(获得访问/特权)。
https://unix.stackexchange.com/questions/78985/deleting-users-with-nologin-shell 根据上述问题:/bin/nologin shell 阻止任何人以相关用户身份登录(请参阅:控制台, ssh、su 等)。
您还可以查看: https ://security.stackexchange.com/questions/5707/recommendations-for-chang-the-default-shell-for-service-accounts——关于 nologin vs / 安全性的讨论dev/null 作为外壳。