Observação:
- Este tutorial está disponível em um ambiente de laboratório gratuito fornecido pela Oracle.
- Ele usa valores de exemplo para credenciais, tenancy e compartimentos do Oracle Cloud Infrastructure. Ao concluir o laboratório, substitua esses valores pelos específicos do seu ambiente de nuvem.
Usar o SELinux no Oracle Linux
Introdução
O SELinux é um conjunto de mods de kernel e ferramentas de espaço do usuário que fornecem outra camada de segurança do sistema, controle de acesso preciso, políticas definidas pelo administrador em todo o sistema e mitigação aprimorada para ataques de escalação de privilégios.
Este tutorial guia você usando essas ferramentas de espaço do usuário para ajudar a manter o sistema em execução no modo de imposição.
Objetivos
Neste laboratório, você aprenderá a:
- Verifique o modo e o status do SELinux
- Compreender os rótulos de segurança do SELinux
- Trabalhar com serviços de rede do SELinux
- Usar usuários do SELinux
- Mudar os booleanos do SELinux
- Avaliar contextos de arquivos do SELinux
Pré-requisitos
- Um sistema com o Oracle Linux 8 instalado com a seguinte configuração:
- um usuário não raiz com permissões
sudo
- um usuário não raiz com permissões
Configurar Ambiente de Laboratório
Observação: ao usar o ambiente de laboratório gratuito, consulte Conceitos Básicos do Oracle Linux Lab para obter conexão e outras instruções de uso.
Criar um Usuário
Um usuário adicional permite testar a atribuição de um usuário do SELinux posteriormente neste laboratório.
-
Se ainda não estiver conectado, abra um terminal e conecte-se via ssh ao sistema ol8-server.
ssh oracle@<ip_address_of_ol8-server> -
Crie um usuário e defina uma senha.
sudo useradd -u 8000 ralph echo "ralph:oracle" | sudo chpasswd -
Permita conexões SSH.
Copie a chave SSH da conta de usuário
oracle.sudo mkdir /home/ralph/.ssh sudo cp /home/oracle/.ssh/authorized_keys /home/ralph/.ssh/authorized_keys sudo chown -R ralph:ralph /home/ralph/.ssh sudo chmod 700 /home/ralph/.ssh sudo chmod 600 /home/ralph/.ssh/authorized_keys -
Abra um novo terminal e verifique se a conexão SSH funciona.
ssh ralph@<ip_address_of_ol8-server>Em seguida,
exita sessão e feche a janela do terminal.
Modo e Status de SELinux
O Oracle Linux instala o SELinux por padrão e é executado no modo Enforcing.
-
Confirme verificando o modo SELinux.
Ele deve ser definido como
Enforcing.getenforce -
Verifique os estados e os modos do SELinux.
sestatusA saída do comando
sestatusmostra o status, a política e o modo do SELinux.Exemplo de Saída:
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 Memory protection checking: actual (secure) Max kernel policy version: 31
Rótulos de Segurança do SELinux
Cada recurso de processo e sistema no SELinux tem um rótulo de segurança denominado contexto do SELinux. O contexto do SELinux, também chamado de label do SELinux, concentra-se nas propriedades de segurança e garante uma maneira consistente de fazer referência a objetos na política do SELinux.
-
Mostrar o label de segurança do SELinux para um arquivo.
ls -ldZ /etc/passwdExemplo de Saída:
-rw-r--r--. 1 root root system_u:object_r:passwd_file_t:s0 1892 Apr 13 14:39 /etc/passwdA saída
lscom a opção-Zexibe os quatro campos de atributo do SELinux:- usuário:
system_u - função:
object_r - tipo:
passwd_file_t - segurança:
s0
O mais importante é o tipo SELinux, pois a maioria das regras de política
targeteddo SELinux aproveita os tipos do SELinux para definir a interação permitida entre um objeto (por exemplo, processo) e outro (por exemplo, arquivo). - usuário:
-
Obtenha uma listagem dos tipos SELinux disponíveis.
seinfo --type | head- O comando
headlimita a saída somente às dez primeiras linhas de saída.
A saída completa mostra os tipos de SELinux existentes para muitos comandos e serviços diferentes, como
sshesshd. - O comando
-
Obtenha uma listagem de tipos específicos do SELinux.
O
greplimitará a saída somente aos tipos que contêm a palavrassh.seinfo -t | grep ssh -
Obtenha uma lista dos cabos de segurança para processos e arquivos de configuração específicos.
O uso de
psobtém os rótulos de segurança dos processos.ps -efZ | grep sshdExemplo de Saída:
system_u:system_r:sshd_t:s0-s0:c0.c1023 root 2535 1 0 14:37 ? 00:00:00 /usr/sbin/sshd -D system_u:system_r:sshd_t:s0-s0:c0.c1023 root 18514 2535 0 15:21 ? 00:00:00 sshd: oracle [priv] unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 oracle 18528 18514 0 15:21 ? 00:00:00 sshd: oracle@pts/0 unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 oracle 23611 18529 0 15:41 pts/0 00:00:00 grep --color=auto sshdO uso de
lsobtém os rótulos de segurança dos arquivos de configuração.ls -lZ /etc/ssh/Exemplo de Saída:
total 600 -rw-r--r--. 1 root root system_u:object_r:etc_t:s0 577388 Oct 9 2021 moduli -rw-r--r--. 1 root root system_u:object_r:etc_t:s0 1770 Oct 9 2021 ssh_config drwxr-xr-x. 2 root root system_u:object_r:etc_t:s0 28 Feb 18 08:51 ssh_config.d -rw-------. 1 root root system_u:object_r:etc_t:s0 4268 Apr 13 14:37 sshd_config -rw-r-----. 1 root ssh_keys system_u:object_r:sshd_key_t:s0 537 Apr 13 14:37 ssh_host_ecdsa_key -rw-r--r--. 1 root root system_u:object_r:sshd_key_t:s0 197 Apr 13 14:37 ssh_host_ecdsa_key.pub -rw-r-----. 1 root ssh_keys system_u:object_r:sshd_key_t:s0 432 Apr 13 14:37 ssh_host_ed25519_key -rw-r--r--. 1 root root system_u:object_r:sshd_key_t:s0 117 Apr 13 14:37 ssh_host_ed25519_key.pub -rw-r-----. 1 root ssh_keys system_u:object_r:sshd_key_t:s0 2635 Apr 13 14:37 ssh_host_rsa_key -rw-r--r--. 1 root root system_u:object_r:sshd_key_t:s0 589 Apr 13 14:37 ssh_host_rsa_key.pubO processo do daemon
sshdusa o tiposshd_t. Portanto, na política targeted, espera-se uma regra para o atributosshd_tSELinux que declara que os objetos comsshd_tpodem acessar qualquer objeto com o seguinte atributo de segurança:etc_tsshd_key_t- ...
Da mesma forma, se examinarmos o comando
ssh, poderemos determinar um mapeamento semelhante entressh_home_tessh_exec_t.ls -lZ /usr/bin/sshExemplo de Saída:
-rwxr-xr-x. 1 root root system_u:object_r:ssh_exec_t:s0 775720 Oct 9 2021 /usr/bin/sshls -lZ ~/.sshExemplo de Saída:
total 4 -rw-------. 1 oracle oracle unconfined_u:object_r:ssh_home_t:s0 404 Apr 13 14:39 authorized_keys -
Obter o contexto de segurança de um usuário.
O outro tipo de contexto de interesse é
unconfined_t. Os objetos com esse tipo de SELinux, como usuários, têm acesso irrestrito. Esse nível de acesso significa que o SELinux não limita o que os usuários podem fazer e só os inibe por meio de permissões DAC. O DAC (Discretionary Access Control) é a política de segurança tratada por usuários, grupos e outras permissões tradicionais.Por exemplo, mostre os atributos de segurança para o usuário
oracle.whoamiid -ZExemplo de Saída:
[oracle@ol-selinux ~]$ whoami oracle [oracle@ol-selinux ~]$ id -Z unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
Serviços de Rede e SELinux
O SELinux rastreia as configurações para os pacotes de software baseados em rede mais usados em seu banco de dados interno. Esse rastreamento permite ao SELinux proteger o sistema contra serviços voltados para o exterior propensos a ataques.
Portanto, o SELinux pode impedir que um serviço funcione se você configurar o software para usar um diretório ou porta não padrão.
Para mostrar o que o SELinux sabe sobre as portas padrão do sistema, precisamos usar o utilitário SELinux semanage. O Oracle Linux não instala o utilitário por padrão; portanto, instale-o.
-
Determine qual pacote fornece o utilitário.
sudo dnf whatprovides semanageOs resultados mostram que
/usr/sbin/semanagefaz parte do pacotepolicycoreutils-python-utils. -
Instale o pacote e quaisquer dependências.
sudo dnf install -y policycoreutils-python-utils -
Verifique quais portas o SELinux permite para
sshd.sudo semanage port -l | grep sshExemplo de Saída:
ssh_port_t tcp 22 -
Adicione uma nova porta à política do SELinux.
Se alterássemos a porta na qual o daemon SSH faz listening para 2222 ou alterássemos onde ele armazena a configuração padrão; seria necessário informar ao SELinux que queremos essas alterações. Podemos usar novamente
semanagepara permitir uma porta personalizada adicionando uma nova regra de política.sudo sudo semanage port -a -t ssh_port_t -p tcp 2222- A opção
-aadiciona uma nova regra de política do tipo-t.
- A opção
-
Verifique quais portas o SELinux permite agora.
sudo semanage port -l | grep sshExemplo de Saída:
ssh_port_t tcp 2222, 22 -
Modifique uma porta na política do SELinux.
Digamos que queríamos mapear o daemon SSH para a porta 443. Repita o mesmo comando, mas com uma mensagem informando que a porta já está em uso.
sudo semanage port -a -t ssh_port_t -p tcp 443Exemplo de Saída:
ValueError: Port tcp/443 already definedO erro ocorreu porque estamos tentando alternar a porta 443 do tipo
http_port_tpara o tipossh_port_t. Para que isso funcione, use a opção-m, que modifica o registro do objeto de porta.sudo semanage port -m -t ssh_port_t -p tcp 443
Usuários do SELinux
Cada usuário do Linux é mapeado para um usuário do SELinux usando uma política do SELinux. Essa abordagem permite que os usuários do Linux herdem restrições com base no mapeamento de usuários do SELinux. O mapeamento padrão no Oracle Linux é o log-in __default__, que é mapeado para o usuário unconfined_u do SELinux.
-
Obtenha uma listagem de todos os mapeamentos de usuários do Linux atuais.
sudo semanage login -l- Observe que nosso usuário
oraclenão está listado e, portanto, mapeia para o usuáriounconfined_u.
- Observe que nosso usuário
-
Obtenha uma listagem dos usuários do SELinux.
seinfo -u -
Restringir as ações de um usuário.
Embora um usuário Linux padrão seja executado sem restrições, as ações do usuário podem induzir restrições com base em um aplicativo
domain. Odomainé um grupo de objetos com o mesmo tipo de SELinux.E se quisermos impedir que os usuários usem o Sistema X Window,
sudoe a rede?O SELinux tem um usuário para isso.
Para verificar isso, precisamos ter outro usuário do Linux. Usaremos o usuário ralph.
-
Crie o novo mapeamento para
guest_u.sudo semanage login -a -s guest_u ralph -
Verifique o mapeamento.
sudo semanage login -l -
Teste se ralph não pode acessar a rede.
As restrições herdadas de
guest_usó ocorrem após o log-in e não executando umsudoousu.Abra um terminal novo e conecte-se via ssh ao sistema ol8-server como o usuário ralph.
ssh ralph@<ip_address_of_ol8-server> -
Verifique o contexto do usuário.
id; id -ZExemplo de Saída:
uid=8000(ralph) gid=8000(ralph) groups=8000(ralph) context=guest_u:guest_r:guest_t:s0 guest_u:guest_r:guest_t:s0 -
Mostrar o contexto de segurança dos processos atuais do usuário:
ps axZA saída mostra o usuário ralph mapeado para
guest_ue pode fazer log-in. No entanto, ralph não deve ser capaz de acessar a rede. -
Teste a conectividade de rede com
ping.ping localhostExemplo de Saída:
ping: socket: Permission denied -
Além disso, teste a rede usando
curl.curl ifconfig.meExemplo de Saída:
curl: (6) Could not resolve host: ifconfig.meA mensagem indica que
curlnão pode resolver o nome DNS deifconfig.mepara um endereço IP. O DNS, um serviço de rede Linux, requer a abertura de um soquete, de modo que o usuárioguest_udo SELinux o bloqueie. -
Fechar a janela do terminal atual.
Terminamos o teste com o usuário ralph, então feche essa janela de terminal.
exit
-
Booleanos do SELinux
Os boolianos do SELinux permitem alterações de política específicas no runtime sem saber como escrever políticas do SELinux. O Oracle Linux fornece muitos boolianos incorporados, ou os administradores familiarizados com políticas do SELinux podem criar seus próprios. Os administradores são incentivados a escrever políticas como boolianos se a política implementada for opcional.
-
Obtenha uma lista de boolianos juntamente com seu significado.
Alterne de volta para o terminal em que você está conectado como oracle e execute o comando a seguir.
sudo semanage boolean -lExemplo de Saída:
SELinux boolean State Default Description abrt_anon_write (off , off) Allow abrt to anon write abrt_handle_event (off , off) Allow abrt to handle event abrt_upload_watch_anon_write (on , on) Allow abrt to upload watch anon write antivirus_can_scan_system (off , off) Allow antivirus to can scan system antivirus_use_jit (off , off) Allow antivirus to use jit auditadm_exec_content (on , on) Allow auditadm to exec content authlogin_nsswitch_use_ldap (off , off) Allow authlogin to nsswitch use ldap authlogin_radius (off , off) Allow authlogin to radius ...- A saída explica o que cada booliano faz e se ativado (
on) ou desativado (off).
- A saída explica o que cada booliano faz e se ativado (
-
Obtenha uma lista dos boolianos e seu status.
sudo getsebool -aExemplo de Saída:
abrt_anon_write --> off abrt_handle_event --> off abrt_upload_watch_anon_write --> on antivirus_can_scan_system --> off antivirus_use_jit --> off auditadm_exec_content --> on authlogin_nsswitch_use_ldap --> off authlogin_radius --> off authlogin_yubikey --> off ... -
Obtenha o status de um único booliano.
Se o nome booliano for conhecido, informe o nome como argumento para obter apenas o status booliano.
sudo getsebool virt_use_nfs -
Consulte a política do SELinux para obter um valor booliano.
Já se perguntou o que é acionador booliano dentro da política do SELinux? O SELinux fornece um utilitário para consultar essas regras.
sesearch -b virt_use_nfs -AExemplo de Saída:
allow fsdaemon_t autofs_t:dir { getattr open search }; [ virt_use_nfs ]:True allow fsdaemon_t nfs_t:dir { getattr ioctl lock open read search }; [ virt_use_nfs ]:True allow fsdaemon_t nfs_t:dir { getattr ioctl lock open read search }; [ virt_use_nfs ]:True allow fsdaemon_t nfs_t:dir { getattr ioctl lock open read search }; [ virt_use_nfs ]:True allow fsdaemon_t nfs_t:dir { getattr open search }; [ virt_use_nfs ]:True allow fsdaemon_t nfs_t:dir { getattr open search }; [ virt_use_nfs ]:True allow fsdaemon_t nfs_t:file { getattr ioctl lock open read }; [ virt_use_nfs ]:True allow fsdaemon_t nfs_t:lnk_file { getattr read }; [ virt_use_nfs ]:True ... -
Consulte se um booliano permitir acesso.
E se um acesso específico for permitido com base em um booliano condicional? Responda à pergunta: O ping do usuário permite a transição de um domínio de usuário (
user_t) para o domínio de ping (ping_t)?sesearch -s user_t -t ping_t -c process -p transition -ATExemplo de Saída:
allow user_t ping_t:process transition; [ selinuxuser_ping ]:True- A transição será permitida se o booliano
user_pingSELinux estiver ativado.
- A transição será permitida se o booliano
-
Ative um booliano.
Vamos supor que queremos permitir que o KVM armazene imagens em um compartilhamento do Samba? Há um booliano para isso também.
-
Localize o booliano.
sudo semanage boolean -l | grep virt | grep sambaExemplo de Saída:
virt_use_samba (off , off) Allow virt to use samba -
Altere o booliano para ativado.
sudo setsebool virt_use_samba onou
sudo semanage boolean -m --on virt_use_samba -
Verifique o status atual.
getsebool virt_use_samba -
Certifique-se de que a alteração sobreviva a uma reinicialização.
sudo setsebool -P virt_use_samba on
-
-
Mostrar personalizações de políticas locais do SELinux.
Sabendo que alteramos as configurações padrão, podemos mostrar essas personalizações locais.
sudo semanage boolean -l -CExemplo de Saída:
SELinux boolean State Default Description virt_use_samba (on , on) Allow virt to use samba- A saída mostra que o valor padrão agora é
on. O valor padrão foi alterado depois de tornar a chave permanente e gravar os valores pendentes no arquivo de política no disco.
- A saída mostra que o valor padrão agora é
Contexto do Arquivo SELinux
Todos os arquivos e diretórios são rotulados com um contexto SELinux ao executar o SELinux. Examinaremos alguns comandos para gerenciar a rotulagem do sistema de arquivos.
Um exemplo familiar é criar um novo diretório para a raiz de documentos do Nginx.
-
Crie o novo diretório com três arquivos.
sudo mkdir -p /web sudo touch /web/file{1,2,3} -
Verifique o novo diretório e a rotulagem do arquivo.
ls -lZ /webExemplo de Saída:
total 0 -rw-r--r--. 1 root root unconfined_u:object_r:default_t:s0 0 Apr 14 19:00 file1 -rw-r--r--. 1 root root unconfined_u:object_r:default_t:s0 0 Apr 14 19:00 file2 -rw-r--r--. 1 root root unconfined_u:object_r:default_t:s0 0 Apr 14 19:00 file3- O tipo de contexto do novo diretório e os arquivos são
default_t.
Observação: Arquivos e diretórios recém-criados herdam o tipo SELinux de seus diretórios pai.
- O tipo de contexto do novo diretório e os arquivos são
-
Fazer alterações temporárias de rótulo.
Como parte da solução ou do teste de problemas, podemos alterar temporariamente o contexto.
sudo chcon -R -t httpd_sys_content_t /web/ls -lZ /web -
Retorne rótulos às definições padrão.
Alterne o contexto de volta para o tipo de contexto padrão.
sudo restorecon -R -v /web/Exemplo de Saída:
[oracle@ol-selinux ~]$ sudo restorecon -R -v /web/ Relabeled /web from unconfined_u:object_r:httpd_sys_content_t:s0 to unconfined_u:object_r:default_t:s0 Relabeled /web/file1 from unconfined_u:object_r:httpd_sys_content_t:s0 to unconfined_u:object_r:default_t:s0 Relabeled /web/file2 from unconfined_u:object_r:httpd_sys_content_t:s0 to unconfined_u:object_r:default_t:s0 Relabeled /web/file3 from unconfined_u:object_r:httpd_sys_content_t:s0 to unconfined_u:object_r:default_t:s0 [oracle@ol-selinux ~]$ ls -lZ /web total 0 -rw-r--r--. 1 root root unconfined_u:object_r:default_t:s0 0 Apr 14 19:00 file1 -rw-r--r--. 1 root root unconfined_u:object_r:default_t:s0 0 Apr 14 19:00 file2 -rw-r--r--. 1 root root unconfined_u:object_r:default_t:s0 0 Apr 14 19:00 file3 -
Tornar alterações de rótulo permanentes.
Para tornar as alterações permanentes e sobreviver a uma reinicialização, use o comando
semanage fcontext. O-aadiciona um registro ao arquivo/etc/selinux/targeted/contexts/files/file_contexts.locale-tdefine o tipo.sudo semanage fcontext -a -t httpd_sys_content_t "/web(/.*)?"Observação: Ao alterar o contexto do SELinux com
semanage fcontext, recomenda-se usar o caminho completo para o arquivo ou diretório para evitar a rotulagem incorreta de arquivos após a rotulagem do sistema de arquivos novamente ou após a execução derestorecon. -
Verifique o contexto.
ls -ldZ /web; ls -lZ /webExemplo de Saída:
[oracle@ol-selinux ~]$ ls -ldZ /web; ls -lZ /web drwxr-xr-x. 2 root root unconfined_u:object_r:default_t:s0 45 Apr 14 19:00 /web total 0 -rw-r--r--. 1 root root unconfined_u:object_r:default_t:s0 0 Apr 14 19:00 file1 -rw-r--r--. 1 root root unconfined_u:object_r:default_t:s0 0 Apr 14 19:00 file2 -rw-r--r--. 1 root root unconfined_u:object_r:default_t:s0 0 Apr 14 19:00 file3Observe que o contexto não mudou, o que esperávamos.
-
Mostre o contexto dos arquivos e diretórios recém-criados.
sudo semanage fcontext -C -lExemplo de Saída:
[oracle@ol-selinux ~]$ sudo semanage fcontext -C -l SELinux fcontext type Context /web(/.*)? all files system_u:object_r:httpd_sys_content_t:s0 -
Aplicar as alterações ao contexto.
sudo restorecon -R -v /webExemplo de Saída:
[oracle@ol-selinux ~]$ sudo restorecon -R -v /web Relabeled /web from unconfined_u:object_r:default_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0 Relabeled /web/file1 from unconfined_u:object_r:default_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0 Relabeled /web/file2 from unconfined_u:object_r:default_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0 Relabeled /web/file3 from unconfined_u:object_r:default_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0 -
Remova o novo contexto do SELinux.
sudo semanage fcontext -d "/web(/.*)?"- Este exemplo passa a expressão regular usada ao criar o contexto e o coloca no início do registro de contexto no arquivo. Como se trata de uma expressão regular, coloque-a entre aspas.
-
Aplique as alterações e verifique o contexto retornado a
default_t.sudo restorecon -R -v /web; ls -ldZ /web; ls -lZ /web
Verifique as páginas man dos utilitários mostrados. Em seguida, use o que você aprendeu para manter o SELinux no modo Enforcing.
Para Obter Mais Informações
Consulte outros recursos relacionados:
Mais Recursos de Aprendizagem
Explore outros laboratórios em docs.oracle.com/learn ou acesse mais conteúdo de aprendizado gratuito no canal YouTube do Oracle Learning. Além disso, visite education.oracle.com/learning-explorer para se tornar um Oracle Learning Explorer.
Para obter a documentação do produto, visite o Oracle Help Center.