Capítulo 16. Usando SELinux
16.1. Começando com a SELinux Copiar o linkLink copiado para a área de transferência!
16.1.1. Introdução à SELinux Copiar o linkLink copiado para a área de transferência!
O Security Enhanced Linux (SELinux) oferece uma camada adicional de segurança do sistema. O SELinux responde fundamentalmente à pergunta: May <subject> do <action> to <object>?, por exemplo May a web server access files in users' home directories?
A política de acesso padrão baseada no usuário, grupo e outras permissões, conhecida como Controle de Acesso Discricionário (DAC), não permite que os administradores de sistema criem políticas de segurança abrangentes e de granulação fina, tais como restringir aplicações específicas a apenas visualizar arquivos de log, enquanto permite que outras aplicações anexem novos dados aos arquivos de log.
A SELinux implementa o Controle de Acesso Obrigatório (MAC). Cada recurso de processo e sistema tem uma etiqueta de segurança especial chamada SELinux context. Um contexto SELinux, às vezes referido como SELinux label, é um identificador que abstrai os detalhes em nível de sistema e se concentra nas propriedades de segurança da entidade. Isto não apenas fornece uma maneira consistente de referenciar objetos na política SELinux, mas também elimina qualquer ambiguidade que possa ser encontrada em outros métodos de identificação. Por exemplo, um arquivo pode ter vários nomes de caminho válidos em um sistema que faz uso de suportes de encadernação.
A política SELinux utiliza estes contextos em uma série de regras que definem como os processos podem interagir uns com os outros e os vários recursos do sistema. Por padrão, a política não permite qualquer interação, a menos que uma regra conceda acesso explícito.
Lembre-se de que as regras da política SELinux são verificadas após as regras do DAC. As regras de política SELinux não são usadas se as regras do DAC negarem o acesso primeiro, o que significa que nenhuma negação do SELinux é registrada se as regras tradicionais do DAC impedirem o acesso.
Os contextos SELinux têm vários campos: usuário, função, tipo e nível de segurança. A informação do tipo SELinux é talvez a mais importante quando se trata da política SELinux, como a regra política mais comum que define as interações permitidas entre processos e recursos do sistema utiliza tipos SELinux e não o contexto SELinux completo. Os tipos de SELinux terminam com _t
. Por exemplo, o nome do tipo para o servidor web é httpd_t
. O contexto do tipo para arquivos e diretórios normalmente encontrados em /var/www/html/
é httpd_sys_content_t
. O tipo de contexto para arquivos e diretórios normalmente encontrado em /tmp
e /var/tmp/
é tmp_t
. O contexto do tipo para as portas do servidor web é http_port_t
.
Há uma regra de política que permite ao Apache (o processo do servidor web funcionando como httpd_t
) acessar arquivos e diretórios com um contexto normalmente encontrado em /var/www/html/
e outros diretórios de servidores web (httpd_sys_content_t
). Não há uma regra de permissão na política para arquivos normalmente encontrados em /tmp
e /var/tmp/
, portanto, o acesso não é permitido. Com o SELinux, mesmo que o Apache esteja comprometido, e um script malicioso ganhe acesso, ele ainda não é capaz de acessar o diretório /tmp
.
Figura 16.1. Um exemplo de como a SELinux pode ajudar a administrar o Apache e a MariaDB de forma segura.
Como o esquema anterior mostra, o SELinux permite que o processo Apache em execução como httpd_t
acesse o diretório /var/www/html/
e nega o mesmo processo para acessar o diretório /data/mysql/
porque não há regra de permissão para os contextos do tipo httpd_t
e mysqld_db_t
. Por outro lado, o processo MariaDB rodando como mysqld_t
pode acessar o diretório /data/mysql/
e o SELinux também nega corretamente o processo com o tipo mysqld_t
para acessar o diretório /var/www/html/
rotulado como httpd_sys_content_t
.
Recursos adicionais
Para mais informações, consulte a seguinte documentação:
-
A página de homem
selinux(8)
e as páginas de homem listadas pelo comandoapropos selinux
. -
Páginas de homem listadas pelo comando
man -k _selinux
quando o pacoteselinux-policy-doc
é instalado. - O Livro Colorido SELinux ajuda você a entender melhor os conceitos básicos da SELinux.
- SELinux Wiki FAQ
16.1.2. Vantagens de executar o SELinux Copiar o linkLink copiado para a área de transferência!
A SELinux oferece os seguintes benefícios:
- Todos os processos e arquivos são etiquetados. As regras da política SELinux definem como os processos interagem com os arquivos, assim como como os processos interagem uns com os outros. O acesso só é permitido se existir uma regra de política SELinux que o permita especificamente.
- Controle de acesso com granulação fina. Indo além das tradicionais permissões UNIX que são controladas a critério do usuário e baseadas em IDs de usuário e grupo Linux, as decisões de acesso ao SELinux são baseadas em todas as informações disponíveis, tais como um usuário SELinux, função, tipo e, opcionalmente, um nível de segurança.
- A política da SELinux é definida administrativamente e aplicada em todo o sistema.
- Melhoria na mitigação de ataques de escalada de privilégios. Os processos correm em domínios e, portanto, são separados uns dos outros. As regras da política SELinux definem como os processos acessam arquivos e outros processos. Se um processo for comprometido, o atacante só tem acesso às funções normais desse processo, e aos arquivos aos quais o processo foi configurado para ter acesso. Por exemplo, se o Servidor HTTP Apache for comprometido, um atacante não pode utilizar esse processo para ler arquivos nos diretórios domésticos do usuário, a menos que uma regra de política específica do SELinux tenha sido adicionada ou configurada para permitir tal acesso.
- A SELinux pode ser usada para reforçar a confidencialidade e integridade dos dados, bem como para proteger processos contra entradas não confiáveis.
No entanto, a SELinux não é:
- software antivírus,
- substituição de senhas, firewalls e outros sistemas de segurança,
- solução de segurança "tudo em um".
A SELinux é projetada para melhorar as soluções de segurança existentes, não para substituí-las. Mesmo ao executar o SELinux, é importante continuar seguindo boas práticas de segurança, como manter o software atualizado, utilizando senhas difíceis de adivinhar, e firewalls.
16.1.3. Exemplos de SELinux Copiar o linkLink copiado para a área de transferência!
Os exemplos a seguir demonstram como a SELinux aumenta a segurança:
- A ação padrão é negar. Se uma regra da política SELinux não existir para permitir o acesso, como para um processo de abertura de um arquivo, o acesso é negado.
-
A SELinux pode confinar os usuários do Linux. Há uma série de usuários de SELinux confinados na política SELinux. Os usuários Linux podem ser mapeados para usuários confinados do SELinux para aproveitar as regras e mecanismos de segurança aplicados a eles. Por exemplo, mapear um usuário Linux para o usuário do SELinux
user_u
, resulta em um usuário Linux que não é capaz de executar, a menos que configurado de outra forma, aplicações de identificação de usuário (setuid), tais comosudo
esu
, bem como impedi-lo de executar arquivos e aplicações potencialmente maliciosos em seu diretório pessoal. - Aumento do processo e separação de dados. O conceito do SELinux domains permite definir quais processos podem acessar certos arquivos e diretórios. Por exemplo, ao executar o SELinux, a menos que configurado de outra forma, um atacante não pode comprometer um servidor Samba, e então utilizar esse servidor Samba como um vetor de ataque para ler e escrever em arquivos utilizados por outros processos, tais como bancos de dados MariaDB.
-
O SELinux ajuda a mitigar os danos causados por erros de configuração. Os servidores DNS (Domain Name System) freqüentemente replicam informações entre si no que é conhecido como transferência de zona. Os atacantes podem usar transferências de zona para atualizar os servidores DNS com informações falsas. Ao rodar o Berkeley Internet Name Domain (BIND) como um servidor DNS no Red Hat Enterprise Linux, mesmo que um administrador se esqueça de limitar quais servidores podem realizar uma transferência de zona, a política default do SELinux evita arquivos de zona [2] de ser atualizado usando transferências de zona, pelo próprio daemon BIND
named
, e por outros processos.
16.1.4. Arquitetura e embalagens SELinux Copiar o linkLink copiado para a área de transferência!
SELinux é um Módulo de Segurança Linux (LSM) que está embutido no kernel do Linux. O subsistema SELinux no kernel é conduzido por uma política de segurança que é controlada pelo administrador e carregada na inicialização. Todas as operações de acesso ao sistema relevantes para a segurança, em nível de kernel, são interceptadas pelo SELinux e examinadas no contexto da política de segurança carregada. Se a política carregada permitir a operação, ela continua. Caso contrário, a operação é bloqueada e o processo recebe um erro.
As decisões da SELinux, tais como permitir ou não o acesso, são armazenadas em cache. Este cache é conhecido como Access Vector Cache (AVC). Ao utilizar estas decisões em cache, as regras da política SELinux precisam ser menos verificadas, o que aumenta o desempenho. Lembre-se que as regras da política SELinux não têm efeito se as regras do DAC negarem o acesso primeiro. As mensagens brutas de auditoria são registradas no /var/log/audit/audit.log
e começam com a seqüência type=AVC
.
No Red Hat Enterprise Linux 8, os serviços do sistema são controlados pelo daemon systemd
; systemd
inicia e pára todos os serviços, e os usuários e processos comunicam-se com systemd
usando o utilitário systemctl
. O daemon systemd
pode consultar a política SELinux e verificar a etiqueta do processo de chamada e a etiqueta do arquivo da unidade que o chamador tenta gerenciar, e então perguntar ao SELinux se o acesso é permitido ou não ao chamador. Esta abordagem fortalece o controle de acesso às capacidades críticas do sistema, que incluem iniciar e parar os serviços do sistema.
O daemon systemd
também trabalha como um Gerente de Acesso SELinux. Ele recupera o rótulo do processo em execução systemctl
ou o processo que enviou uma mensagem D-Bus
para systemd
. O daemon então procura a etiqueta do arquivo da unidade que o processo quis configurar. Finalmente, systemd
pode recuperar informações do kernel se a política do SELinux permitir o acesso específico entre a etiqueta do processo e a etiqueta do arquivo de unidade. Isto significa que uma aplicação comprometida que precisa interagir com systemd
para um serviço específico pode agora ser confinada pelo SELinux. Os redatores de políticas também podem utilizar estes controles de granulação fina para confinar os administradores.
Para evitar etiquetagem incorreta da SELinux e problemas subseqüentes, certifique-se de iniciar os serviços utilizando um comando systemctl start
.
O Red Hat Enterprise Linux 8 fornece os seguintes pacotes para trabalhar com o SELinux:
-
políticas:
selinux-policy-targeted
,selinux-policy-mls
-
ferramentas:
policycoreutils
,policycoreutils-gui
,libselinux-utils
,policycoreutils-python-utils
,setools-console
,checkpolicy
16.1.5. SELinux estados e modos Copiar o linkLink copiado para a área de transferência!
A SELinux pode funcionar em um dos três modos: coercitivo, permissivo, ou desativado.
- O modo de aplicação é o modo de operação padrão e recomendado; no modo de aplicação o SELinux opera normalmente, aplicando a política de segurança carregada em todo o sistema.
- No modo permissivo, o sistema age como se o SELinux estivesse aplicando a política de segurança carregada, inclusive etiquetando objetos e emitindo entradas de negação de acesso nos registros, mas na verdade não nega nenhuma operação. Embora não seja recomendado para sistemas de produção, o modo permissivo pode ser útil para o desenvolvimento e depuração da política SELinux.
- O modo desabilitado é fortemente desencorajado; não apenas o sistema evita a aplicação da política SELinux, mas também evita a etiquetagem de qualquer objeto persistente, como arquivos, dificultando a habilitação da SELinux no futuro.
Use o utilitário setenforce
para mudar entre o modo coercitivo e permissivo. As mudanças feitas com setenforce
não persistem através de reinicializações. Para mudar para o modo de imposição, digite o comando setenforce 1
como usuário root do Linux. Para mudar para o modo permissivo, digite o comando setenforce 0
. Use o utilitário getenforce
para visualizar o modo SELinux atual:
getenforce
# getenforce
Enforcing
setenforce 0 getenforce
# setenforce 0
# getenforce
Permissive
setenforce 1 getenforce
# setenforce 1
# getenforce
Enforcing
No Red Hat Enterprise Linux, você pode definir domínios individuais para o modo permissivo enquanto o sistema roda em modo de execução. Por exemplo, para tornar o domínio httpd_t permissivo:
semanage permissive -a httpd_t
# semanage permissive -a httpd_t
Note que os domínios permissivos são uma ferramenta poderosa que pode comprometer a segurança de seu sistema. A Red Hat recomenda usar os domínios permissivos com cautela, por exemplo, na depuração de um cenário específico.