0

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

所以我在生产服务器上有一个用户 apache。如果我运行,id apache我会将 apache 视为多个组的成员,包括groupa. 如果我grep apache /etc/groups可以看到这些组成员身份未在本地定义,并且来自 LDAP。

我有一个具有权限/u/dir的文件夹root:groupag+rws

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

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

如果我id apache从 shell 运行,它会显示: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 所以我不想在每台服务器上手动复制每个组)

我还要补充一点,我怀疑我们的服务器正在id通过 LDAP 从 LDAP 获取信息sssd

看到: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(as apache:apache)时,它会拾取apache作为成员的本地组并将它们添加到子组('Groups' in /proc/$$/status),它不是t 选择apache属于 via sssd 的组。这就是谜题。

4

2 回答 2

0

您正在将苹果与梨进行比较。

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

但是,当您运行 PHP 脚本时,它不仅由 apache 用户运行,而且由 apache 守护程序运行,该守护程序具有配置参数,即它的子进程应该运行哪个用户和哪个组。这会覆盖系统信息。我很确定您的 apaches httpd.conf 在某处包含组和用户“apache”。因此 PHP 脚本以用户 apache 和组 apache 的身份执行 - 由于配置设置,只有一个组。

我不确定当你调用这个 PHP 脚本时会发生什么:

<?php
echo shell_exec("/bin/bash id");

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

于 2018-08-03T21:04:37.863 回答
0

事实证明我根本没有问题。有人将 apache 用户的主要组更改为我的远程组(在我的示例中为 groupa),因此当 apache 根据 httpd.conf 文件以 apache:apache 运行时,它正在覆盖该主要组。由于 apache 实际上不是 groupa 的成员,因此它似乎放弃了该组。

于 2018-08-08T12:56:12.393 回答