fbpx

Entenda o SELinux

Neste artigo iremos apresentar conceitos e funcionamentos sobre o SELinux. O SELinux é um recurso que implementa uma camada a mais de segurança da informação em sistemas operacionais Linux.

SELinux hoje é um padrão sobre as distribuições derivadas da Red Hat Interprise como por exemplo o CentOS e Fedora, em distribuições derivadas do Debian como Ubuntu pode ser implantado, mas não é habilitado.

O que é SELinux?

SELinux (Security Enhanced Linux) é um módulo de segurança integrado ao kernel Linux, é também um sistema de controle de acesso mandatório (MAC) implementado sobre a interface LSM (Linux Security Modules) do Linux projetado para ser bastante rigoroso suprindo limitações e aumentando a segurança fornecida pelas permissões padrão POSIX UGO/rwx e pelas ACLs (Access Control List). A Agência Nacional de Segurança dos Estados Unidos (NSA) desenvolveu o SELinux a fim de restringir o acesso de processos e executar outras operações em objetos do sistema com a menor permissão possível. Na prática, o kernel consulta o SELinux antes de cada chamada do sistema para saber se o processo está autorizado a fazer a operação solicitada, assim são impostas regras sobre arquivos, processos, sockets e usuários Linux.

As limitações são impostas através de políticas, implementadas sobre um conjunto de regras para autorizar ou proibir as operações sobre arquivos e processos em sistema Linux.

As regras são armazenadas em um cache chamado de Cache de Vetores de Avesso AVC (Access Vector Cache), ao usar essas regras no cache as políticas SELinux precisam ser menos verificadas, aumentando assim seu desempenho.


 As regras em si são difíceis de serem definidas manualmente, como dito anteriormente o kernel faz consultas ao SELinux para validar chamadas do sistema, pode ser muito complexo sua implementação manual. Pensando nisso por padrão o SELinux possui duas diretivas (targeted e mls) para evitar a maior parte do trabalho de configuração que os administradores teriam que fazer manualmente.

Diretiva Targeted

A política de segmentação está habilitada por padrão em distribuições RHEL (Red Hat Enterprise Linux), quando usada os processos segmentados (targeted) são executados em um domínio confinado e os processos que não são segmentados são executados em um domínio não confinado. Por exemplo, por padrão os usuários conectados são executados no domínio chamado unconfined_t e os processos do sistema iniciados pelo gerenciador de processos (Init ou Systemd) são executados no domínio unconfined_service_t, ambos os domínios não estão confinados, mas em domínios distintos.

Ainda falando no contexto de domínio tratando-se de aspectos da memória, processos em execução em um domínio não confinado não podem alocar memória gravável e executá-la. Isso se dá pelas verificações de memória que podem se aplicar a domínios confinados e não confinados.

As verificações são ativadas/desativadas ao definir booleanos verdadeiro ou falso (true or false) que irá permitir que o SELinux seja modificado em tempo de execução, ou seja, sem a necessidade de parar processos para efetivar uma configuração.

Domínios protegidos

  • httpd, dhcpd, mailman, mysqld, mariadb, named, nscd, ntpd, portmap, squid, syslogd, winbind, snmpd, etc.

Diretiva MLS – Multi-Level Security

Projetada como uma diretiva onde todos os processos são particionados em domínios de segurança de alto nível e confinados pelas políticas SELinux. O MLS ainda suporta os modelos de acesso Bell e LaPadula, onde os processos não são apenas confinados pelo tipo, mas também o nível dos dados.

Nesta diretiva os usuários e processos são chamados de sujeitos (subjects) já arquivos, dispositivos e outros componentes passivos do sistema são chamados de objetos (objects). Ambos são rotulados com um nível de segurança que envolve a depuração de um sujeito ou a classificação de um objeto.

Cada nível de segurança é composto por uma sensibilidade e uma categoria, por exemplo, um cronograma de lançamento interno é arquivado sob a categoria de documentos internos com uma sensibilidade confidencial. A imagem abaixo mostra estas categorias.

O funcionamento do sistema de privilégios e o MLS são sempre combinadas com permissões de acesso convencionais (permissões de arquivos). Um exemplo seria se um usuário com um nível de segurança de “Secret” usa Controle de Acesso Discreto (DAC) para bloquear o acesso a um arquivo por outros usuários, isso causaria o bloqueio a acesso de usuários com um nível de segurança de “Top Secret”.

As regras de política SELinux MLS são verificadas após as regras DAC. Uma autorização de segurança mais elevada não dá automaticamente permissão para procurar arbitrariamente um sistema de arquivos.

SELinux modos e estados

Como informado acima o SELinux está habilitado por padrão em algumas distribuições, mas não é uma obrigação fazer uso do mesmo, por este motivo o SELinux pode ter o estado de habilitado ou desabilitado.

]# cat /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing – SELinux security policy is enforced.
# permissive – SELinux prints warnings instead of enforcing.
# disabled – No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of three two values:
# targeted – Targeted processes are protected,
# minimum – Modification of targeted policy. Only selected processes are protected.
# mls – Multi Level Security protection.
SELINUXTYPE=targeted

Quando ativado, pode ser executado em um dos seguintes modos:

  • Disabled: políticas e logs SELinux desabilitado.

  • Enforcing: o SELinux é aplicado negando o acesso com base nas regras de domínios definidas.

  • Permissive: a política SELinux não é aplicada, mas sim monitoradas onde as recusas são registradas para ações como troubleshoot de aplicações.

Um utilitário usado para saber em qual modo está em execução em seu sistema é o ‘getenforce’. Por padrão o modo que está em execução em sistemas Linux com SELinux e o ‘enforcing’.

Para alternar entre estes modos usa-se o utilitário ‘setenforce’ que aceita como parâmetro o valor zero (0) para o modo ‘permissive’ e um (1) para o modo ‘enforcing’.

]# sestatus
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
Max kernel policy version: 28
]# getenforce
Enforcing
]# setenforce 0
]# getenforce
Permissive

Conclusão

O SELinux foi projetado para aprimorar as soluções de segurança existentes e não para substituí-las, sendo um complemento para seu ambiente. É importante saber que mesmo não o executando, adotar boas práticas de segurança é primordial como manter o software atualizado, usar senhas difíceis de detectar, firewalls, etc.

Como visto o SELinux fornece uma camada a mais em ambientes que prezam pela segurança da informação, indo além das convencionais permissões UNIX que são controladas a critério do usuário baseadas em IDs para usuários e grupos

Ele ainda reduz a vulnerabilidade de ataques de elevação de privilégios. Os processos são executados em domínios distintos, separados uns dos outros. As regras definem como os processos acessam arquivos e outros processos.

O SELinux pode ser usado para reforçar a confidencialidade e integridade dos dados, bem como proteger os processos de entradas e acessos não confiáveis.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Rolar para cima