我正在尝试创建一个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}
用户:apache
Linux:RHEL 7.5
答案 0 :(得分: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”,无端口转发,无x11转发,无代理转发'>> /root/.ssh/authorized_keys
cat id_rsa_commandyouwant **。pub ** >> /root/.ssh/authorized_keys
我们在上面回显n的单引号中的字符串将锁定该键,因此不能将其用于获取交互式shell。当该密钥与该用户帐户一起使用时,将仅执行脚本。
如果脚本需要接收参数,则可以在脚本中使用$ {SSH_ORIGINAL_COMMAND}变量(仔细清理)。只需在调用ssh客户端时提供参数,就好像它们是命令一样,整个cmdline字符串将显示在$ {SSH_ORIGINAL_COMMAND}中。
如果您的脚本可以以非超级用户身份运行,请这样做,并替换上面的超级用户的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}
快乐的系统管理员!