SELinux: Um importante aliado na Segurança de Servidores Linux (parte 2)

     Neste artigo, daremos continuidade sobre o uso do SELinux. Iremos ver como adicionar/modificar contextos, entre outros.

Modificando contextos

Conforme visto anteriormente, o SELinux tem seu funcionamento baseado em rótulos e em políticas de segurança. Os rótulos dos usuários, arquivos e processos definem o contexto de segurança de cada objeto. Colocando em uma aplicação prática, vejamos o exemplo a seguir:

# ls -Z /var/www/html/
 -rw-r-----. root apache unconfined_u:object_r:user_home_t:s0 index.html

     Em quase todos os casos, o campo do contexto que realmente importa é o terceiro campo; ele indica o tipo do objeto (neste caso, user_home_t indica que o tipo de arquivo é um arquivo de usuário “humano”). Considerando que este arquivo é uma página que será utilizada pelo Apache, conclui-se que ele não está com o contexto apropriado (que neste caso seria “httpd_sys_content_t”), logo não irá funcionar. Então, é necessário alterar o tipo de arquivo no contexto para que o mesmo funcione:

# chcon -R -t httpd_sys_content_t /var/www/html/

     Assim como o chmod é utilizado para alterar permissões DAC, o chcon pode ser utilizado para alterar o contexto dos arquivos. Porém todas as alterações realizadas com o chcon são desfeitas quando o sistema é reiniciado. Para que a alteração seja permanente, deve-se utilizar o semanage:

# semanage fcontext -m -t httpd_sys_content_t /var/www/html/index.html

     Alterar o contexto de arquivo por arquivo não parece ser muito produtivo. Por isso, você pode utilizar expressões regulares para alterar vários arquivos de uma vez só:

# semanage fcontext -m -t httpd_sys_content_t "/var/www/html(/.*)?"

     Se o retorno que você tiver for o abaixo, basta você trocar o “-m” (modificar) pelo “-a” (adicionar) no comando:

usr/sbin/semanage: O contexto de arquivo para /var/www/html não está definido

# semanage fcontext -a -t httpd_sys_content_t "/var/www/html(/.*)?"

     Após realizar as alterações com o semanage, é necessário utilizar o “restorecon” para aplicar as alterações:

# restorecon -Rv /var/www/html

    Agora, o arquivo já está com o contexto que permitirá seu funcionamento:

# ls -Z /var/www/html/
-rwxr-x---. root apache unconfined_u:object_r:httpd_sys_content_t:s0 index.html
Políticas Booleanas

Além do contexto, o SELinux utiliza políticas pré-definidas para cada serviço para restringir/conceder acesso á determinadas funções. Você pode visualiza-las utilizando o comando abaixo:

# semanage boolean -l

     Supondo que desejo que o home dos usuários seja acessível pelo apache (crio lá no home do usuário uma pasta public_html para o usuário acessar meusite.com/~usuario). Se não alterar nada, o SELinux irá bloquear o acesso. Então, listando as políticas, temos:

# semanage boolean -l | grep -E 'httpd.*home'
 httpd_enable_homedirs (desativado,desativado) Allow httpd to read home directories

     Com isso, confirmamos que a esta opção está desativada. Vamos ativá-la então:

# setsebool -P httpd_enable_homedirs 1
Liberar portas

O SELinux também provê controle sobre qual serviço pode acessar qual porta (para o desespero de alguns). A lista de portas/serviços liberados você pode obter com o comando abaixo:

# semanage port -l

     Usando como exemplo um servidor apache, que quero que o mesmo funcione na porta 25000/TCP. Porém, nas políticas SELinux esta porta não está liberada:

# semanage port -l | grep http _port
 http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000

     Então, vamos adicionar a porta 25000 á regra:

# semanage port -a -t http_port_t -p tcp 25000

     Neste artigo abordamos como utilizar o SELinux de forma prática, modificando contextos, políticas e liberando portas. No próximo artigo iremos abordar a solução de problemas mais comuns com SELinux, bem como criar políticas personalizadas.

Referências

http://wiki.centos.org/HowTos/SELinux

https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Security-Enhanced_Linux/