O alto nível de segurança é um dos principais critérios que levam o usuário a optar pelo Linux. Contudo, é possível incrementar a proteção das distribuições Linux usando o SELinux (Security-Enhanced Linux).
Trata-se de um mecanismo de controle de acesso que tem por objetivo restringir ao máximo os privilégios de usuário (inclusive o root), reforçando, assim, a proteção de usuários, arquivos e processos inseridos no sistema Linux.
Sendo assim, o SELinux é um firewall? Negativo! Um firewall serve para controlar o fluxo de tráfego entre computadores e rede. O SELinux, por sua vez, consegue confinar acesso de programas instalados na máquina, fazendo, na prática, o papel de firewall dentro das aplicações.
Por meio de seu flexível sistema MAC (Mandatory Access Control) implantado no kernel, o SELinux permite a aplicação de políticas de segurança com eficiência. Isto é, governar as interações entre usuários e programas, processos, arquivos do sistema etc.
Quer saber mais detalhes de como o SELinux funciona? Neste artigo, falarei sobre o seu surgimento, vantagens, exemplos de uso, estrutura e arquivos de configuração. Vamos lá?
As principais vantagens do SELinux
Iniciemos o tema elencando os benefícios que você adquire ao usar o SELinux. Obviamente, o SELinux é voltado para ambientes que necessitam de rigor em segurança, principalmente quando arquivos de absoluto sigilo estão armazenados no sistema.
Logo, se a sua ideia é instalá-lo no desktop, decerto ela não é apropriada — a menos que você queira blindar acesso de outros usuários a determinados arquivos ou aplicações. Isso porque o alto controle de acesso tende a tornar a sua navegação no sistema “truncada”.
Para complementar a proteção da sua rede, no entanto, o SELinux pode trazer diversas vantagens, tais como:
- isolação de processos em seus respectivos domínios;
- redução de vulnerabilidades envolvendo privilégios de acesso;
- aplicação das políticas a todos os processos;
- garantia de integridade e sigilo de dados; e
- controle de acesso é baseado nas informações contidas no arquivo.
Tamanha segurança proporcionada pelo SELinux é justificada pela história acerca do seu surgimento.
O surgimento do SELinux
Inicialmente, o SELinux foi desenvolvido pela Agência de Segurança Nacional americana (junto a outras companhias, como a Secure Computing Corporation) para proteger os computadores de fraudes e invasores. Como pode ser visto na definição.
Com o tempo, após a disponibilização do código-fonte com licença GPL em dezembro de 2000, ele passou a ser desenvolvido livremente, o que resultou na criação de diversos projetos SELinux, novas funcionalidades e aprimoramento da arquitetura.
Diversos projetos foram criados em meio aos 10 anos em que a NSA liderou o desenvolvimento do SELinux, como DTMatch e Flask, a ponto de formar uma estrutura básica para a sua arquitetura — a qual conheceremos adiante — que dá suporte aos projetos da atualidade.
Estrutura do SELinux
O funcionamento do SELinux acontece a partir de informações adicionais emitidas ao kernel — tal processo é conhecido como file labeling (rotulagem de arquivos). Elas são usadas pelo sistema nas tomadas de decisões que envolvem o controle de acesso a programas.
Mas a que tipos de informações eu me refiro? Primeiramente, é fundamental o entendimento de que elas se baseiam em diferentes conceitos de controle de acesso, ou seja, tipos de MAC.
Por exemplo, a distribuição Red Hat Enterprise Linux, na qual o SELinux vem instalado por padrão, a arquitetura provê uma combinação de três conceitos de controle:
- Role-Based Access Control (RBAC);
- Type Enforcement (TE); e
- Multi-Level Security (MLS), opcionalmente.
Usando o comando ls -Z para visualizar o contexto de arquivos e diretórios no SELinux, o usuário se depara com uma sintaxe estruturada pelas seguintes classes de informação: user; role; type; e level. Juntas, elas retornam o contexto do usuário, arquivo ou processo.
Abaixo, uma simples representação da sintaxe após consultar informações presentes em um arquivo.
~]$ ls -Z arquivo1 -rwxrw-r-- usuario1 grupo1 unconfined_u:object_r:user_home_t:s0 arquivo1
O primeiro elemento retornado, o “-rwxrw-r–”, é um informativo do que é permitido ao usuário (e seu respectivo grupo) fazer com o arquivo em questão (arquivo1).
Decifrando: o arquivo (-r) pode ser lido, escrito e executado (rwx) pelo usuário1; além disso, os demais usuários do grupo1, ao qual ele pertence, têm permissões similares (rw), porém não podem modificá-lo (-r–).
A sintaxe prossegue com o elemento user (unconfined_u) e seu mapeamento; role (object_r); type (user_home_t); e level (s0). A seguir, vejamos o que significa cada um desses rótulos.
SELinux user (usuário SELinux)
Em “SELinux user”, os usuários do sistema operacional podem ser identificados pelos usuários SELinux e, com isso, herdar as suas permissões. Logo, usuários SELinux são diferentes de usuários do Linux.
Role (Função)
Também conhecido como “papel”, o rótulo “role” faz parte do RBAC, modelo MAC que mencionei no início do tópico. Nele, cada usuário recebe uma lista dos domínios que está autorizado a acessar.
Type (Tipo)
O rótulo “type” é um dos mais importantes, pois ele classifica objetos (arquivos) e sujeitos (processos) por tipos e domínios, respectivamente. Com isso, um processo executado no domínio X não pode interagir com o domínio Y, a menos que o administrador crie permissões específicas na política do SELinux.
Level (Nível de segurança)
Opcionalmente, o usuário pode aprimorar o nível de segurança usando rótulos MLS/MCS para categorizar arquivos e processos, ou seja, impor mais restrições de acesso.
Agora que você adquiriu a noção básica de como funcionam os contextos do SELinux, que tal saber como ele pode ser utilizado na prática?
Exemplos de utilização do SELinux
Quer saber como o SELinux pode ser aplicado na prática? Acompanhe os breves exemplos de utilização que mostram os efeitos promovidos por suas configurações.
Confinamento de usuários
Um dos maiores problemas que um ambiente de rede corporativo enfrenta é o controle de acesso aos usuários, sobretudo nas grandes empresas, onde o número de funcionários que utilizam computadores é vasto.
Nesse sentido, confinar determinados usuários é uma excelente alternativa de prevenção, a qual consiste em assegurar que eles fiquem inabilitados de executar aplicações reservadas a usuários permitidos.
Bloqueio de acesso
Garantir que ninguém acesse um arquivo altamente sigiloso é uma tarefa básica que o SELinux nos possibilita fazer. Supondo que não exista nenhuma configuração que conceda permissões de acesso, o SELinux, por padrão, nega o processo — ou seja, todos os arquivos estão protegidos assim que o SELinux é instalado.
Separação de processos
O SELinux faz com que cada processo seja executado em seu próprio domínio, impedindo que um determinado processo acesse arquivos de outro. Em outras palavras: o que entra no domínio fica no domínio.
Assim, caso haja uma brecha em um dos servidores e o invasor tente tirar proveito para acessar o banco de dados, simplesmente não terá sucesso — isso ajuda a amenizar os efeitos de um ataque cibernético, como o Ransomware.
Arquivo de configuração do SELinux
A configuração do SELinux é executada em função do arquivo “config”, localizado no diretório /etc/selinux/config. Por meio dele é possível habilitar e desabilitar o SELinux, bem como saber que modo e política do SELinux estão em vigor.
Conforme veremos adiante, o arquivo de configuração do SELinux fornece as opções “SELINUX=” e “SELINUXTYPE=”.
O campo ao lado da opção “SELINUX=” pode ser preenchido por um dos três valores: enforcing (força a política de segurança); permissive (o SELinux imprime alertas em vez de forçar); e disabled (desativa a política do SELinux).
Em “SELINUXTYPE=”, o valor “targeted” é marcado por padrão — e só deve ser substituído se deseja adicionar uma proteção Multi Level Security, digitando o valor “mls”.
Confira um breve exemplo de configuração do SELinux, abaixo:
Security protection. SELINUXTYPE=mls# 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 these two values: # targeted - Targeted processes are protected, # mls - Multi Level
Desde que o usuário entenda o que implica cada uma das opções, configurar o SELinux é uma tarefa bastante simples.
Com o SELinux instalado e configurado na sua distro do Linux, o sistema operacional ficará ainda mais protegido contra ameaças por meio do controle avançado integrado ao kernel (o qual permite estabelecer políticas de segurança mais rígidas). Sabendo disso, como fazê-lo funcionar da melhor maneira?
Para utilizar o SELinux a nível profissional, entre outras atribuições importantes para a formação de um administrador de sistemas Linux, recomendo que você conheça também uma formação completa de Linux.
Até a próxima.