Uma tradução do artigo foi preparada especificamente para os alunos do curso Linux Administrator .
Aqui você obterá respostas para perguntas importantes sobre a vida, o universo e tudo isso no Linux com segurança aprimorada."A verdade importante é que as coisas nem sempre são o que parecem ser bem conhecidas ..."
- Douglas Adams, o Guia do Mochileiro das Galáxias
Segurança Melhorando a confiabilidade. Conformidade. Política. Quatro cavaleiros do apocalipse do administrador de sistemas. Além de nossas tarefas diárias - monitoramento, backup, implementação, configuração, atualização etc. - também somos responsáveis pela segurança de nossos sistemas. Mesmo os sistemas em que um fornecedor terceirizado recomenda desativar a segurança aprimorada. Isso é semelhante ao trabalho de
Ethan Hunt da Missão Impossível.
Diante desse dilema, alguns administradores de sistemas decidem tomar a
pílula azul porque acham que nunca saberão a resposta para a grande questão da vida, do universo e tudo mais. E, como todos sabemos, esta resposta é 42.
No espírito do “Guia do Mochileiro das Galáxias”, aqui estão 42 respostas para perguntas importantes sobre como gerenciar e usar o
SELinux em seus sistemas.
1. O SELinux é um sistema de controle de acesso forçado, o que significa que todo processo possui um rótulo. Cada arquivo, diretório e objeto do sistema também possui tags. Regras de política controlam o acesso entre processos e objetos rotulados. O kernel impõe essas regras.
2. Os dois conceitos mais importantes são:
Rotulagem - rotulagem (arquivos, processos, portas etc.) e
Imposição de tipos (que isola os processos entre si com base nos tipos).
3. O formato de etiqueta correto é
user:role:type:level
(opcional).
4. O objetivo de fornecer
segurança multinível
(MLS ) é gerenciar processos (domínios) com base no nível de segurança dos dados que eles usarão. Por exemplo, um processo secreto não pode ler dados ultrassecretos.
5. Garantir que o
MCS (Multi-Category Security ) proteja processos semelhantes entre si (por exemplo, máquinas virtuais, mecanismos OpenShift, sandboxes SELinux, contêineres etc.).
6. Parâmetros do kernel para alterar os modos do SELinux na inicialização:
autorelabel=1
força o sistema a começar a marcar novamenteselinux=0
kernel não carrega a infraestrutura do SELinuxenforcing=0
carregamento no modo permissivo
7. Se você precisar remarcar todo o sistema:
# touch /.autorelabel
#reboot
Se a marcação do sistema contiver um grande número de erros, talvez seja necessário inicializar no modo permissivo para que a marcação seja bem-sucedida.
8. Para verificar se o SELinux está ativado:
# getenforce
9. Para ativar / desativar temporariamente o SELinux:
# setenforce [1|0]
10. Verificando o status do SELinux:
# sestatus
11. Arquivo de configuração:
/etc/selinux/config
12. Como o SELinux funciona? Aqui está um exemplo de rotulagem para o servidor da web Apache:
- Representação binária:
/usr/sbin/httpd→httpd_exec_t
- Diretório de configuração:
/etc/httpd→httpd_config_t
- Diretório do arquivo de log:
/var/log/httpd → httpd_log_t
- Diretório de Conteúdo:
/var/www/html → httpd_sys_content_t
- Script de inicialização:
/usr/lib/systemd/system/httpd.service → httpd_unit_file_d
- Processo:
/usr/sbin/httpd -DFOREGROUND → httpd_t
- Portas:
80/tcp, 443/tcp → httpd_t, http_port_t
Um processo em execução no contexto de httpd_t
pode interagir com um objeto chamado httpd_something_t
.13. Muitos comandos aceitam o argumento
-Z
para visualizar, criar e alterar o contexto:
ls -Z
id -Z
ps -Z
netstat -Z
cp -Z
mkdir -Z
Os contextos são definidos quando os arquivos são criados com base no contexto do diretório pai (com algumas exceções). Os RPMs podem definir contextos como durante a instalação.14. Há quatro causas principais de erros do SELinux, descritas em mais detalhes nos parágrafos 15 a 21 abaixo:
- Problemas de rotulagem
- Por causa de algo que o SELinux precisa saber
- Erro na política / aplicativo do SELinux
- Suas informações podem estar comprometidas.
15. Problema com a marcação : se seus arquivos em
/srv/myweb
marcados incorretamente, o acesso poderá ser negado. Aqui estão algumas maneiras de corrigir isso:
- Se você conhece o rótulo:
# semanage fcontext -a -t httpd_sys_content_t '/srv/myweb(/.*)?'
- Se você conhece um arquivo com marcações equivalentes:
# semanage fcontext -a -e /srv/myweb /var/www
- Tendo restaurado o contexto (para ambos os casos):
# restorecon -vR /srv/myweb
16. O problema com a marcação: se você mover o arquivo em vez de copiá-lo, o arquivo manterá seu contexto original. Para corrigir este problema:
- Mude o comando de contexto rotulado:
# chcon -t httpd_system_content_t /var/www/html/index.html
- Mude o comando de contexto com o rótulo do link:
# chcon --reference /var/www/html/ /var/www/html/index.html
- Restaure o contexto (nos dois casos):
# restorecon -vR /var/www/html/
17. Se o
SELinux precisar saber que o HTTPD está escutando na porta 8585, informe ao SELinux:
# semanage port -a -t http_port_t -p tcp 8585
18. O SELinux precisa conhecer os valores booleanos que permitem alterar partes da política do SELinux em tempo de execução sem o conhecimento de reescrever as políticas do SELinux. Por exemplo, se você quiser que o httpd envie um email, digite:
# setsebool -P httpd_can_sendmail 1
19. O SELinux precisa conhecer os valores lógicos para ativar / desativar as configurações do SELinux:
- Para ver todos os valores booleanos:
# getsebool -a
- Para ver uma descrição de cada um:
# semanage boolean -l
- Para definir um valor booleano:
# setsebool [_boolean_] [1|0]
- Para instalação permanente, adicione
-P
. Por exemplo: # setsebool httpd_enable_ftp_server 1 -P
20. As políticas / aplicativos do SELinux podem conter erros, incluindo:
- Caminhos de código extravagantes
- Configurações
- Redirecionar stdout
- Vazamentos no descritor de arquivo
- Memória executável
- Bibliotecas mal construídas
Bilhetes abertos (não envie um relatório ao Bugzilla; não há SLA no Bugzilla).
21. Suas informações podem ser comprometidas se você tiver domínios limitados tentando:
- Faça o download dos módulos do kernel
- Desativar o modo SELinux imposto
- Escreva em
etc_t/shadow_t
- Alterar regras do iptables
22. Ferramentas SELinux para desenvolver módulos de políticas:
# yum -y install setroubleshoot setroubleshoot-server
Reinicialize ou reinicie o
auditd
após a instalação.
23. Use
journalctl
para listar todos os logs associados ao
setroubleshoot
:
# journalctl -t setroubleshoot --since=14:20
24. Use
journalctl
para listar todos os logs associados a um rótulo SELinux específico. Por exemplo:
# journalctl _SELINUX_CONTEXT=system_u:system_r:policykit_t:s0
25. Se ocorrer um erro do SELinux, use o log
setroubleshoot
com algumas soluções possíveis.
Por exemplo, do
journalctl
:
Jun 14 19:41:07 web1 setroubleshoot: SELinux is preventing httpd from getattr access on the file /var/www/html/index.html. For complete message run: sealert -l 12fd8b04-0119-4077-a710-2d0e0ee5755e # sealert -l 12fd8b04-0119-4077-a710-2d0e0ee5755e SELinux is preventing httpd from getattr access on the file /var/www/html/index.html. ***** Plugin restorecon (99.5 confidence) suggests ************************ If you want to fix the label, /var/www/html/index.html default label should be httpd_syscontent_t. Then you can restorecon. Do # /sbin/restorecon -v /var/www/html/index.html
26. Log: O SELinux registra informações em muitos lugares:
- / var / log / messages
- /var/log/audit/audit.log
- /var/lib/setroubleshoot/setroubleshoot_database.xml
27. Log: procure erros do SELinux no log de auditoria:
# ausearch -m AVC,USER_AVC,SELINUX_ERR -ts today
28. Para localizar as mensagens do SELinux Access Vector Cache (AVC) para um serviço específico:
# ausearch -m avc -c httpd
29. O utilitário
audit2allow
coleta informações de logs de operações proibidas e, em seguida, gera regras de política de permissão do SELinux. Por exemplo:
- Para criar uma descrição legível do motivo do acesso negado:
# audit2allow -w -a
- Para exibir uma regra de imposição de tipo que permita acesso negado:
# audit2allow -a
- Para criar um módulo personalizado:
# audit2allow -a -M mypolicy
- A opção
-M
cria um arquivo de imposição de tipo (.te) com o nome especificado e compila a regra em um pacote de políticas (.pp): mypolicy.pp mypolicy.te
- Para instalar um módulo personalizado:
# semodule -i mypolicy.pp
30. Para configurar um processo separado (domínio) para funcionar no modo permissivo:
# semanage permissive -a httpd_t
31. Se você não deseja mais que o domínio seja permissivo:
# semanage permissive -d httpd_t
32. Para desativar todos os domínios permissivos:
# semodule -d permissivedomains
33. Habilitando a política do MLS SELinux:
# yum install selinux-policy-mls
/etc/selinux/config:
SELINUX=permissive
SELINUXTYPE=mls
# yum install selinux-policy-mls
/etc/selinux/config:
SELINUX=permissive
SELINUXTYPE=mls
Verifique se o SELinux está no modo permissivo:
# setenforce 0
Use o script
fixfiles
para garantir que os arquivos sejam remarcados durante a próxima reinicialização:
# fixfiles -F onboot # reboot
34. Crie um usuário com um intervalo MLS específico:
# useradd -Z staff_u john
Utilizando o comando
useradd
, mapeie o novo usuário para o usuário existente do SELinux (neste caso,
staff_u
).
35. Para ver a correspondência entre usuários do SELinux e Linux:
# semanage login -l
36. Defina um intervalo específico para o usuário:
# semanage login --modify --range s2:c100 john
37. Para corrigir o rótulo no diretório inicial do usuário (se necessário):
# chcon -R -l s2:c100 /home/john
38. Para visualizar as categorias atuais:
# chcat -L
39. Para alterar categorias ou começar a criar suas próprias, edite o arquivo da seguinte maneira:
/etc/selinux/_<
selinuxtype >
_/setrans.conf
40. Para executar um comando ou script em um arquivo, função e contexto de usuário específicos:
# runcon -t initrc_t -r system_r -u user_u yourcommandhere
- contexto do arquivo
-t
-r
contexto da função- contexto do usuário
-u
41. Contêineres que trabalham com o SELinux desativado:
- Podman:
# podman run --security-opt label=disable …
- Docker:
# docker run --security-opt label=disable …
42. Se você precisar conceder ao contêiner acesso total ao sistema:
- Podman:
# podman run --privileged …
- Docker:
# docker run --privileged …
E agora você já sabe a resposta. Portanto, por favor: não entre em pânico e ative o SELinux.Referências: