【问题标题】:How to manage UFW via PHP site如何通过 PHP 站点管理 UFW
【发布时间】:2018-11-10 00:57:04
【问题描述】:

我正在尝试创建一个 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

【问题讨论】:

  • 嗯,很可能该进程不允许使用这样的sudo 命令(没有密码),您是否将该命令列入白名单?
  • 这是我在 sudoers 中的条目:“apache ALL=(root) NOPASSWD: /sbin/ufw” 即使启用了 selinux 强制,我也可以单独运行 sudo 命令。我猜这与在 httpd 守护进程或线程中执行的命令有关,但我对 selinux 不够熟悉
  • 你解决过这个问题吗?我刚刚遇到了同样的问题。我编写了一个自定义 php 脚本来更改特定的防火墙规则。我使用静态 sudo nopasswd 条目让 apache 用户以 root 身份执行一个脚本,该脚本应该能够添加或删除规则。但是 selinux 搞砸了。 audit.log 看起来 sudo 没有运行,但我在我的 bash 脚本中添加了回显,我在 chrome 中看到了输出。
  • 对不起@billy,我正在努力思考我为什么要设置它或者它是用于哪个项目,但我不记得了。如果我找到了解决方案,我可能会发布它,所以我怀疑我改变了方法
  • 我同样转向了另一种解决方案。我的命令很简单,我在运行它的服务器上使用了 SSH 命令锁定密钥和 php ssh。 SSH 从 selinux 中“爆发”,从而解决了它。尽管公然滥用 SSH。我什至不确定我是否想将其视为我可以引以为豪的答案,但它对我有用。

标签: php selinux ufw


【解决方案1】:

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

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

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

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

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

ssh-keygen -f id_rsa_commandyouwant -P ''

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

回声 -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

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

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

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

所以,而不是:

exec("sudo /sbin/ufw {command}")

试试:

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}

系统管理愉快!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-11
    • 2022-01-13
    • 2012-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    相关资源
    最近更新 更多