AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / server / Perguntas / 1162351
Accepted
Aerozeek
Aerozeek
Asked: 2024-07-11 08:55:43 +0800 CST2024-07-11 08:55:43 +0800 CST 2024-07-11 08:55:43 +0800 CST

Perl CGI falha com permissão negada - AH01241: Erro ao gerar filho CGI

  • 772

Eu tenho um script Perl CGI Test.cgiem /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_logtem

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-binpasta e o Test.cgiscript (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 SELinuxe $ setenforce 0recarregando 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 noexecopção de montagem no /varsistema 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_logacessar o CGI a partir do navegador.

apache-2.4
  • 2 2 respostas
  • 289 Views

2 respostas

  • Voted
  1. Max Haase
    2024-07-11T10:01:57+08:002024-07-11T10:01:57+08:00

    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 0para 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.

    mount | grep ' /var'
    

    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".

    User apache
    Group apache
    
    DocumentRoot "/var/www/html"
    
    # ScriptAlias for CGI directory
    ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
    
    <Directory "/var/www/cgi-bin">
        AllowOverride None
        Options +ExecCGI
        AddHandler cgi-script .cgi
        Require all granted
    </Directory>
    

    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

    sudo vim /var/www/cgi-bin/Test.cgi
    

    Em seguida, adicione este conteúdo a ele

    #!/usr/bin/perl -T
    print "Content-type: text/html\n\n";
    foreach $key (sort(keys(%ENV))) {
        print "$key = $ENV{$key}<br>\n";
    }
    

    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:

    restorecon -v /var/www/cgi-bin/Test.cgi
    

    Verifique se o apache pode ler e executar o script:

    sudo -u apache /var/www/cgi-bin/Test.cgi
    

    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:

    http://yourdomain/cgi-bin/Test.cgi
    

    ** 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:

    sudo ausearch -m avc -ts recent
    

    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.

    #!/bin/bash
    
    # if the user is root
    if [ "$(id -u)" -ne 0 ]; then
      echo "Please run this script as root or with sudo."
      exit 1
    fi
    
    #  install necessary packages
    install_packages() {
      echo "Installing necessary packages..."
      yum install -y policycoreutils-python-utils setroubleshoot-server
    }
    
    # set SELinux to permissive mode
    set_permissive() {
      echo "Setting SELinux to permissive mode..."
      setenforce 0
      if [ "$(getenforce)" != "Permissive" ]; then
        echo "Failed to set SELinux to permissive mode."
        exit 1
      fi
    }
    
    # generate and apply SELinux policy module
    generate_policy_module() {
      echo "Generating SELinux policy module..."
      ausearch -c 'httpd' --raw | audit2allow -M my-httpd
      if [ -f my-httpd.pp ]; then
        echo "Applying SELinux policy module..."
        semodule -i my-httpd.pp
      else
        echo "Failed to generate SELinux policy module."
        exit 1
      fi
    }
    
    # analyze SELinux denials
    analyze_denials() {
      echo "Analyzing SELinux denials..."
      sealert -a /var/log/audit/audit.log > selinux_analysis.txt
      echo "SELinux analysis saved to selinux_analysis.txt"
    }
    
    # review recent SELinux denials
    review_denials() {
      echo "Reviewing recent SELinux denials..."
      ausearch -m avc -ts recent > recent_denials.txt
      echo "Recent SELinux denials saved to recent_denials.txt"
    }
    
    # Main
    main() {
      install_packages
      set_permissive
      generate_policy_module
      analyze_denials
      review_denials
      echo "SELinux troubleshooting steps completed."
    }
    
    # Run the main function
    main
    

    Salve-o e torne-o executável:

    chmod +x selinux_troubleshoot.sh
    

    Execute o script como root:

    sudo ./selinux_troubleshoot.sh
    

    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!

    • 5
  2. Best Answer
    Aerozeek
    2024-07-13T13:57:47+08:002024-07-13T13:57:47+08:00

    A solução foi desabilitar completamente o SELinux . Verifiquei que no modo Permissivo simplesmente não funcionaria.

    Para desabilitar o SELinux definido SELINUX=disabledem/etc/selinux/config

    • 0

relate perguntas

  • O que significa %{REQUEST_FILENAME}.ext? Por que o final .ext extra?

  • Por que meu Apache é capaz de servir 200 arquivos .php que incluem uma barra final?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Você pode passar usuário/passar para autenticação básica HTTP em parâmetros de URL?

    • 5 respostas
  • Marko Smith

    Ping uma porta específica

    • 18 respostas
  • Marko Smith

    Verifique se a porta está aberta ou fechada em um servidor Linux?

    • 7 respostas
  • Marko Smith

    Como automatizar o login SSH com senha?

    • 10 respostas
  • Marko Smith

    Como posso dizer ao Git para Windows onde encontrar minha chave RSA privada?

    • 30 respostas
  • Marko Smith

    Qual é o nome de usuário/senha de superusuário padrão para postgres após uma nova instalação?

    • 5 respostas
  • Marko Smith

    Qual porta o SFTP usa?

    • 6 respostas
  • Marko Smith

    Linha de comando para listar usuários em um grupo do Windows Active Directory?

    • 9 respostas
  • Marko Smith

    O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL?

    • 3 respostas
  • Marko Smith

    Como determinar se uma variável bash está vazia?

    • 15 respostas
  • Martin Hope
    Davie Ping uma porta específica 2009-10-09 01:57:50 +0800 CST
  • Martin Hope
    kernel O scp pode copiar diretórios recursivamente? 2011-04-29 20:24:45 +0800 CST
  • Martin Hope
    Robert ssh retorna "Proprietário incorreto ou permissões em ~/.ssh/config" 2011-03-30 10:15:48 +0800 CST
  • Martin Hope
    Eonil Como automatizar o login SSH com senha? 2011-03-02 03:07:12 +0800 CST
  • Martin Hope
    gunwin Como lidar com um servidor comprometido? 2011-01-03 13:31:27 +0800 CST
  • Martin Hope
    Tom Feiner Como posso classificar a saída du -h por tamanho 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent Como determinar se uma variável bash está vazia? 2009-05-13 09:54:48 +0800 CST

Hot tag

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve