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 的成员,所以它似乎要删除该组。
在 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
但是,如果我在 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
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 的成员,所以它似乎要删除该组。