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.