Um guia para iniciantes no SELinux

Um guia para iniciantes no SELinux

Tradução do artigo elaborado para alunos do curso "Segurança Linux"

SELinux ou Security Enhanced Linux é um mecanismo aprimorado de controle de acesso desenvolvido pela Agência de Segurança Nacional dos EUA (NSA) para evitar invasões maliciosas. Ele implementa um modelo de controle de acesso forçado (ou obrigatório) (Inglês Mandatory Access Control, MAC) em cima do modelo discricionário (ou seletivo) existente (Inglês Discretionary Access Control, DAC), ou seja, permissões para ler, escrever, executar.

SELinux possui três modos:

  1. Aplicando — negação de acesso com base em regras políticas.
  2. Permissivo — manter um registro das ações que violam a política, o que seria proibido no modo de aplicação.
  3. Desativado — desativação completa do SELinux.

Por padrão as configurações estão em /etc/selinux/config

Alterando os modos SELinux

Para descobrir o modo atual, execute

$ getenforce

Para alterar o modo para permissivo, execute o seguinte comando

$ setenforce 0

ou, para alterar o modo de permissivo em impor, execute

$ setenforce 1

Se você precisar desabilitar completamente o SELinux, isso só poderá ser feito através do arquivo de configuração

$ vi /etc/selinux/config

Para desabilitar, altere o parâmetro SELINUX da seguinte forma:

SELINUX=disabled

Configurando o SELinux

Cada arquivo e processo é marcado com um contexto SELinux, que contém informações adicionais como usuário, função, tipo, etc. Se esta for a primeira vez que você habilita o SELinux, primeiro você precisará configurar o contexto e os rótulos. O processo de atribuição de rótulos e contexto é conhecido como marcação. Para iniciar a marcação, no arquivo de configuração alteramos o modo para permissivo.

$ vi /etc/selinux/config
SELINUX=permissive

Depois de definir o modo permissivo, crie um arquivo oculto vazio na raiz com o nome autorelabel

$ touch /.autorelabel

e reinicie o computador

$ init 6

Nota: Usamos o modo permissivo para marcação, já que a utilização do modo impor pode fazer com que o sistema trave durante a reinicialização.

Não se preocupe se o download travar em algum arquivo, a marcação demora um pouco. Assim que a marcação estiver concluída e seu sistema inicializado, você pode ir para o arquivo de configuração e definir o modo impore também execute:

$ setenforce 1

Agora você habilitou com sucesso o SELinux em seu computador.

Monitorando os registros

Você pode ter encontrado alguns erros durante a marcação ou durante a execução do sistema. Para verificar se o seu SELinux está funcionando corretamente e se não está bloqueando o acesso a nenhuma porta, aplicativo, etc., você precisa consultar os logs. O log do SELinux está localizado em /var/log/audit/audit.log, mas você não precisa ler tudo para encontrar erros. Você pode usar o utilitário audit2why para encontrar erros. Execute o seguinte comando:

$ audit2why < /var/log/audit/audit.log

Como resultado, você receberá uma lista de erros. Se não houver erros no log, nenhuma mensagem será exibida.

Configurando a política SELinux

Uma política SELinux é um conjunto de regras que regem o mecanismo de segurança do SELinux. Uma política define um conjunto de regras para um ambiente específico. Agora aprenderemos como configurar políticas para permitir acesso a serviços proibidos.

1. Valores lógicos (switches)

Switches (booleanos) permitem alterar partes de uma política em tempo de execução, sem a necessidade de criar novas políticas. Eles permitem que você faça alterações sem reinicializar ou recompilar as políticas do SELinux.

Exemplo
Digamos que queremos compartilhar o diretório inicial de um usuário via leitura/gravação FTP e já o compartilhamos, mas quando tentamos acessá-lo, não vemos nada. Isso ocorre porque a política do SELinux impede que o servidor FTP leia e grave no diretório inicial do usuário. Precisamos mudar a política para que o servidor FTP possa acessar os diretórios pessoais. Vamos ver se há alguma opção para isso fazendo

$ semanage boolean -l

