PHP 运行 作为 apache 用户,不是 apache 所属的任何 LDAP 组的成员

PHP running as apache user, isn't a member of any LDAP groups of which apache is a member

在 PHP 作为用户 apache 执行的简短代码中,似乎没有对 apache 所属的组的写入权限,apache 可以在 shell 上写入。

所以我在生产服务器上有一个用户 apache。如果我 运行 id apache 我将 apache 视为多个组的成员,包括 groupa。如果我 grep apache /etc/groups 我可以看到那些组成员资格不是在本地定义的,而是来自 LDAP。

我有一个文件夹 /u/dir,属于 root:groupa,权限为 g+rws

如果我 运行 sudo su -s /bin/bash -c "mkdir /u/dir/subdir" apache 它工作正常,apache 确实有权在 /u/dir

中创建 files/folders

但是,如果我在 PHP 中创建并 运行 以下脚本,它会因权限被拒绝而失败:`

如果我从shell运行id apache,它显示:uid=48(apache) gid=123(groupa) groups=123(groupa)

但是,如果我 运行 来自 PHP 的以下内容,我会得到不同的结果:-

<?php echo shell_exec("id");?>

uid=48(apache) gid=48(apache) groups=48(apache)

知道为什么 PHP(大概是 Apache/httpd 过程)没有他们应该拥有的所有组成员资格吗?我该如何解决?

在有人建议之前,我确实做了一个测试;如果我将 apache 添加到 /etc/groups 中的一个组并重新启动 apache,则上面的调用会显示新组,但它不会通过 LDAP 选择 apache 所属的组(并且此服务器是池之一,访问远程映射的 /u 所以我不想在每个服务器上本地手动复制每个组)

我还要补充一点,我怀疑我们的服务器正在通过 sssd

从 LDAP 获取 id 信息

看到:https://unix.stackexchange.com/questions/409843/how-to-get-the-supplementary-groups-ids-of-a-process

如果我添加 <?php echo shell_exec("cat /proc/$$/status"); ?> 我可以看到 httpd 进程没有选择任何 sssd 组,只有本地组。

为清楚起见编辑:

为清楚起见,我应该添加我测试了将 apache 添加到本地组 (300)testgroup,然后再次 运行 <?php echo shell_exec("id");?>:-

uid=48(apache) gid=48(apache) groups=48(apache),300(testgroup)

因此,虽然很明显核心进程权限很重要,但出于某种原因,当我启动 httpd(如 apache:apache)时,它会获取 apache 的本地组是子组的成员并将它们添加到子组(/proc/$$/status 中的'Groups'),它不会通过 sssd 选择 apache 是其成员的组。这就是谜题。

您是在比较苹果和梨。

您在 运行 中作为用户 apache returns 在 运行 中使用的脚本 shell 为用户提供的信息。

但是当你 运行 你的 PHP-脚本时,它不仅是 apache 用户的 运行,还有 apache 守护进程,它有一个配置参数作为 which user 和 which对其子流程进行分组应 运行。这会覆盖系统信息。我很确定您的 apaches httpd.conf 在某处包含组和用户 "apache"。因此,PHP-脚本作为用户 apache 和组 apache 执行 - 由于配置设置,只有那个组。

我不确定当你调用这个 PHP-script:

时会发生什么
<?php
echo shell_exec("/bin/bash id");

因为这可能会调用一个新的 bash-session。

原来我一点问题都没有。有人将 apache 用户的主要组更改为我的远程组(在我的示例中为 groupa),因此根据 httpd.conf 文件,当 apache 运行 as apache:apache 时,它会覆盖该主要组团体。由于 apache 实际上不是 groupa 的成员,所以它似乎要删除该组。