Nota:

Uso de SELinux en Oracle Linux

Introducción

SELinux es un conjunto de mods de núcleo y herramientas de espacio de usuario que proporcionan otra capa de seguridad del sistema, control de acceso preciso, políticas definidas por el administrador en todo el sistema y mitigación mejorada para ataques de escalada de privilegios.

Este tutorial le guiará a través del uso de estas herramientas de espacio de usuario para ayudar a mantener el sistema en ejecución en modo de aplicación.

Objetivos

En este laboratorio, aprenderá a:

Requisitos

Configuración del entorno del laboratorio

Nota: Al utilizar el entorno de prácticas gratuitas, consulte Aspectos básicos de las prácticas de Oracle Linux para obtener información sobre la conexión y otras instrucciones de uso.

Creación de un usuario

Un usuario adicional permite probar la asignación de un usuario de SELinux más adelante en esta práctica.

  1. Si aún no está conectado, abra un terminal y conéctese mediante ssh al sistema ol8-server.

    ssh oracle@<ip_address_of_ol8-server>
    
  2. Cree un usuario y defina una contraseña.

    sudo useradd -u 8000 ralph
    echo "ralph:oracle" | sudo chpasswd
    
  3. Permitir conexiones SSH.

    Copie la clave SSH de la cuenta de usuario 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 un nuevo terminal y verifique que la conexión SSH funcione.

    ssh ralph@<ip_address_of_ol8-server>
    

    A continuación, exit la sesión y cierre la ventana de terminal.

Modo y estado de SELinux

Oracle Linux instala SELinux por defecto y se ejecuta en modo Enforcing.

  1. Confirme comprobando el modo SELinux.

    Se debe definir en Enforcing.

    getenforce
    
  2. Compruebe los estados y modos de SELinux.

    sestatus
    

    La salida del comando sestatus muestra el estado, la política y el modo de SELinux.

    Resultado de ejemplo:

    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
    

Etiquetas de seguridad de SELinux

Cada proceso y recurso del sistema de SELinux tiene una etiqueta de seguridad denominada contexto de SELinux. El contexto de SELinux, también denominado etiqueta de SELinux, se centra en las propiedades de seguridad y garantiza una forma coherente de hacer referencia a los objetos de la política de SELinux.

  1. Mostrar la etiqueta de seguridad de SELinux para un archivo.

    ls -ldZ /etc/passwd
    

    Resultado de ejemplo:

    -rw-r--r--. 1 root root system_u:object_r:passwd_file_t:s0 1892 Apr 13 14:39 /etc/passwd
    

    La salida ls con la opción -Z muestra los cuatro campos de atributo de SELinux:

    • usuario: system_u
    • rol: object_r
    • tipo: passwd_file_t
    • seguridad: s0

    El más importante es el tipo de SELinux, ya que la mayoría de las reglas de política de SELinux targeted aprovechan los tipos de SELinux para definir la interacción permitida entre un objeto (por ejemplo, un proceso) y otro (por ejemplo, un archivo).

  2. Obtenga una lista de los tipos de SELinux disponibles.

    seinfo --type | head
    
    • El comando head limita la salida solo a las diez primeras líneas de salida.

    La salida completa muestra que existen tipos de SELinux para muchos comandos y servicios diferentes, como ssh y sshd.

  3. Obtenga una lista de tipos de SELinux específicos.

    grep limitará la salida solo a aquellos tipos que contengan la palabra ssh.

    seinfo -t | grep ssh
    
  4. Obtenga una lista de los laboratorios de seguridad para procesos y archivos de configuración específicos.

    Al utilizar ps, se obtienen las etiquetas de seguridad para los procesos.

    ps -efZ | grep sshd
    

    Resultado de ejemplo:

    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
    

    Al utilizar ls, se obtienen las etiquetas de seguridad para los archivos de configuración.

    ls -lZ /etc/ssh/
    

    Resultado de ejemplo:

    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
    

    El proceso del daemon sshd utiliza el tipo sshd_t. Por lo tanto, en la política dirigida, se espera una regla para el atributo SELinux sshd_t que indique que los objetos con sshd_t pueden acceder a cualquier objeto con el siguiente atributo de seguridad:

    • etc_t
    • sshd_key_t
    • ...

    Del mismo modo, si examináramos el comando ssh, podríamos determinar una asignación similar entre ssh_home_t y ssh_exec_t.

    ls -lZ /usr/bin/ssh
    

    Resultado de ejemplo:

    -rwxr-xr-x. 1 root root system_u:object_r:ssh_exec_t:s0 775720 Oct  9  2021 /usr/bin/ssh
    
    ls -lZ ~/.ssh
    

    Resultado de ejemplo:

    total 4
    -rw-------. 1 oracle oracle unconfined_u:object_r:ssh_home_t:s0 404 Apr 13 14:39 authorized_keys
    
  5. Obtener el contexto de seguridad de un usuario.

    El otro tipo de contexto de interés es unconfined_t. Los objetos con este tipo de SELinux, como los usuarios, tienen acceso sin restricciones. Este nivel de acceso significa que SELinux no limita lo que los usuarios pueden hacer y solo los inhibe a través de permisos DAC. DAC (Control de acceso discrecional) es la política de seguridad gestionada por usuarios, grupos y otros permisos tradicionales.

    Por ejemplo, mostrar los atributos de seguridad para el usuario oracle.

    whoami
    
    id -Z
    

    Resultado de ejemplo:

    [oracle@ol-selinux ~]$ whoami
    oracle
    [oracle@ol-selinux ~]$ id -Z
    unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
    

