SELinux – Guia para Principiantes

Olá a todos,

Tem me pedido recentemente cada vez mais, procedimentos de como validar ou verificar eventos de SELinux num sistema.
Com isto em mente, construí um simples how-to muito simples para auxiliar no despiste de suspeitas ou problemas que tenham.

Getting Started with SELinux - MicroHost

Quais são as origens do SELinux?

O SELinux (Security-Enhanced Linux) é um sistema de segurança de controle de acesso (MAC) e foi  desenvolvido originalmente pela Agência de Segurança Nacional (NSA) dos Estados Unidos. Apareceu primeiro na cena em 2000 como um OSS em colaboração com a Red Hat e outros membros da comunidade Linux.

É baseado em um projeto anterior da NSA chamado Flask, que foi desenvolvido nos anos 90 para proteger sistemas Unix. O Flask foi aprimorado e posteriormente integrado ao kernel Linux para criar o SELinux. A primeira versão do SELinux foi incluída no kernel Linux 2.6, lançado em 2003.

Desde então, tem sido adotado em várias distribuições Linux, incluindo Red Hat Enterprise Linux, Fedora, CentOS e Debian. Ele é usado para proteger servidores,  e qualquer tipo de plataforma de computação Linux contra uma variedade de ameaças, incluindo exploração de vulnerabilidades de software, malware e ataques de utilizadores mal-intencionados.

O que é o SELinux?

O SELinux (Security-Enhanced Linux) é um mecanismo de segurança do Linux que impõe políticas de controle de acesso obrigatórias ao sistema. Ele é projetado para fornecer uma camada adicional de segurança, controlando o acesso aos recursos do sistema e restringindo o que os utilizadores e aplicativos podem fazer.
Cada vez mais usado em ambientes corporativos, o SELinux pode ser uma dor de cabeça para utilizadores menos experientes que podem enfrentar problemas de acesso negado ou erros de segurança.
Neste artigo, discutiremos algumas dicas úteis para depurar problemas relacionados ao SELinux.

  • Verificar o status do SELinux

    Antes de começar a efetuar debugging em SELinux, tens de primeiro verificar se ele está ativado ou desativado no teu sistema. Para isso, execute o seguinte comando no terminal:

     sestatus

Se o SELinux estiver ativado, irá ser observado o seguinte output:

     SELinux status: enabled
     SELinuxfs mount: /sys/fs/selinux
     SELinux root directory: /etc/selinux
     Loaded policy name: targeted
     Current mode: enforcing
     Mode from config file: enforcing
     Policy MLS status: enabled
     Policy deny_unknown status: allowed
     Memory protection checking: actual (secure)
     Max kernel policy version: 33

Se o SELinux estiver desativado, será visto o seguinte output:

       SELinux status: disabled
  • Verificar os logs do SELinux

Se efetivamente estiveres a ter problemas relacionados ao SELinux, a primeira coisa que você deve fazer é verificar os logs do SELinux 🙂 . O SELinux registra as suas atividades em logs  do    sistema. Para ver o arquivo de log em tempo real, executar o seguinte comando:

       sudo tail -f /var/log/audit/audit.log
      Este comando exibirá as últimas linhas do arquivo de log e continuará a exibir novas entradas à medida que elas ocorrem. Isso ajudará em muito a identificar o problema em tempo real.
  • Usar o comando ausearch

O comando ausearch é outra das ferramentas que auxilam a pesquisar o arquivo de log do SELinux, procurando por palavras-chave específicas. É possível usar o seguinte exemplo para           procurar por entradas do log relacionadas a um processo específico:

      sudo ausearch -c <nome_do_processo>
  • Usar o comando sealert

O comando sealert fornece informações mais detalhadas sobre as mensagens de erro do SELinux. Ele analisa o arquivo de log do SELinux e fornece sugestões sobre como corrigir o                   problema. Para usar o sealert, executa o seguinte comando:

      sudo sealert -a /var/log/audit/audit.log
  • Configurar o modo permissivo

