De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.

Resolvendo problemas com o SELinux

Colaboração: Tiago Cruz

Data de Publicação: 25 de Agosto de 2009

O objetivo deste post é ajudar as pessoas a manter o SELinux habilitado, resolvendo alguns problemas com o mesmo.

O exemplo é um LAMP com Red Hat EL 5.3 com tudo funcionando, porém um daemon vsftpd que não quer subir quando o SELinux está rodando.

Para verificar se o problema é de fato o SELinux, basta desabilita-lo temporariamente:

  [root@selinux tmp]# setenforce Permissive
  
  [root@selinux tmp]# /etc/init.d/vsftpd start
  Starting vsftpd for vsftpd:                                             [  OK  ]

Sem o SELinux, o VSFTP funciona normalmente, porém basta ativa-lo que mensagens estranhas começam a aparecer:

  [root@selinux tmp]# setenforce enforcing
  
  [root@selinux tmp]# /etc/init.d/vsftpd start
  Starting vsftpd for vsftpd: /usr/sbin/vsftpd: error while loading shared
  libraries: libssl.so.6: failed to map segment from shared object: Permission
  denied [FAILED]
  [root@selinux ~] # tail /var/log/messages Jul 27 15:01:44 selinux
  kernel: type=1107 audit(1248717704.011:1569): user pid=25449
  uid=28 auid=4294967295 subj=system_u:system_r:init_t:s0 msg='avc:
  denied  { shmempwd } for  scontext=system_u:system_r:initrc_t:s0
  tcontext=system_u:system_r:init_t:s0 tclass=nscd Jul 27 15:01:44
  selinux kernel: : exe="?" (sauid=28, hostname=?, addr=?, terminal=?)'
  Jul 27 15:01:44 selinux kernel: type=1107 audit(1248717704.012:1570):
  user pid=25449 uid=28 auid=4294967295 subj=system_u:system_r:init_t:s0
  msg='avc:  denied  { getpwd } for  scontext=system_u:system_r:initrc_t:s0
  tcontext=system_u:system_r:init_t:s0 tclass=nscd Jul 27 15:01:44
  selinux kernel: : exe="?" (sauid=28, hostname=?, addr=?, terminal=?)'
  Jul 27 15:01:44 selinux kernel: type=1107 audit(1248717704.012:1571):
  user pid=25449 uid=28 auid=4294967295 subj=system_u:system_r:init_t:s0
  msg='avc:  denied  { shmemgrp } for  scontext=system_u:system_r:initrc_t:s0
  tcontext=system_u:system_r:init_t:s0 tclass=nscd Jul 27 15:01:44
  selinux kernel: : exe="?" (sauid=28, hostname=?, addr=?, terminal=?)'
  Jul 27 15:01:44 selinux kernel: type=1107 audit(1248717704.012:1572):
  user pid=25449 uid=28 auid=4294967295 subj=system_u:system_r:init_t:s0
  msg='avc:  denied  { getgrp } for  scontext=system_u:system_r:initrc_t:s0
  tcontext=system_u:system_r:init_t:s0 tclass=nscd Jul 27 15:01:44 selinux
  kernel: : exe="?" (sauid=28, hostname=?, addr=?, terminal=?)'  Jul 27
  15:01:44 selinux kernel: type=1400 audit(1248717704.028:1573): avc:  denied
  { execute } for  pid=25644 comm="vsftpd" path="/lib64/libssl.so.0.9.8e"
  dev=sda3 ino=1488241 scontext=system_u:system_r:ftpd_t:s0
  tcontext=system_u:object_r:file_t:s0 tclass=file

Você pode observar que vários destes erros são referentes ao cache NSCD, e somente a última é de fato referente ao VSFTPd e suas bibiotecas compartilhadas.