Servicios de red y SELinux

SELinux realiza un seguimiento de las configuraciones de los paquetes de software basados en red más utilizados dentro de su base de datos interna. Este seguimiento permite a SELinux proteger el sistema frente a servicios externos propensos a ataques.

Por lo tanto, SELinux puede impedir que un servicio funcione si configura el software para que utilice un directorio o puerto no estándar.

Para mostrar lo que sabe SELinux sobre los puertos estándar de un sistema, debemos utilizar la utilidad semanage de SELinux. Oracle Linux no instala la utilidad por defecto, por lo que instálela.

  1. Determine qué paquete proporciona la utilidad.

    sudo dnf whatprovides semanage
    

    Los resultados muestran que /usr/sbin/semanage forma parte del paquete policycoreutils-python-utils.

  2. Instale el paquete y las dependencias.

    sudo dnf install -y policycoreutils-python-utils
    
  3. Compruebe los puertos que SELinux permite para sshd.

    sudo semanage port -l | grep ssh
    

    Resultado de ejemplo:

    ssh_port_t                     tcp      22
    
  4. Agregue un nuevo puerto a la política de SELinux.

    Si cambiáramos el puerto, el daemon SSH recibe en 2222 o cambiáramos donde almacena la configuración por defecto; entonces tendríamos que informar a SELinux de que deseamos esos cambios. Podemos volver a utilizar semanage para permitir un puerto personalizado agregando una nueva regla de política.

    sudo sudo semanage port -a -t ssh_port_t -p tcp 2222
    
    • La opción -a agrega una nueva regla de política de tipo -t.
  5. Compruebe los puertos que SELinux permite ahora.

    sudo semanage port -l | grep ssh
    

    Resultado de ejemplo:

    ssh_port_t                     tcp      2222, 22
    
  6. Modifique un puerto en la política de SELinux.

    Supongamos que queríamos asignar el daemon SSH al puerto 443. Repita el mismo comando, pero se producirá un error con un mensaje que indica que el puerto ya está en uso.

    sudo semanage port -a -t ssh_port_t -p tcp 443
    

    Resultado de ejemplo:

    ValueError: Port tcp/443 already defined
    

    Se ha producido el error porque estamos intentando cambiar el puerto 443 del tipo http_port_t al tipo ssh_port_t. Para que esto funcione, utilice la opción -m, que modifica el registro de objeto de puerto.

    sudo semanage port -m -t ssh_port_t -p tcp 443
    

Usuarios de SELinux

