Perl cgi 脚本无法读取与其父目录具有相同权限的目录

Posted

技术标签:

【中文标题】Perl cgi 脚本无法读取与其父目录具有相同权限的目录【英文标题】:Perl cgi script can not read a directory that has the same permission as its parent directory 【发布时间】:2021-04-26 01:47:16 【问题描述】:

我们的新 Apache 服务器出现了一个奇怪的问题。 当我的 cgi 脚本尝试读取目录时,系统给了我权限被拒绝:

CGI 脚本:

#!/usr/bin/perl 
print "Content-Type: Text/html\n\n";
# print `ls -altr / 2>&1`;
print `ls -altr /opt 2>&1`;
print `ls -altr /opt/NA 2>&1`;

同样的代码在我们的旧 apache 服务器 (v.2.2.15) 上运行。 我可以得到“/”和“/opt”的输出,但是当我尝试列出“/opt/NA”时,我得到了 Permission Denied。

我看不出这两个目录有什么区别:

[root@myapache ~]# curl -k https://10.14.13.1/cgi-bin/listfile.cgi

total 12
drwxr-xr-x.  2 root root    6 Aug 25  2018 rh
drwxr-xr-x.  9 root root  110 Aug 18 15:17 .             ##### this is the /opt
drwxr-xr-x.  5 root root 4096 Nov 18 14:22 chef
drwxr-xr-x.  5 root root   43 Nov 18 14:28 mcafee
drwxrwxr-x.  6 root root 4096 Nov 18 14:29 unified-monitoring-agent
drwxr-xr-x.  7 root root   80 Dec 16 14:59 McAfee
dr-xr-xr-x. 20 root root 4096 Dec 20 06:05 ..
drwxr-xr-x.  4 root root   32 Dec 20 06:05 isec
drwxr-xr-x.  4 root root   40 Jan 12 18:24 NA            ##### this is the /opt/NA
ls: cannot open directory /opt/NA: Permission denied

知道这如何成为一个问题吗?

【问题讨论】:

尝试将 -Z 标志添加到每个 ls 命令以显示安全上下文。列表中 'r-x' 后面的点表示每个文件都有额外的上下文 - 例如ACL 或 Selinux。 当你su给CGI用户试一试会发生什么? 【参考方案1】:

感谢 Dave Mitchell 的建议,我这样做并更新了安全上下文位:

[root@nccm-prod-dr-mt5 opt]# ls -Z
drwxr-xr-x. root root system_u:object_r:usr_t:s0       chef
drwxr-xr-x. root root system_u:object_r:usr_t:s0       isec
drwxr-xr-x. root root system_u:object_r:usr_t:s0       mcafee
drwxr-xr-x. root root system_u:object_r:usr_t:s0       McAfee
drwxr-xr-x. root root system_u:object_r:unlabeled_t:s0 NA
drwxr-xr-x. root root system_u:object_r:usr_t:s0       rh
drwxrwxr-x. root root system_u:object_r:usr_t:s0       unified-monitoring-agent

[root@nccm-prod-dr-mt5 opt]# chcon system_u:object_r:usr_t:s0 NA
[root@nccm-prod-dr-mt5 opt]# ls -Z
drwxr-xr-x. root root system_u:object_r:usr_t:s0       chef
drwxr-xr-x. root root system_u:object_r:usr_t:s0       isec
drwxr-xr-x. root root system_u:object_r:usr_t:s0       mcafee
drwxr-xr-x. root root system_u:object_r:usr_t:s0       McAfee
drwxr-xr-x. root root system_u:object_r:usr_t:s0       NA
drwxr-xr-x. root root system_u:object_r:usr_t:s0       rh
drwxrwxr-x. root root system_u:object_r:usr_t:s0       unified-monitoring-agent

它现在正在工作。

【讨论】:

以上是关于Perl cgi 脚本无法读取与其父目录具有相同权限的目录的主要内容,如果未能解决你的问题,请参考以下文章

用 CGI 在 perl 中读取文件?

为啥我的 Perl CGI 脚本找不到 Oracle DBD?

如何配置 Apache 2 以运行 Perl CGI 脚本?

Apache服务器中运行CGI程序的方法,文中以Perl脚本作为示例

如何在 localhost 中运行 perl 脚本?

如何从命令行测试Perl CGI脚本的文件上传?