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,
exit
a 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.
sestatus
A saída do comando
sestatus
mostra 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/passwd
Exemplo de Saída:
-rw-r--r--. 1 root root system_u:object_r:passwd_file_t:s0 1892 Apr 13 14:39 /etc/passwd
A saída
ls
com a opção-Z
exibe 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
targeted
do 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
head
limita 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
ssh
esshd
. - O comando
-
Obtenha uma listagem de tipos específicos do SELinux.
O
grep
limitará 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
ps
obtém os rótulos de segurança dos processos.ps -efZ | grep sshd
Exemplo 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 sshd
O uso de
ls
obté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.pub
O processo do daemon
sshd
usa o tiposshd_t
. Portanto, na política targeted, espera-se uma regra para o atributosshd_t
SELinux que declara que os objetos comsshd_t
podem acessar qualquer objeto com o seguinte atributo de segurança:etc_t
sshd_key_t
- ...
Da mesma forma, se examinarmos o comando
ssh
, poderemos determinar um mapeamento semelhante entressh_home_t
essh_exec_t
.ls -lZ /usr/bin/ssh
Exemplo de Saída:
-rwxr-xr-x. 1 root root system_u:object_r:ssh_exec_t:s0 775720 Oct 9 2021 /usr/bin/ssh
ls -lZ ~/.ssh
Exemplo 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
.whoami
id -Z
Exemplo 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 semanage
Os resultados mostram que
/usr/sbin/semanage
faz 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 ssh
Exemplo 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
semanage
para 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
-a
adiciona uma nova regra de política do tipo-t
.
- A opção
-
Verifique quais portas o SELinux permite agora.
sudo semanage port -l | grep ssh
Exemplo 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 443
Exemplo de Saída:
ValueError: Port tcp/443 already defined
O erro ocorreu porque estamos tentando alternar a porta 443 do tipo
http_port_t
para 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
oracle
nã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,
sudo
e 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_u
só ocorrem após o log-in e não executando umsudo
ousu
.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 -Z
Exemplo 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 axZ
A saída mostra o usuário ralph mapeado para
guest_u
e pode fazer log-in. No entanto, ralph não deve ser capaz de acessar a rede. -
Teste a conectividade de rede com
ping
.ping localhost
Exemplo de Saída:
ping: socket: Permission denied
-
Além disso, teste a rede usando
curl
.curl ifconfig.me
Exemplo de Saída:
curl: (6) Could not resolve host: ifconfig.me
A mensagem indica que
curl
não pode resolver o nome DNS deifconfig.me
para um endereço IP. O DNS, um serviço de rede Linux, requer a abertura de um soquete, de modo que o usuárioguest_u
do 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 -l
Exemplo 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 -a
Exemplo 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 -A
Exemplo 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 -AT
Exemplo de Saída:
allow user_t ping_t:process transition; [ selinuxuser_ping ]:True
- A transição será permitida se o booliano
user_ping
SELinux 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 samba
Exemplo de Saída:
virt_use_samba (off , off) Allow virt to use samba
-
Altere o booliano para ativado.
sudo setsebool virt_use_samba on
ou
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 -C
Exemplo 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 /web
Exemplo 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-a
adiciona um registro ao arquivo/etc/selinux/targeted/contexts/files/file_contexts.local
e-t
define 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 /web
Exemplo 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 file3
Observe 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 -l
Exemplo 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 /web
Exemplo 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.