Apache: Permissão negada: exec de '/var/www/html/cgi-test/first.pl' falhou

4

Então, sou novo no CGI / Perl, estou tentando mover um aplicativo da Web baseado em Perl para um novo servidor.

Meu novo servidor é o CentOS 7, que executa o Apache HTTPD 2.4.6.

Estou tentando fazer com que um CGI Perl básico funcione a partir de uma solicitação HTTP.

A solicitação da web está retornando "500 Internal Server Error"

O log de erros está mostrando "permissão negada":

[Tue May 12 16:56:44.604660 2015] [cgi:error] [pid 12302] [client 10.0.2.2:56693] AH01215: (13)Permission denied: exec of '/var/www/html/cgi-test/first.pl' failed
[Tue May 12 16:56:44.604708 2015] [cgi:error] [pid 12302] [client 10.0.2.2:56693] End of script output before headers: first.pl

Meu script CGI está em /var/www/html/cgi-test/first.pl

Parece assim:

#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "Hello, World.";

No diretório cgi-test, as permissões são assim:

drwxr-xr-x. 2 root root 21 May 12 16:48 .
drwxr-xr-x. 4 root root 32 May 12 16:48 ..
-r-xr-xr-x. 1 root root 76 May 12 16:48 first.pl

Perl está no lugar normal e eu acho que as permissões normais

[root@localhost cgi-test]# ls -al /usr/bin/perl
-rwxr-xr-x. 2 root root 11400 Mar  6 05:07 /usr/bin/perl

Meu httpd.conf é o padrão. Acabei de adicionar a seção a seguir para permitir cgi no meu diretório cgi-test:

<Directory "/var/www/html/cgi-test">
    Options +ExecCGI
    AddHandler cgi-script .cgi .pl
</Directory>

Para eliminar a possibilidade de o suexec ser a causa deste problema, movi-o de / usr / sbin / suexec para outro nome de arquivo.

O Httpd está rodando como usuário "apache" que está no grupo "apache"

[root@localhost cgi-test]# ps -Af | grep httpd
root     12298     1  0 16:56 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache   12299 12298  0 16:56 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache   12300 12298  0 16:56 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache   12301 12298  0 16:56 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache   12302 12298  0 16:56 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache   12303 12298  0 16:56 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
root     12342 12260  0 17:20 pts/0    00:00:00 grep --color=auto httpd
[root@localhost cgi-test]# groups apache
apache : apache

Eu tentei executar o script como apache, ele funciona sem nenhum problema.

[root@localhost cgi-test]# su -s /bin/bash apache
bash-4.2$ perl /var/www/html/cgi-test/first.pl 
Content-type: text/html

Hello, World.bash-4.2$

Presumivelmente estou acertando alguma precaução de segurança do Apache. Muitos conselhos conflitantes sobre o que isso poderia ser. Qualquer ajuda muito apreciada.

    
por oggotron 12.05.2015 / 18:37

3 respostas

0

A resposta foi que o SELinux estava bloqueando o acesso ao script.

Obrigado ao alphamikevictor por sugerir esta resposta.

Por padrão no CentOS 7 o SELinux está habilitado e bloqueia o perl / CGI. Confirmei que estava ativado usando / usr / bin / sestatus

No servidor antigo, o SELinux foi desativado completamente.

    
por 13.05.2015 / 11:14
0

Vejo a partir de sua própria resposta que era um problema de permissões do SELinux devido à tentativa de executar scripts CGI a partir do Apache em um diretório não padrão.

A maneira correta de resolver o problema de permissões, mantendo o SELinux no modo 'enforcing' e, assim, melhorando a segurança do seu servidor é aplicar o contexto apropriado aos arquivos no diretório de script CGI personalizado. Se for para ser um diretório permanente, você deve alterar a política do selinux para criar automaticamente novos arquivos com as devidas permissões.

Você pode verificar a política do selinux para o diretório cgi-bin com o comando:

$ semanage fcontext --list | grep cgi-bin 
 (...)
/var/www/[^/]*/cgi-bin(/.*)?                       all files          system_u:object_r:httpd_sys_script_exec_t:s0
/var/www/html/[^/]*/cgi-bin(/.*)?                  all files          system_u:object_r:httpd_sys_script_exec_t:s0
 (...)

Isso significa que todos os arquivos criados dentro dos diretórios padrão cgi-bin para o apache receberão automaticamente o tipo SELinux httpd_sys_script_exec_t e serão executáveis pelo httpd, então é isso que seus arquivos no diretório cgi-test devem ter também .

NOTA: os exemplos mostrados abaixo são baseados no CentOS / RHEL6, ele deve funcionar da mesma forma para o RHEL7 com o ajuste final.

Solução temporária

Você pode simplesmente alterar o contexto SELinux do seu script perl com:

$ chcon -t httpd_sys_script_exec_t /var/www/html/cgi-test/first.pl

Verifique os atributos do SELinux do arquivo com ls -laZ :

$ ls -laZ /var/www/html/cgi-test/first.pl
-rwxr-xr-x. root root system_u:object_r:httpd_sys_script_exec_t:s0 /var/www/html/cgi-test/first.pl

No entanto, se houver uma operação de reclassificação do SELinux nesse sistema de arquivos, os atributos serão revertidos para os padrões e parará de funcionar novamente. Também terá que ser feito toda vez que um novo script CGI for adicionado.

Solução definida

Você pode alterar a política do SELinux adicionando uma regra para seu diretório CGI personalizado e todos os subdiretórios e arquivos contidos.

Isso é feito por meio do comando semanage (disponível no pacote policycoreutils-python RPM):

$ semanage fcontext -a -t httpd_sys_script_exec_t "/var/www/html/cgi-test(/.*)?"

Isso vai demorar um pouco para ser executado. Depois de alterar a política, todos os novos arquivos criados em seu diretório personalizado terão o novo contexto. Para aqueles que já estão lá, você pode aplicar a política manualmente com:

$ restorecon -R -v /var/www/html/cgi-test

Você pode verificar sua regra recém-adicionada com:

$ semanage fcontext --list | grep cgi-test
    
por 13.09.2017 / 13:02
-2

Certifique-se de ter adicionado ScriptAlias na configuração do apache, como abaixo

ScriptAlias /cgi-test/ /var/www/html/cgi-test/

Além disso, tente adicionar FollowSymLinks à diretiva Options.

    
por 12.05.2015 / 20:12