简而言之,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 中创建并运行以下脚本,则会因权限被拒绝而失败:`
如果我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
如果我添加<?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 的组。这就是谜题。