0

我正在尝试创建一个 PHP 脚本,该脚本允许从 Web 门户管理某些 UFW 防火墙规则。我正在使用 exec("sudo /sbin/ufw {command}") 来应用收到的更改,但它仅在禁用 SELinux 强制时才有效。我已经根据审计日志尝试了 audit2allow,创建了一个自定义模块,但是当我重新打开强制执行时,它仍然失败。

错误:

ERROR: initcaps
[Errno 2] iptables v1.4.21: can't initialize iptables table `filter': Permission denied (you must be root)
Perhaps iptables or your kernel needs to be upgraded.

即使启用了强制执行,我也能够从命令行执行与脚本中相同的命令。

sudo -u apache sudo /sbin/ufw {command}

用户:阿帕奇

Linux:RHEL 7.5

4

1 回答 1

0

这不是很优雅,但请尝试 ssh 而不是 sudo。

您是否曾经注意到,您在 CLI 上尝试以管理员身份运行的命令从未遇到过 SELinux 问题?它总是通过 cron/systemd 开始执行,或者从 http 连接开始执行.....

那么 sshd 和由它启动的 shell 基本上被排除在 selinux 强制执行之外,您可以在这里使用它来为您带来好处。

首先阅读 ssh 密钥和命令锁定密钥。

然后为这个命令创建一个新的密钥对:

ssh-keygen -f id_rsa_commandyouwant -P ''

在用户的 authkeys 文件中安装该密钥对:

echo -n 'command="/path/to/your/script",no-port-forwarding,no-x11-forwarding,no-agent-forwarding' >> /root/.ssh/authorized_keys

cat id_rsa_commandyouwant**.pub** >> /root/.ssh/authorized_keys

我们在上面回显的单引号中的字符串将锁定密钥,因此它不能用于获取交互式 shell。当该密钥与该用户帐户一起使用时,只会执行脚本。

如果您的脚本需要接收参数,您可以在脚本中使用 ${SSH_ORIGINAL_COMMAND} 变量(仔细清理)。只需在调用 ssh 客户端时提供参数,就好像它们是命令一样,整个 cmdline 字符串将显示在 ${SSH_ORIGINAL_COMMAND} 中。

无论如何,如果您的脚本可以以非 root 身份运行,请这样做,并替换上面的 root 的 homedir。

所以,而不是:

exec("sudo /sbin/ufw {命令}")

尝试:

exec("ssh -i /path/to/id_rsa_specialusecase root@localhost {command}")

并制作一个脚本,我将调用 /path/to/your/script 读取 ${SSH_ORIGINAL_COMMAND},验证它是理智和安全的(不包含 ; rm -rf /),然后调用:

/sbin/ufw ${SSH_ORIGINAL_COMMAND}

快乐的系统管理!

于 2020-04-22T07:29:02.353 回答