O SELinux está impedindo que o script Perl CGI acesse as bibliotecas Oracle

2

Estou tentando configurar o SELinux em um servidor Web Red Hat Enterprise Linux 6.2 que executa o Apache 2.2.15 e o Perl 5.10.1, e se conecta a bancos de dados Oracle remotos. O cliente do Oracle 11.2g está instalado. Os scripts PHP que acessam o Oracle estão funcionando, mas os scripts Perl não estão. Quando o SELinux é aplicado e eu tento acessar os scripts Perl através do meu navegador, os logs de erro do Apache mostram esta mensagem:

Can't load '/usr/local/lib64/perl5/auto/DBD/Oracle/Oracle.so' for module DBD::Oracle: libclntsh.so.11.1: cannot open shared object file: No such file or directory at /usr/lib64/perl5/DynaLoader.pm line 200.

Curiosamente, o log de auditoria não registra nenhuma mensagem correspondente. No entanto, quando executo o SELinux no modo permissivo, o script Perl funciona perfeitamente.

Esta é a saída de ls -lZ em libclntsh.so.11.1:

-rwxr-xr-x. oracle oracle system_u:object_r:textrel_shlib_t:s0 /path/to/oracle/product/11.2.0/client/lib/libclntsh.so.11.1

Alguém tem alguma sugestão para corrigir isso? Eu gostaria de poder executar o servidor web com o SELinux.

UPDATE: Depois de configurar o selinux para dontaudit, obtive mais resultados em audit.log. No entanto, o módulo que criei com audit2allow não é instalado. A saída de semodule -i é: semodule: Failed on cgi_oracle!

cgi_oracle.te contém:

module cgi_oracle 1.0;

require {
    type httpd_log_t;
    type httpd_t;
    type httpd_sys_script_t;
    class process { siginh noatsecure rlimitinh };
    class file { read write };
}

#============= httpd_sys_script_t ==============
allow httpd_sys_script_t httpd_log_t:file { read write };

#============= httpd_t ==============
allow httpd_t httpd_sys_script_t:process { siginh rlimitinh noatsecure };
    
por slec 06.08.2012 / 11:11

3 respostas

4

Várias políticas do SELinux estão marcadas como dontaudit para que não deixem mensagens no log de auditoria . Geralmente, isso ocorre porque são políticas que simplesmente enviam spam ao log com entradas inúteis, mas às vezes os desenvolvedores dontaudit negam em vez de corrigir o problema subjacente. A política que você está atingindo é quase certamente entre eles, já que você não está vendo nenhuma mensagem sendo registrada em audit.log .

Você pode desativar temporariamente dontaudit executando:

semodule -DB

Depois de descobrir a causa do problema, reative dontaudit com:

semodule -B

Para criar sua política depois de gerá-la, execute:

make -f /usr/share/selinux/devel/Makefile
    
por 07.08.2012 / 00:36
1

Para identificar corretamente o problema - você deve executar o teste com o modo permissivo do SELinux, caso contrário, você precisará executar testes um por um e pode levar um tempo. Depois, pare o serviço da web, certifique-se de que seus logs de auditoria estejam vazios ou girados, execute o serviço da web, execute scripts / test, verifique os logs de auditoria e grave a nova política. Pelo que entendi, seus scripts querem acessar bibliotecas oracle para leitura, então você precisará adicionar permissão de leitura para "system_u: object_r: textrel_shlib_t: s0" em seu aplicativo. Eu não sei qual é a estrutura de rotulagem para a Oracle, mas tenho certeza que você pode descobrir. Verifique audit2allow.

    
por 06.08.2012 / 11:17
1

Você também pode tentar setroubleshoot .. ele também lhe dará pistas sobre o que está sendo restrito e os comandos para resolver o problema. Na maioria das vezes, tudo o que você precisa fazer é copiar e colar exatamente o que é dado.

yum install -y setroubleshoot

então

grep setrouble /var/log/messages

Por exemplo:

Aug  6 12:36:11 cnt3 setroubleshoot: [avc.ERROR] Plugin Exception catchall_boolean #012Traceback (most recent call last):#012  File "/usr/lib/python2.6/site-packages/setroubleshoot/analyze.py", line 191, in analyze_avc#012    report = plugin.analyze(avc)#012  File "/usr/share/setroubleshoot/plugins/catchall_boolean.py", line 90, in analyze#012    man_page = self.check_for_man(b)#012  File "/usr/share/setroubleshoot/plugins/catchall_boolean.py", line 76, in check_for_man#012    man_page = name.split("_")[0] + "_selinux"#012AttributeError: 'tuple' object has no attribute 'split'
Aug  6 12:36:11 cnt3 setroubleshoot: SELinux is preventing /usr/libexec/gdm-session-worker from read access on the directory /root. For complete SELinux messages. run sealert -l 721b07e3-e0e2-4a0e-a676-8eb622f7ce01

sealert -l 721b07e3-e0e2-4a0e-a676-8eb622f7ce01

sealert -l 721b07e3-e0e2-4a0e-a676-8eb622f7ce01
SELinux is preventing /usr/libexec/gdm-session-worker from read access on the directory /root.

*****  Plugin catchall (100. confidence) suggests  ***************************

Se você acredita que o gdm-session-worker deve ter permissão de acesso de leitura no diretório raiz por padrão. Então você deve relatar isso como um bug. Você pode gerar um módulo de política local para permitir esse acesso. Permitir este acesso por enquanto executando:

grep gdm-session-wor /var/log/audit/audit.log | audit2allow -M mypol
semodule -i mypol.pp

Siga o que o selo -l lhe diz, e acho que o seu problema deve ser resolvido. Espero que ajude.

    
por 06.08.2012 / 23:45