Com relação à auditoria e depuração de Logs, o SELinux lida muito bem com isso, a começar pelo pacote
Setroubleshoot, a junção de diversos aplicativos é uma "Mãe" para qualquer administrador SELinux. A ferramenta demonstra os alertas de AVC do SELinux, e ainda diz qual comando pode corrigir o mesmo.
Falando em AVC, sigla para Access Vector Cache (e não para Acidente Vascular Cerebral), que nada mais é do que alertas de acessos bloqueados sejam elas de aplicação ou usuários do sistema.
Primeiramente, vamos instalar o pacote "Setroubleshoot".
Obs.: Caso tenha interface gráfica no servidor, o mesmo irá instalar um pequeno utilitário, que alerta toda vez que um AVC acontecer.
# yum install setroubleshoot
Antes de qualquer coisa, vamos gerar o nosso próprio AVC.
- Pergunta: Mas como assim, o nosso próprio AVC?
- Resposta: Bom, esta é uma tarefa fácil, uma simples alteração de porta padrão de um determinado serviço, como o HTTP, por exemplo, deve gerar um Alerta de
Access Denied.
Vamos aos testes:
Instale o serviço HTTP no Servidor:
# yum install –y httpd
Abra o arquivo de configuração:
# vim /etc/httpd/conf/httpd.conf
Altere a seguinte linha do arquivo: Listen 80
Para:
Listen 8888
Logo, reinicie o serviço HTTP:
# service httpd restart
Pronto, nosso AVC foi gerado com êxito. =)
O primeiro comando para verificação de AVC's, é o
ausearch:
# ausearch –m avc | grep httpd
Onde:
-m = message
Saída do comando (resumida):
type=AVC msg=audit(1344678620.633:26191): avc: denied { name_bind } for pid=9429 comm="httpd" src=8888 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=system_u:object_r:port_t:s0
tclass=tcp_socket
Perceba que a saída do comando demonstra claramente, o motivo dele ter alarmado tal AVC.
- Pergunta: (Bruno, beleza!) Eu "já sei" o que aconteceu pela saída do log, mas agora eu quero que a porta 8888 seja padrão do serviço HTTP, irá continuar gerando AVC's?
- Resposta: Não, não, porém para que isso aconteça, é necessário informar ao SELinux, que a porta padrão do serviço HTTP mudou.
Existem duas maneiras de se fazer isso, uma é utilizar o comando
semanage com a opção "port", a outra é o que iremos ver abaixo.
Primeiro, vamos utilizar o comando
selatert para analisar os logs:
# sealert –a /var/log/audit/audit.log | grep httpd
Onde:
- -a = Analyze File
- /var/log/audit/audit.log = O arquivo que será analisado
Saída do comando (resumida):
SELinux is preventing /usr/sbin/httpd from name_bind access on the tcp_socket.
If you want to allow /usr/sbin/httpd to bind to network port 8888
where PORT_TYPE is one of the following: ntop_port_t, http_cache_port_t, http_port_t, puppet_port_t, jboss_messaging_port_t, jboss_management_port_t.
If you believe that httpd should be allowed name_bind access on the tcp_socket by default.
# grep httpd /var/log/audit/audit.log | audit2allow -M mypol
Analisando a saída, perceba que além de detalhar a possível causa do AVC, ele sugere (caso você realmente queira), indicar a alteração de porta padrão do serviço HTTPD para 8888 ao SELinux.
Vamos utilizar o comando que ele sugeriu:
# grep httpd /var/log/audit/audit.log | audit2allow -M mypol
Onde:
- grep httpd /var/log/audit/audit.log = Indica que iremos filtrar a palavra httpd, mediante o arquivo de logs.
- audit2allow = Utilizado para Gerar políticas do SELinux para permitir regras, a partir de logs negados.
- -M = Cria um arquivo de Módulo, com a saída do audit2allow
- mypol = Nome do arquivo de Módulo, podendo ter qualquer nome.
Saída do comando:
******************** IMPORTANT ***********************
To make this policy package active, execute:
semodule -i mypol.pp
Perceba que a saída do comando deixa bem claro que, caso você queira tornar tal módulo ativo, é necessário que você o instale via
semodule.
Porém, caso você liste o diretório corrente, irá perceber que existem 2 arquivos
mypol:
# ls
Saída do comando:
mypol.te mypol.pp
O arquivo "mypol.te" indica um tipo de arquivo de execução (Type Enforcement), ou seja, ele tem toda instrução do que será executado/alterado no sistema através do arquivo "mypol.pp".
Já o arquivo "mypol.pp", nada mais é o que o pacote de politicas (Package Policy), ou o módulo propriamente dito.
Agora que sabemos qual arquivo instalar, vamos utilizar o
semodule para isso:
# semodule -i mypol.pp
Depois de alguns segundos, o arquivo foi instalado com êxito. Será?
Liste os módulos, e veja você mesmo:
# semodule –l | grep ^m
Saída do comando:
mailman 1.7.2
matahari 1.0.0
mediawiki 1.0.0
memcached 1.1.2
milter 1.1.1
modemmanager 1.0.1
mono 1.6.1
mozilla 2.1.1
mpd 1.0.0
mplayer 2.1.0
mrtg 1.8.0
munin 1.7.0
mypol 1.0
mysql 1.11.3
Olha só, o nosso modulo "mypol" instalado e habilitado no sistema. Ou seja, funcionou! =D
Vale reforçar que, a criação de módulos com o "audit2allow", só é aconselhada caso você saiba realmente o que esteja fazendo, utilizar o "audit2allow" apenas para resolver os alertas de AVC do SELinux, estará causando um grande furo de segurança ao sistema.
Bom galera, é isso.
O artigo foi básico, em relação à complexidade do SELinux, porém, espero que tenha sido útil para aqueles que estão começando com esta tão poderosa ferramenta.
Meu muito obrigado, e até a próxima! =D