5.3. Correção de recusas de SELinux analisadas
Na maioria dos casos, as sugestões fornecidas pela ferramenta sealert
lhe dão a orientação correta sobre como corrigir problemas relacionados com a política SELinux. Consulte Analisando as mensagens de recusa da SELinux para obter informações sobre como utilizar sealert
para analisar as recusas da SELinux.
Tenha cuidado quando a ferramenta sugerir o uso da ferramenta audit2allow
para mudanças de configuração. Você não deve usar audit2allow
para gerar um módulo de política local como sua primeira opção quando você vê uma negação do SELinux. A solução de problemas deve começar com uma verificação se houver um problema de etiquetagem. O segundo caso mais frequente é que você alterou uma configuração de processo, e esqueceu de informar ao SELinux sobre isso.
Problemas de etiquetagem
Uma causa comum de problemas de rotulagem é quando um diretório não-padrão é usado para um serviço. Por exemplo, em vez de usar /var/www/html/
para um site, um administrador pode querer usar /srv/myweb/
. No Red Hat Enterprise Linux, o diretório /srv
é etiquetado com o tipo var_t
. Arquivos e diretórios criados em /srv
herdam este tipo. Além disso, objetos recém-criados em diretórios de nível superior, como /myserver
, podem ser etiquetados com o tipo default_t
. O SELinux impede que o Servidor HTTP Apache (httpd
) acesse os dois tipos. Para permitir o acesso, o SELinux deve saber que os arquivos em /srv/myweb/
devem ser acessíveis por httpd
:
# semanage fcontext -a -t httpd_sys_content_t "/srv/myweb(/.*)?"
Este comando semanage
adiciona o contexto do diretório /srv/myweb/
e todos os arquivos e diretórios sob ele à configuração de contexto de arquivo SELinux. O utilitário semanage
não altera o contexto. Como root, use o utilitário restorecon
para aplicar as mudanças:
# restorecon -R -v /srv/myweb
Contexto incorreto
O utilitário matchpathcon
verifica o contexto de um caminho de arquivo e o compara com a etiqueta padrão para esse caminho. O exemplo a seguir demonstra o uso do matchpathcon
em um diretório que contém arquivos com rótulos incorretos:
$ matchpathcon -V /var/www/html/*
/var/www/html/index.html has context unconfined_u:object_r:user_home_t:s0, should be system_u:object_r:httpd_sys_content_t:s0
/var/www/html/page1.html has context unconfined_u:object_r:user_home_t:s0, should be system_u:object_r:httpd_sys_content_t:s0
Neste exemplo, os arquivos index.html
e page1.html
estão etiquetados com o tipo user_home_t
. Este tipo é utilizado para arquivos em diretórios residenciais de usuários. O uso do comando mv
para mover arquivos de seu diretório home pode resultar em arquivos rotulados com o tipo user_home_t
. Este tipo não deve existir fora dos diretórios home. Use o utilitário restorecon
para restaurar tais arquivos ao seu tipo correto:
# restorecon -v /var/www/html/index.html
restorecon reset /var/www/html/index.html context unconfined_u:object_r:user_home_t:s0->system_u:object_r:httpd_sys_content_t:s0
Para restaurar o contexto para todos os arquivos sob um diretório, use a opção -R
:
# restorecon -R -v /var/www/html/
restorecon reset /var/www/html/page1.html context unconfined_u:object_r:samba_share_t:s0->system_u:object_r:httpd_sys_content_t:s0
restorecon reset /var/www/html/index.html context unconfined_u:object_r:samba_share_t:s0->system_u:object_r:httpd_sys_content_t:s0
Aplicações confinadas configuradas de forma não-padronizada
Os serviços podem ser executados de diversas maneiras. Para isso, é necessário especificar como você administra seus serviços. Você pode conseguir isso através das booleans SELinux que permitem que partes da política da SELinux sejam alteradas no momento da execução. Isto permite mudanças, tais como permitir o acesso de serviços a volumes NFS, sem recarregar ou recompilar a política SELinux. Além disso, a execução de serviços em números de portas não padrão requer que a configuração da política seja atualizada usando o comando semanage
.
Por exemplo, para permitir que o Servidor HTTP Apache se comunique com a MariaDB, habilite o booleano httpd_can_network_connect_db
:
# setsebool -P httpd_can_network_connect_db on
Note que a opção -P
faz com que a configuração seja persistente em todas as reinicializações do sistema.
Se o acesso for negado para um determinado serviço, use os utilitários getsebool
e grep
para ver se há alguma booleana disponível para permitir o acesso. Por exemplo, use o comando getsebool -a | grep ftp
para pesquisar booleans relacionados ao FTP:
$ getsebool -a | grep ftp
ftpd_anon_write --> off
ftpd_full_access --> off
ftpd_use_cifs --> off
ftpd_use_nfs --> off
ftpd_connect_db --> off
httpd_enable_ftp_server --> off
tftp_anon_write --> off
Para obter uma lista de booleanos e descobrir se eles estão habilitados ou desabilitados, use o comando getsebool -a
. Para obter uma lista de booleans incluindo seu significado, e para descobrir se eles estão habilitados ou desabilitados, instale o pacote selinux-policy-devel
e use o comando semanage boolean -l
como root.
Números das portas
Dependendo da configuração da política, os serviços só podem ser executados com certos números de portas. Tentar mudar a porta em que um serviço funciona sem mudar a política pode resultar na falha no início do serviço. Por exemplo, execute o comando semanage port -l | grep http
como root para listar http
portas relacionadas:
# semanage port -l | grep http
http_cache_port_t tcp 3128, 8080, 8118
http_cache_port_t udp 3130
http_port_t tcp 80, 443, 488, 8008, 8009, 8443
pegasus_http_port_t tcp 5988
pegasus_https_port_t tcp 5989
O tipo de porta http_port_t
define as portas em que o Servidor HTTP Apache pode ouvir, que neste caso são as portas TCP 80, 443, 488, 8008, 8009, e 8443. Se um administrador configura httpd.conf
para que httpd
escute na porta 9876 (Listen 9876
), mas a política não é atualizada para refletir isto, o seguinte comando falha:
# systemctl start httpd.service Job for httpd.service failed. See 'systemctl status httpd.service' and 'journalctl -xn' for details. # systemctl status httpd.service httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled) Active: failed (Result: exit-code) since Thu 2013-08-15 09:57:05 CEST; 59s ago Process: 16874 ExecStop=/usr/sbin/httpd $OPTIONS -k graceful-stop (code=exited, status=0/SUCCESS) Process: 16870 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND (code=exited, status=1/FAILURE)
Uma mensagem de negação da SELinux semelhante à seguinte está registrada em /var/log/audit/audit.log
:
type=AVC msg=audit(1225948455.061:294): avc: denied { name_bind } for pid=4997 comm="httpd" src=9876 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=system_u:object_r:port_t:s0 tclass=tcp_socket
Para permitir que httpd
escute em uma porta que não esteja listada para o tipo http_port_t
, use o comando semanage port
para atribuir uma etiqueta diferente à porta:
# semanage port -a -t http_port_t -p tcp 9876
A opção -a
acrescenta um novo registro; a opção -t
define um tipo; e a opção -p
define um protocolo. O último argumento é o número da porta a ser adicionado.
Cantos, aplicações evolutivas ou quebradas, e sistemas comprometidos
As aplicações podem conter bugs, fazendo com que a SELinux negue o acesso. Além disso, as regras do SELinux estão evoluindo
Para estas situações, após o acesso ser negado, use o utilitário audit2allow
para criar um módulo de política personalizada para permitir o acesso. Você pode relatar a falta de regras na política SELinux em Red Hat Bugzilla. Para o Red Hat Enterprise Linux 8, crie bugs contra o produto Red Hat Enterprise Linux 8
, e selecione o componente selinux-policy
. Inclua a saída dos comandos audit2allow -w -a
e audit2allow -a
em tais relatórios de bugs.
Se um pedido pede grandes privilégios de segurança, pode ser um sinal de que o pedido está comprometido. Use ferramentas de detecção de intrusão para inspecionar tal comportamento suspeito.
O Solution Engine no Portal do Cliente da Red Hat também pode fornecer orientações na forma de um artigo contendo uma possível solução para o mesmo problema ou para um problema muito semelhante. Selecione o produto e versão relevantes e use palavras-chave relacionadas ao SELinux, como selinux ou avc, juntamente com o nome de seu serviço ou aplicativo bloqueado, por exemplo: selinux samba
.