我想允许 PHP 脚本使用 exec 与另一个用户一起执行外部命令。为此,我像这样调用命令:
exec('sudo -u username /usr/bin/command -a arg1 --arg2 arg2');
在 sudoers 规则中,我添加了:
apache ALL=(username)NOPASSWD: /usr/bin/command
命令发送 TCP 数据包。当 SELinux 禁用时,它可以工作。
为了允许 SELinux,我已通过 setroubleshoot rapport 启用:
- httpd_setrlimit——为什么 apache 要改变执行简单命令的限制?
- httpd_mod_auth_pam——好的,apache 可以使用 pam,为什么不呢。
- httpd_unified——为什么 apache 想要访问 memcache??
但是,即使在此之后,经过日志分析,我有“unix_chkpwd”,并且为了终止 SELinux 配置,apache 需要读取影子文件。
ausearch -c 'unix_chkpwd' -ts recent --raw | audit2allow
#============= httpd_t ==============
allow httpd_t chkpwd_t:process { noatsecure rlimitinh siginh };
allow httpd_t shadow_t:file { getattr open read };
真的有必要添加这个模块吗? apache 无法用其他用户执行一个简单的命令吗?
如何针对这个简单的操作优化我的 SELinux 配置?
此致,
答案1
在我的 RHEL7 测试虚拟机中,设置布尔值httpd_mod_auth_pam
允许 PHP 脚本以不同的 Linux 用户和不变的 SELinux 上下文调用sudo
和执行命令:
<?php
passthru ('sudo -u username id 2>&1');
uid=1001(username) gid=1001(username) groups=1001(username) context=system_u:system_r:httpd_t:s0
根据 (此引用),唯一允许使用 转换到不同 SELinux 上下文的受限 SELinux 用户sudo
是sysadm_u
和staff_u
。我找不到一种直接的方法来授予system_u
Apache 进程使用的 此类权限。
设置布尔值httpd_can_network_connect
可能是一种选择。它将允许您的自定义命令工作,但它也会允许在 Apache 上下文中运行的任何 PHP 脚本创建任意 TCP 连接。