Observação:

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:

Pré-requisitos

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.

  1. 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>
    
  2. Crie um usuário e defina uma senha.

    sudo useradd -u 8000 ralph
    echo "ralph:oracle" | sudo chpasswd
    
  3. 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
    
  4. 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.

  1. Confirme verificando o modo SELinux.

    Ele deve ser definido como Enforcing.

    getenforce
    
  2. 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.

  1. 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).

  2. 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 e sshd.

  3. Obtenha uma listagem de tipos específicos do SELinux.

    O grep limitará a saída somente aos tipos que contêm a palavra ssh.

    seinfo -t | grep ssh
    
  4. 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 tipo sshd_t. Portanto, na política targeted, espera-se uma regra para o atributo sshd_t SELinux que declara que os objetos com sshd_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 entre ssh_home_t e ssh_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
    
  5. 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.

  1. Determine qual pacote fornece o utilitário.

    sudo dnf whatprovides semanage
    

    Os resultados mostram que /usr/sbin/semanage faz parte do pacote policycoreutils-python-utils.

  2. Instale o pacote e quaisquer dependências.

    sudo dnf install -y policycoreutils-python-utils
    
  3. Verifique quais portas o SELinux permite para sshd.

    sudo semanage port -l | grep ssh
    

    Exemplo de Saída:

    ssh_port_t                     tcp      22
    
  4. 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.
  5. Verifique quais portas o SELinux permite agora.

    sudo semanage port -l | grep ssh
    

    Exemplo de Saída:

    ssh_port_t                     tcp      2222, 22
    
  6. 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 tipo ssh_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.

  1. 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ário unconfined_u.
  2. Obtenha uma listagem dos usuários do SELinux.

    seinfo -u
    
  3. 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. O domain é 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.

    1. Crie o novo mapeamento para guest_u.

      sudo semanage login -a -s guest_u ralph
      
    2. Verifique o mapeamento.

      sudo semanage login -l
      
    3. 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 um sudo ou su.

      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>
      
    4. 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
      
    5. 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.

    6. Teste a conectividade de rede com ping.

      ping localhost
      

      Exemplo de Saída:

      ping: socket: Permission denied
      
    7. 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 de ifconfig.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ário guest_u do SELinux o bloqueie.

    8. 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.

  1. 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).
  2. 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
    ...
    
  3. 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
    
  4. 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
    ...
    
  5. 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.
  6. 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.

    1. 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
      
    2. Altere o booliano para ativado.

      sudo setsebool virt_use_samba on
      

      ou

      sudo semanage boolean -m --on virt_use_samba
      
    3. Verifique o status atual.

      getsebool virt_use_samba
      
    4. Certifique-se de que a alteração sobreviva a uma reinicialização.

      sudo setsebool -P virt_use_samba on
      
  7. 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.

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.

  1. Crie o novo diretório com três arquivos.

    sudo mkdir -p /web
    sudo touch /web/file{1,2,3}
    
  2. 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.

  3. 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
    
  4. 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
    
  5. 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 de restorecon.

  6. 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.

  7. 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 
    
  8. 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
    
  9. 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.
  10. 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.