首页 > 解决方案 > 获取内部服务器错误,权限被拒绝在centos linux上的apache下运行cgi

问题描述

服务器错误日志中可能会提供通常的内部服务器错误以及有关此错误的更多信息。

selinux 正在执行,但注意到在日志中列出(我确实允许但我在历史记录中找不到它,但我认为它是 semanage fcontext -a -t httpd_sys_content_t '/data/srv/www(/.*)?' 和 restorecon - RFvv /data/srv/www 验证 httpd 守护进程作为 apache 运行,并且它的组是 apache。(使用 ps -ef|grep httpd 和 id apache)

一路上的权限看起来不错

[root@bilbo public_html]# ls -l /data/srv/www/public_html/test.cgi;

-rwxr-xr-x. 1 user apache 208 Oct  8 02:34 /data/srv/www/public_html/test.cgi
# ls -dl /data/srv/www/public_html/ /data/srv/www/ /data/srv/ /data/srv/ /data/ 
drwxr-xr-x.  7 root root     97 Oct  8 00:26 /data/
drwxr-xr-x.  3 user apache   17 Oct  7 23:34 /data/srv/
drwxr-xr-x.  3 user apache   17 Oct  7 23:34 /data/srv/
drwxr-xr-x.  7 user apache  167 Oct  8 01:40 /data/srv/www/
drwxr-xr-x. 19 user apache 4096 Oct  8 02:34 /data/srv/www/public_html/

我的配置文件

[root@bilbo public_html] # cat /etc/httpd/conf.d/domainname.com.conf

<VirtualHost *:80>
    ServerName domainname.bilbo
    ServerAlias www.domainname.bilbo domainname.bilbo.middleearth www.domainname.bilbo.middleearth
    ServerAdmin webmaster@example.com
    DocumentRoot /data/srv/www/public_html

    <Directory /data/srv/www/public_html>
        Options -Indexes +FollowSymLinks +ExecCGI
        AllowOverride All
        AddHandler cgi-script .cgi
    DirectoryIndex index.html index.cgi index.php
    Require all granted
    </Directory>
    ErrorLog /var/log/httpd/domainname.com-error.log
    CustomLog /var/log/httpd/domainname.com-access.log combined
</VirtualHost>

[root@bilbo public_html]# tail /var/log/httpd/domainname.com-error.log

[Fri Oct 08 09:39:06.491759 2021] [cgid:error] [pid 1204081:tid 139698072696576] [client 10.0.0.10:57760] AH01241: error spawning CGI child: exec of '/data/srv/www/public_html/test.cgi' failed (Permission denied): /data/srv/www/public_html/test.cgi
[Fri Oct 08 09:39:06.492344 2021] [cgid:error] [pid 1204081:tid 139698072696576] [client 10.0.0.10:57760] End of script output before headers: test.cgi

猫 /data/srv/www/public_html/test.cgi

#!/usr/bin/perl
use strict;
use warnings;
print "Content-type: text/html\n\n";
print "hello w\n";

sudo -u apache /data/srv/www/public_html/test.cgi

Content-type: text/html

hello w

检查模块

[root@bilbo public_html]# grep -v "^#" /etc/httpd/conf.modules.d/01-cgi.conf

<IfModule mpm_worker_module>
   LoadModule cgid_module modules/mod_cgid.so
</IfModule>
<IfModule mpm_event_module>
   LoadModule cgid_module modules/mod_cgid.so
</IfModule>
<IfModule mpm_prefork_module>
   LoadModule cgi_module modules/mod_cgi.so
</IfModule>

[root@bilbo public_html] # egrep -v '^#|^$' /etc/httpd/conf.modules.d/00-mpm.conf

LoadModule mpm_event_module modules/mod_mpm_event.so

好吧,我正在拉扯我的头发,但是为了咧嘴笑和咯咯笑,我禁用了 selinux(setenforce 0)并尝试了,它起作用了.....所以在 wtf 之后,我启用了 selinux(setenforce 1)

这就是我放入(IIRC)以使其工作的内容

# semanage fcontext -m -t httpd_sys_script_exec_t '/data/srv/www(/.*)?'
# restorecon -RFvv /data/srv/www

所以是的,在 /var/log/messages 和 sealert -a /var/log/audit/audit.log 中没有任何东西表明 selinux 正在阻止任何东西......

标签: linuxapacheperlcgiselinux

解决方案


好吧,我正在拉扯我的头发,但是为了咧嘴笑和咯咯笑,我禁用了 selinux(setenforce 0)并尝试了,它起作用了.....所以在 wtf 之后,我启用了 selinux(setenforce 1)

这就是我放入(IIRC)以使其工作的内容

# semanage fcontext -m -t httpd_sys_script_exec_t '/data/srv/www(/.*)?'
# restorecon -RFvv /data/srv/www

所以是的,在 /var/log/messages 和 sealert -a /var/log/audit/audit.log 中没有任何东西表明 selinux 正在阻止任何东西......


推荐阅读