O modo permissivo permite que o SELinux registre as violações de segurança, mas não as aplique. Isso permite que consigas depurar problemas de segurança sem interromper o                      funcionamento do sistema. Para ativar o modo permissivo, execute o seguinte comando:

      sudo setenforce 0

Para desativar o modo permissivo e voltar ao modo de aplicação de políticas, execute o seguinte comando:

      sudo setenforce 1

  • E correções? Alteração de permissões?

Para isto darei um exemplo. Vamos imaginar que temos um evento de SELinux com o ID 84e0b04d-d0ad-4347-8317-22e74f6cd020, visto através da utilização do ausearch, e vamos              estudar ele para ver como o podemos validar, e se for efetivamente válido adicionar um comportamento permissivo ao binário em execução, de forma a não colidir com o SELinux:

   $ sudo sealert -l 84e0b04d-d0ad-4347-8317-22e74f6cd020
   Summary:

   SELinux is preventing httpd (httpd_t) "getattr" to /var/www/html/file1
  (samba_share_t).

  Detailed Description:

  SELinux denied access to /var/www/html/file1 requested by httpd.
  /var/www/html/file1 has a context used for sharing by different program. If you
  would like to share /var/www/html/file1 from httpd also, you need to change its
  file context to public_content_t. If you did not intend to this access, this
  could signal a intrusion attempt.

  Allowing Access:

  You can alter the file context by executing chcon -t public_content_t
  '/var/www/html/file1'

  Fix Command:

  chcon -t public_content_t '/var/www/html/file1'

  Additional Information:

  Source Context unconfined_u:system_r:httpd_t:s0
  Target Context unconfined_u:object_r:samba_share_t:s0
  Target Objects /var/www/html/file1 [ file ]
  Source httpd
  Source Path /usr/sbin/httpd
  Port <Unknown>
  Host hostname
  Source RPM Packages httpd-2.2.10-2
  Target RPM Packages
  Policy RPM selinux-policy-3.5.13-11.fc11
  Selinux Enabled True
  Policy Type targeted
  MLS Enabled True
  Enforcing Mode Enforcing
  Plugin Name public_content
  Host Name hostname
  Platform Linux hostname 6.1.7-1-default #1 SMP PREEMPT_DYNAMIC Wed Jan 18 11:12:34 UTC 2023
  Alert Count 4
  First Seen Wed Mar 5 18:53:05 2023
  Last Seen Wed Mar 6 01:22:58 2023
  Local ID 84e0b04d-d0ad-4347-8317-22e74f6cd020
  Line Numbers

  Raw Audit Messages

  node=hostname type=AVC msg=audit(1225812178.788:101): avc: denied { getattr } for 
  pid=2441 comm="httpd" path="/var/www/html/file1" dev=dm-0 ino=284916
  scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:samba_share_t:s0 tclass=file

  node=hostname type=SYSCALL msg=audit(1225812178.788:101): arch=40000003 syscall=196
  success=no exit=-13 a0=b8e97188 a1=bf87aaac a2=54dff4 a3=2008171 items=0 ppid=2439
  pid=2441 auid=502 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48
  tty=(none) ses=3 comm="httpd" exe="/usr/sbin/httpd" subj=unconfined_u:system_r:httpd_t:s0
  key=(null)

Como podem reparar, o próprio sealert irá dar uma sugestão de como permitir a correção da violação da politica de SELinux, dependendo ao administrador de sistemas, se a sugestão é sequer válida, se é demasiado abrangente, ou se o alerta se traduz mesmo num evento de segurança.

Concluindo, o selinux é uma ferramenta extremamente útil para garantir a segurança, comportamento e estabilidade de um sistema. Pode ser um pouco trabalhosa de se entender ao inicio, mas o layer acrescido de segurança que ela nos irá trazer é algo que depois de se começar a usar, não há forma de abandonar.

Assim termina mais uma das nossas viagens, que agora voltarão a ser mais frequentes. Até a próxima semana!
Alguma duvida, já sabem onde me encontrar.

Abraço
Nuno