Cada usuario de Linux se asigna a un usuario de SELinux mediante una política de SELinux. Este enfoque permite a los usuarios de Linux heredar restricciones en función de su asignación de usuarios de SELinux. La asignación por defecto en Oracle Linux es la conexión __default__, que se asigna al usuario unconfined_u de SELinux.

  1. Obtener una lista de todas las asignaciones de usuario de Linux actuales.

    sudo semanage login -l
    
    • Observe que nuestro usuario oracle no aparece y, por lo tanto, se asigna al usuario unconfined_u.
  2. Obtenga una lista de los usuarios de SELinux.

    seinfo -u
    
  3. Restringir las acciones de un usuario.

    Aunque un usuario de Linux por defecto se ejecuta sin restricciones, las acciones del usuario pueden inducir restricciones basadas en una aplicación domain. domain es un grupo de objetos con el mismo tipo de SELinux.

    ¿Y si quisiéramos impedir que los usuarios utilicen el sistema de ventanas X, sudo y la red?

    SELinux tiene un usuario para ello.

    Para verificarlo, necesitamos otro usuario de Linux. Utilizaremos el usuario ralph.

    1. Cree la nueva asignación en guest_u.

      sudo semanage login -a -s guest_u ralph
      
    2. Verifique la asignación.

      sudo semanage login -l
      
    3. Pruebe que ralph no pueda acceder a la red.

      Las restricciones heredadas de guest_u solo se producen después del inicio de sesión y no mediante sudo o su.

      Abra un terminal nuevo y conéctese mediante ssh al sistema ol8-server como usuario ralph.

      ssh ralph@<ip_address_of_ol8-server>
      
    4. Compruebe el contexto del usuario.

      id; id -Z
      

      Resultado de ejemplo:

      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. Muestre el contexto de seguridad de los procesos actuales del usuario:

      ps axZ
      

      La salida muestra el usuario ralph asignado a guest_u y puede iniciar sesión. Sin embargo, ralph no debe poder acceder a la red.

    6. Pruebe la conectividad de red con ping.

      ping localhost
      

      Resultado de ejemplo:

      ping: socket: Permission denied
      
    7. Además, pruebe la red con curl.

      curl ifconfig.me
      

      Resultado de ejemplo:

      curl: (6) Could not resolve host: ifconfig.me
      

      El mensaje indica que curl no puede resolver el nombre DNS de ifconfig.me en una dirección IP. El DNS, un servicio de red de Linux, requiere la apertura de un socket, por lo que el usuario guest_u de SELinux lo bloquea.

    8. Cierre la ventana de terminal actual.

      Terminamos de probar con el usuario ralph, así que cierre esa ventana de terminal.

      exit
      

Booles de SELinux

Los booleanos de SELinux permiten cambios de política específicos en tiempo de ejecución sin saber cómo escribir políticas de SELinux. Oracle Linux proporciona muchos booleanos incorporados, o los administradores familiarizados con las políticas de SELinux pueden escribir sus propios. Se recomienda a los administradores que escriban políticas como booleanos si la política implementada es opcional.

  1. Obtenga una lista de los booleanos junto con su significado.

    Vuelva al terminal donde está conectado como oracle y ejecute el siguiente comando.

    sudo semanage boolean -l
    

    Resultado de ejemplo:

    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
    ...
    
    • La salida explica qué hace cada booleano y si está activado (on) o desactivado (off).
  2. Obtenga una lista de los booleanos y su estado.

    sudo getsebool -a
    

    Resultado de ejemplo:

    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. Obtener el estado de un único booleano.

    Si se conoce el nombre booleano, transfiera el nombre como argumento para obtener solo ese estado booleano.

    sudo getsebool virt_use_nfs
    
  4. Consulte la política de SELinux para obtener un valor booleano.

    ¿Alguna vez se ha preguntado qué disparadores booleanos hay en la política de SELinux? SELinux proporciona una utilidad para consultar esas reglas.

    sesearch -b virt_use_nfs -A
    

    Resultado de ejemplo:

    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. Consulta si un booleano permite el acceso.

    ¿Qué ocurre si se permite un acceso concreto basado en un booleano condicional? Responda a la pregunta: ¿permite el ping del usuario la transición de un dominio de usuario (user_t) al dominio de ping (ping_t)?

    sesearch -s user_t -t ping_t -c process -p transition -AT
    

    Resultado de ejemplo:

    allow user_t ping_t:process transition; [ selinuxuser_ping ]:True
    
    • La transición está permitida si el booleano de SELinux user_ping está activado.
  6. Active un valor booleano.

    Supongamos que queremos permitir a KVM almacenar imágenes en un recurso compartido Samba? También hay un booleano para eso.

    1. Busque el booleano.

      sudo semanage boolean -l | grep virt | grep samba
      

      Resultado de ejemplo:

      virt_use_samba                 (off  ,  off)  Allow virt to use samba
      
    2. Cambie el valor booleano a activado.

      sudo setsebool virt_use_samba on
      

      o bien

      sudo semanage boolean -m --on virt_use_samba
      
    3. Compruebe el estado actual.

      getsebool virt_use_samba
      
    4. Asegúrese de que el cambio sobrevive a un reinicio.

      sudo setsebool -P virt_use_samba on
      
  7. Mostrar personalizaciones de políticas locales de SELinux.

    Sabiendo que hemos cambiado la configuración por defecto, podemos mostrar esas personalizaciones locales.

    sudo semanage boolean -l -C
    

    Resultado de ejemplo:

    SELinux boolean                State  Default Description
    
    virt_use_samba                 (on   ,   on)  Allow virt to use samba
    
    • La salida muestra que el valor por defecto es ahora on. El valor por defecto cambió después de hacer que el conmutador sea permanente y de escribir los valores pendientes en el archivo de política en el disco.