Este comando listará os switches disponíveis com seu estado atual (ligado ou desligado) e descrição. Você pode refinar sua pesquisa adicionando grep para encontrar resultados somente FTP:

$ semanage boolean -l | grep ftp

e você encontrará o seguinte

ftp_home_dir        -> off       Allow ftp to read & write file in user home directory

Esta opção está desabilitada, então vamos habilitá-la com setsebool $ setsebool ftp_home_dir on

Agora nosso daemon FTP poderá acessar o diretório inicial do usuário.
Nota: Você também pode obter uma lista de opções disponíveis sem descrição fazendo getsebool -a

2. Rótulos e contexto

Esta é a forma mais comum de implementar a política SELinux. Cada arquivo, pasta, processo e porta é marcado com o contexto SELinux:

  • Para arquivos e pastas, os rótulos são armazenados como atributos estendidos no sistema de arquivos e podem ser visualizados com o seguinte comando:
    $ ls -Z /etc/httpd
  • Para processos e portas, a rotulagem é gerenciada pelo kernel e você pode visualizar esses rótulos da seguinte maneira:

processo

$ ps –auxZ | grep httpd

porto

$ netstat -anpZ | grep httpd

Exemplo
Agora vamos ver um exemplo para entender melhor os rótulos e o contexto. Digamos que temos um servidor web que, em vez de um diretório /var/www/html/ использует /home/dan/html/. O SELinux considerará isso uma violação da política e você não poderá visualizar suas páginas da web. Isso ocorre porque não definimos o contexto de segurança associado aos arquivos HTML. Para visualizar o contexto de segurança padrão, use o seguinte comando:

$ ls –lz /var/www/html
 -rw-r—r—. root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/

Aqui temos httpd_sys_content_t como contexto para arquivos html. Precisamos definir este contexto de segurança para nosso diretório atual, que atualmente possui o seguinte contexto:

-rw-r—r—. dan dan system_u:object_r:user_home_t:s0 /home/dan/html/

Um comando alternativo para verificar o contexto de segurança de um arquivo ou diretório:

$ semanage fcontext -l | grep '/var/www'

Também usaremos semanage para alterar o contexto assim que encontrarmos o contexto de segurança correto. Para alterar o contexto de /home/dan/html, execute os seguintes comandos:

$ semanage fcontext -a -t httpd_sys_content_t ‘/home/dan/html(/.*)?’
$ semanage fcontext -l | grep ‘/home/dan/html’
/home/dan/html(/.*)? all files system_u:object_r:httpd_sys_content_t:s0
$ restorecon -Rv /home/dan/html

Depois que o contexto for alterado usando semanage, o comando restorecon carregará o contexto padrão para arquivos e diretórios. Nosso servidor web agora poderá ler arquivos da pasta /home/dan/htmlporque o contexto de segurança desta pasta foi alterado para httpd_sys_content_t.

3. Crie políticas locais

Pode haver situações em que os métodos acima não sejam úteis para você e você receba erros (avc/denial) em audit.log. Quando isso acontecer, você precisará criar uma política local. Você pode encontrar todos os erros usando audit2why, conforme descrito acima.

Você pode criar uma política local para resolver erros. Por exemplo, obtemos um erro relacionado a httpd (apache) ou smbd (samba), pegamos os erros e criamos uma política para eles:

apache
$ grep httpd_t /var/log/audit/audit.log | audit2allow -M http_policy
samba
$ grep smbd_t /var/log/audit/audit.log | audit2allow -M smb_policy

é http_policy и smb_policy são os nomes das políticas locais que criamos. Agora precisamos carregar essas políticas locais criadas na política SELinux atual. Isso pode ser feito da seguinte forma:

$ semodule –I http_policy.pp
$ semodule –I smb_policy.pp

Nossas políticas locais foram baixadas e não devemos mais receber nenhum avc ou denail em audit.log.

Esta foi minha tentativa de ajudá-lo a entender o SELinux. Espero que depois de ler este artigo você se sinta mais confortável com o SELinux.

Fonte: habr.com

Adicionar um comentário