Durante esta série, exploramos em detalhes pelo menos dois métodos de controle de acesso: padrão ugo/rwx permissões (Gerenciar usuários e grupos - Parte 3) e listas de controle de acesso (Configurar ACLs em sistemas de arquivos - Parte 7).
Embora necessários como permissões de primeiro nível e mecanismos de controle de acesso, eles têm algumas limitações que são abordadas por Linux com segurança aprimorada (também conhecido como SELinux como diminutivo).
Uma dessas limitações é que um usuário pode expor um arquivo ou diretório a uma violação de segurança por meio de um chmod comando e, portanto, causar uma propagação inesperada de direitos de acesso. Como resultado, qualquer processo iniciado por esse usuário pode fazer o que quiser com os arquivos de propriedade do usuário, onde, finalmente, um software malicioso ou comprometido de outra forma pode obter acesso de nível raiz a todo o sistema.
Com essas limitações em mente, o Agência de Segurança Nacional dos Estados Unidos
(NSA) primeiro concebido SELinux, um método flexível de controle de acesso obrigatório, para restringir a capacidade dos processos de acessar ou realizar outras operações em objetos do sistema (como arquivos, diretórios, portas de rede, etc) para o modelo de menor permissão, que pode ser modificado posteriormente como necessário. Em poucas palavras, cada elemento do sistema recebe apenas o acesso necessário para funcionar.Em RHEL 7, SELinux está incorporado no próprio kernel e está habilitado em Forçando modo por padrão. Neste artigo, explicaremos brevemente os conceitos básicos associados a SELinux e seu funcionamento.
O SELinux pode operar de três maneiras diferentes:
O getenforce
comando exibe o modo atual do SELinux, enquanto setenforce
(seguido por um 1 ou um 0) é usado para alterar o modo para Forçando ou Permissivo, respectivamente, apenas durante a sessão atual.
A fim de obter persistência entre logouts e reinicializações, você precisará editar o /etc/selinux/config
arquivo e definir a variável SELINUX para qualquer obrigando, permissivo, ou Desativado:
# getenforce. # setenforce 0. # getenforce. # setenforce 1. # getenforce. # cat / etc / selinux / config.
Normalmente você usará setenforce para alternar entre os modos SELinux (aplicando para permissivo e vice-versa) como uma primeira etapa de solução de problemas. Se o SELinux estiver atualmente definido para obrigando enquanto você está enfrentando um determinado problema, e o mesmo desaparece quando você o define como permissivo, você pode ter certeza de que está diante de um problema de permissões SELinux.
Um contexto SELinux consiste em um ambiente de controle de acesso onde as decisões são feitas com base no usuário SELinux, função e tipo (e opcionalmente um nível):
Vamos ver como tudo isso funciona por meio dos exemplos a seguir.
Em Protegendo SSH - Parte 8 explicamos que mudar a porta padrão onde sshd escuta é uma das primeiras medidas de segurança para proteger seu servidor contra ataques externos. Vamos editar o /etc/ssh/sshd_config
arquivo e definir a porta para 9999:
Porta 9999.
Salve as alterações e reinicie o sshd:
# systemctl restart sshd. # systemctl status sshd.
Como você pode ver, o sshd falhou ao iniciar. Mas o que houve?
Uma rápida inspeção de /var/log/audit/audit.log
indica que sshd teve permissão negada para iniciar na porta 9999 (As mensagens de log do SELinux incluem a palavra “AVC"Para que possam ser facilmente identificados a partir de outras mensagens) porque essa é uma porta reservada para o JBoss Management serviço:
# cat /var/log/audit/audit.log | grep AVC | cauda -1.
Neste ponto, você pode desabilitar SELinux (mas não faça isso!) conforme explicado anteriormente e tente começar sshd novamente, e deve funcionar. No entanto, o semanage O utilitário pode nos dizer o que precisamos mudar para que possamos iniciar o sshd em qualquer porta que escolhermos sem problemas.
Corre,
# semanage port -l | grep ssh.
para obter uma lista das portas onde o SELinux permite que o sshd escute.
Então, vamos mudar a porta de /etc/ssh/sshd_config
para o porto 9998, adicione a porta ao contexto ssh_port_te reinicie o serviço:
# semanage port -a -t ssh_port_t -p tcp 9998. # systemctl restart sshd. # systemctl is-active sshd.
Como você pode ver, o serviço foi iniciado com sucesso desta vez. Este exemplo ilustra o fato de que o SELinux controla o número da porta TCP para suas próprias definições internas de tipo de porta.
Este é um exemplo de SELinux gerenciando um processo acessando outro processo. Se você implementasse mod_security e mod_evasive junto com Apache em seu RHEL 7 servidor, você precisa permitir httpd acessar enviar correio a fim de enviar uma notificação por e-mail na sequência de um (D) DoS ataque. No comando a seguir, omita o -P sinalize se não quiser que a mudança seja persistente nas reinicializações.
# semanage boolean -1 | grep httpd_can_sendmail. # setsebool -P httpd_can_sendmail 1. # semanage boolean -1 | grep httpd_can_sendmail.
Como você pode ver pelo exemplo acima, SELinux booleano configurações (ou apenas booleanos) são regras verdadeiras / falsas embutidas nas políticas SELinux. Você pode listar todos os booleanos com semanage boolean -l
, e alternativamente canalize-o para grep para filtrar a saída.
Suponha que você esteja servindo um site estático usando um diretório diferente do padrão (/var/www/html
), dizer /websites (pode ser o caso se você estiver armazenando seus arquivos da web em uma unidade de rede compartilhada, por exemplo, e precisar montá-lo em /websites).
uma). Criar um index.html arquivo dentro /websites com os seguintes conteúdos:
Teste SELinux
Se você fizer,
# ls -lZ /websites/index.html.
você verá que o index.html arquivo foi rotulado com o default_t SELinux tipo, que o Apache não pode acessar:
b). Mudar o DocumentRoot diretiva em /etc/httpd/conf/httpd.conf
para /websites e não se esqueça de atualizar o bloco de diretório correspondente. Em seguida, reinicie o Apache.
c). Navegue até http: //
, e você deve obter uma resposta 503 HTTP Forbidden.
d). Em seguida, altere o rótulo de /websites, recursivamente, para o httpd_sys_content_t digite para conceder ao Apache acesso somente leitura a esse diretório e seu conteúdo:
# semanage fcontext -a -t httpd_sys_content_t "/websites(/.*)?"
e). Finalmente, aplique a política SELinux criada em d):
# restorecon -R -v / websites.
Agora reinicie o Apache e navegue até http: //
novamente e você verá o arquivo html exibido corretamente:
Neste artigo, examinamos o básico de SELinux. Observe que devido à vastidão do assunto, uma explicação completa e detalhada não é possível em um único artigo, mas nós acredito que os princípios descritos neste guia irão ajudá-lo a avançar para tópicos mais avançados, caso deseje fazer assim.
Se me permite, vou recomendar dois recursos essenciais para começar: o Página NSA SELinux e a Usuário e administrador do RHEL 7 SELinux guia.
Não hesite em nos informar se tiver dúvidas ou comentários.