Contexto de archivo de SELinux

Todos los archivos y directorios se etiquetan con un contexto de SELinux al ejecutar SELinux. Examinaremos algunos comandos para gestionar el etiquetado del sistema de archivos.

Un ejemplo familiar es la creación de un nuevo directorio para la raíz de documentos de Nginx.

  1. Cree el nuevo directorio junto con tres archivos.

    sudo mkdir -p /web
    sudo touch /web/file{1,2,3}
    
  2. Compruebe el nuevo directorio y el etiquetado de archivos.

    ls -lZ /web
    

    Resultado de ejemplo:

    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
    
    • El tipo de contexto del nuevo directorio y los archivos son default_t.

    Nota: Los archivos y directorios creados recientemente heredan el tipo SELinux de sus directorios principales.

  3. Realice cambios temporales en las etiquetas.

    Como parte de la solución de problemas o las pruebas, podemos cambiar temporalmente el contexto.

    sudo chcon -R -t httpd_sys_content_t /web/
    
    ls -lZ /web
    
  4. Devolver etiquetas a la configuración por defecto.

    Vuelva a cambiar el contexto al tipo de contexto por defecto.

    sudo restorecon -R -v /web/
    

    Resultado de ejemplo:

    [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. Hacer que los cambios de etiqueta sean permanentes.

    Para hacer que los cambios sean permanentes y sobrevivir a un reinicio, utilice el comando semanage fcontext. -a agrega un registro al archivo /etc/selinux/targeted/contexts/files/file_contexts.local y -t define el tipo.

    sudo semanage fcontext -a -t httpd_sys_content_t "/web(/.*)?"
    

    Nota: Al cambiar el contexto de SELinux por semanage fcontext, se recomienda utilizar la ruta completa al archivo o directorio para evitar el etiquetado erróneo de archivos después de un nuevo etiquetado del sistema de archivos o después de ejecutar restorecon.

  6. Compruebe el contexto.

    ls -ldZ /web; ls -lZ /web
    

    Resultado de ejemplo:

    [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 el contexto no cambió, lo que esperábamos.

  7. Muestre el contexto de los archivos y directorios recién creados.

    sudo semanage fcontext -C -l
    

    Resultado de ejemplo:

    [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. Aplique los cambios al contexto.

    sudo restorecon -R -v /web
    

    Resultado de ejemplo:

    [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. Elimine el nuevo contexto de SELinux.

    sudo semanage fcontext -d "/web(/.*)?"
    
    • En este ejemplo, se transfiere la expresión regular utilizada al crear el contexto y se coloca al principio del registro de contexto en el archivo. Como es una expresión regular, envíela entre comillas.
  10. Aplique los cambios y verifique el contexto devuelto a default_t.

    sudo restorecon -R -v /web; ls -ldZ /web; ls -lZ /web
    

Consulte las páginas man para ver las utilidades mostradas. A continuación, utilice lo aprendido para mantener SELinux en modo Enforcing.

Para obtener más información

Ver otros recursos relacionados:

Más recursos de aprendizaje

Explore otros laboratorios en docs.oracle.com/learn o acceda a más contenido de aprendizaje gratuito en el canal YouTube de Oracle Learning. Además, visite education.oracle.com/learning-explorer para convertirse en Oracle Learning Explorer.

Para obtener documentación sobre el producto, visite Oracle Help Center.