Para ficar mais visível, vamos parar o o nscd e tratar como dois problemas distintos:

  [root@selinux selinux]# /etc/init.d/nscd stop
  Stopping nscd:                                             [  OK  ]
  
  [root@selinux selinux]# /etc/init.d/vsftpd start
  Starting vsftpd for vsftpd: /usr/sbin/vsftpd: error while loading shared
  libraries: libssl.so.6: failed to map segment from shared object: Permission
  denied [FAILED]
  [root@selinux selinux]# tail /var/log/messages
  Jul 27 15:01:52 selinux kernel: type=1400 audit(1248717712.742:1574): avc:
  denied  { execute } for  pid=25662 comm="vsftpd" path="/lib64/libssl.so.0.9.8e"
  dev=sda3 ino=1488241 scontext=system_u:system_r:ftpd_t:s0
  tcontext=system_u:object_r:file_t:s0 tclass=file

Uma das coisas mais legais que foram adicionados ao RHEL5, é o daemon setroubleshoot que ajuda a traduzir esses erros monstros do selinux para algo que um humano consiga entender.

A ferramenta audit2allow permite pegar trechos de logs monstros que estão barrando em algo e converter para o mundo do Selinux, eliminando assim o problema em que você está preso:

  [root@selinux tcruz]# grep vsftpd /var/log/messages | audit2allow -M vsftpd

Serao gerados dois arquivos:

  • vsftpd.te = texto
  • vsftpd.pp = binário

    O vsftpd.te conterá algo como:
      module vsftp 1.0;
      
      require {
            type ftpd_t;
            type file_t;
            class dir search;
            class file execute;
      }
      
      #============= ftpd_t ==============
      allow ftpd_t file_t:dir search;
      allow ftpd_t file_t:file execute;
    
    Enquanto o nscd.te mostraria algo assim:
      module nscd 1.0;
      
      require {
            type init_t;
            type initrc_t;
            class nscd { shmemhost shmempwd getpwd shmemgrp gethost getgrp };
      }
      
      #============= initrc_t ==============
      allow initrc_t init_t:nscd { shmemgrp getgrp shmempwd getpwd gethost shmemhost };
    
    Se você estiver satisfeito com o resultado, poderá simplesmente importar o arquivo binário para junto das regras atuais do seu sistema:

      [root@selinux tcruz]# semodule -i vsftpd.pp
    

    Você pode fazer isso com o vsftpd e com nscd, até que seu problema seja de fato resolvido!

    Pronto! Simples assim :)

    Um outro comando interessante, é o getsebool que pode alterar várias variáveis boolean (on ou off, 0 ou 1, ligado ou desligado) pré-definidas como:
      [root@selinux log]# setsebool -P ftp_home_dir 1
      [root@selinux log]# setsebool -P allow_ftpd_full_access=1
      
      [root@selinux log]# getsebool -a | grep ftp
      allow_ftpd_anon_write --> off
      allow_ftpd_full_access --> on
      allow_ftpd_use_cifs --> off
      allow_ftpd_use_nfs --> off
      allow_tftp_anon_write --> off
      ftp_home_dir --> on
      ftpd_disable_trans --> off
      ftpd_is_daemon --> on
      httpd_enable_ftp_server --> off
      tftpd_disable_trans --> off
    
    ==Links Úteis para saber mais sobre o SELinux==

  • http://jczucco.blogspot.com/2009/07/apresentacao-sobre-selinux-no-fisl-10.html
  • http://magazine.redhat.com/2007/05/04/whats-new-in-selinux-for-red-hat-enterprise-linux-5/
  • http://fedoraproject.org/wiki/SELinux
  • http://docs.fedoraproject.org/selinux-faq-fc5/
  • http://fedoraproject.org/wiki/SELinux/Understanding
Fonte: Resolvendo problemas com SELINUX

Adicionar comentário

* Campos obrigatórios
5000
Powered by Commentics

Comentários

Nenhum comentário ainda. Seja o primeiro!


Veja a relação completa dos artigos de Tiago Cruz