Eu tenho um script Perl CGI Test.cgi
em /var/www/cgi-bin/Test.cgi
. O conteúdo é simplesmente:
#!/bin/perl -T
print "Content-type: text/html\n\n";
print "Hello, World.";
O problema é que quando tento acessar esse script via navegador da Web recebo um 500 Internal Server Error
, e /var/log/httpd/error_log
tem
AH01241: error spawning CGI child: exec of '/var/www/cgi-bin/Test.cgi' failed (Permission denied): /var/www/cgi-bin/Test.cgi
I. Permissões:
Abaixo das permissões para a /var/www/cgi-bin
pasta e o Test.cgi
script (incluindo tipos SELinux)
drwxr-xr-x. 2 root root system_u:object_r:httpd_sys_script_exec_t:s0 86 Jul 10 16:37 cgi-bin
-rwxr-xr-x. 1 apache apache unconfined_u:object_r:httpd_sys_script_exec_t:s0 72 Jul 10 17:22 Test.cgi
II. httpd.conf:
User apache
Group apache
DocumentRoot "/var/www/html"
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
<Directory "/var/www/cgi-bin">
AllowOverride None
Options None
Options +ExecCGI
AddHandler cgi-script .cgi
Require all granted
</Directory>
Até agora eu tentei...
- Desativando
SELinux
e$ setenforce 0
recarregando o navegador. Sem sorte.
Por último...
# httpd -v
Server version: Apache/2.4.37 (Red Hat Enterprise Linux)
Server built: Feb 16 2024 04:23:20
# uname -a
Linux linux 4.18.0-513.24.1.el8_9.x86_64 #1 SMP Thu Mar 14 14:20:09 EDT 2024 x86_64 x86_64 x86_64 GNU/Linux
# perl -v
This is perl 5, version 26, subversion 3 (v5.26.3) built for x86_64-linux-thread-multi
O que estou perdendo aqui?
ATUALIZAÇÃO:
Graças a @larsks agora sei que o problema com a permissão negada ao chamar do terminal era devido a uma noexec
opção de montagem no /var
sistema de arquivos. Isso foi corrigido e agora posso executar o script no terminal. O problema original persiste, no entanto. Ainda vejo o mesmo erro Permissão negada ao /var/log/httpd/error_log
acessar o CGI a partir do navegador.
Certifique-se de que o caminho para Perl na linha shebang esteja correto. Normalmente, é #!/usr/bin/perl -T
Use o comando which perl para determinar a instalação do Perl que você está usando por padrão.
Verifique se /var/www/cgi-bin e seus diretórios pai podem ser acessados pelo usuário do Apache .
Use ls -ld /var/www/cgi-bin e ls -ld /var/www para verificar as permissões.
A configuração
setenforce 0
para desabilitar o SELinux temporariamente deve ser eficaz e equivalente à configuração do modo permissivo na configuração e reinicialização. Se setenforce 0 não funcionar, sugere que o problema pode não estar relacionado ao SELinux.Confirme se o sistema de arquivos onde /var/www/cgi-bin está localizado não possui a opção noexec definida.
Remonte-o sem noexec, se necessário.
Verifique novamente a configuração do Apache para garantir que ela permite a execução de CGI. Houve um redundante "Opções Nenhuma".
Além disso, certifique-se de que o usuário do Apache tenha um shell válido em /etc/passwd. O usuário do Apache deve ter algo como /sbin/nologin. Se estiver definido como /bin/false, altere-o para /sbin/nologin .
Para garantir que os scripts PERL possam ser executados, crie um script CGI simples para imprimir as variáveis de ambiente, como este:
Crie /var/www/cgi-bin/Test.cgi
Em seguida, adicione este conteúdo a ele
Use :wq para gravar o arquivo e sair.
Certifique-se de que o contexto do SELinux esteja definido corretamente. Você pode tentar redefinir o contexto:
Verifique se o apache pode ler e executar o script:
O script deve ser executado sem erros. Isso pode ajudar a diagnosticar se há alguma variável de ambiente ausente ou problemática.
Usando um navegador da web, acho que você o encontrará em:
** Exclua Test.cgi quando não for mais necessário!**
Reinicie o Apache depois de fazer qualquer alteração na configuração usando systemctl restart httpd .
Verifique os registros de auditoria para obter informações detalhadas sobre o motivo da negação da permissão:
Se você tentou tudo isso e ainda está encontrando problemas, compartilhe novas mensagens de erro ou registros que possam fornecer contexto adicional para solução de problemas adicionais. Adicione-os nos comentários, para que possamos ter uma ideia de onde procurar a seguir.
Se você ainda estiver tendo problemas com o SELinux, aqui está um script genérico que pode ajudá-lo a evitar baixar a guarda:
Ele instala os pacotes necessários: policycoreutils-python-utils e setroubleshoot-server.
Define o SELinux para o modo permissivo: Isso registra violações de política sem aplicá-las.
Gera e aplica um módulo de política SELinux: permite ações previamente bloqueadas.
Analisa negações do SELinux: salva análises detalhadas em selinux_análise.txt.
Revisa negações recentes do SELinux: salva negações recentes em recent_denials.txt.
Salve-o e torne-o executável:
Execute o script como root:
Este script automatiza as etapas necessárias para diagnosticar e resolver problemas do SELinux sem desabilitar completamente o SELinux. Ele garante que seu sistema permaneça seguro enquanto soluciona problemas específicos.
Boa sorte!
A solução foi desabilitar completamente o SELinux . Verifiquei que no modo Permissivo simplesmente não funcionaria.
Para desabilitar o SELinux definido
SELINUX=disabled
em/etc/selinux/config