允许 apache 服务使用 sudo 在另一个用户上执行命令。正确设置 SELinux

允许 apache 服务使用 sudo 在另一个用户上执行命令。正确设置 SELinux

我想允许 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 用户sudosysadm_ustaff_u。我找不到一种直接的方法来授予system_uApache 进程使用的 此类权限。

设置布尔值httpd_can_network_connect可能是一种选择。它将允许您的自定义命令工作,但它也会允许在 Apache 上下文中运行的任何 PHP 脚本创建任意 TCP 连接。

相关内容