简而言之,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/方向
但是,如果我在PHP中创建并运行以下脚本,它将失败,并被拒绝权限:`
如果我跑
id阿帕奇
从shell可以看出:
uid=48(apache) gid=123(groupa) groups=123(groupa)
但是,如果从PHP运行以下命令,则会得到不同的结果:-
uid=48(apache) gid=48(apache) groups=48(apache)
有什么想法可以解释为什么PHP(可能还有Apache/httpd进程)没有他们应该拥有的所有组成员资格,以及如何修复它?
在有人建议之前,我做了一个测试;如果我将apache添加到/etc/group s中的一个组并重新启动apache,那么上面的调用将显示新的组,但它不会通过LDAP获取apache所属的组(而这个服务器是一个池,访问远程映射/u,因此我不想在每个服务器上手动复制每个组)
我还要补充一点,我怀疑我们的服务器
id
通过LDAP获取信息
sssd
如果我加上
我可以看到,httpd进程没有
社保署
团体,只有本地的。
为了清晰起见,请编辑:
为了清楚起见,我应该加上
apache
到本地组
(300)testgroup
,然后运行
再次:-
uid=48(apache) gid=48(apache) groups=48(apache),300(testgroup)
因此,虽然很明显,但关键是核心进程权限,因为某些原因,当我启动时
httpd
(作为
apache:apache
),它正在接收本地组
阿帕奇
是中的子组(“Groups”)的成员并将其添加到该子组
/proc/$$/status
),它不是在收集那些
阿帕奇
是via sssd的成员。这就是谜团。