Nota:
- Este tutorial está disponible en un entorno de laboratorio gratuito proporcionado por Oracle.
- Utiliza valores de ejemplo para las credenciales, el arrendamiento y los compartimentos de Oracle Cloud Infrastructure. Al finalizar la práctica, sustituya estos valores por valores específicos de su entorno en la nube.
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:
- Comprobar el modo y el estado de SELinux
- Descripción de las etiquetas de seguridad de SELinux
- Trabajo con servicios de red de SELinux
- Uso de usuarios de SELinux
- Cambiar los booleanos de SELinux
- Evaluar contextos de archivos de SELinux
Requisitos
- Un sistema con Oracle Linux 8 instalado con la siguiente configuración:
- un usuario no raíz con permisos
sudo
- un usuario no raíz con permisos
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.
-
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>
-
Cree un usuario y defina una contraseña.
sudo useradd -u 8000 ralph echo "ralph:oracle" | sudo chpasswd
-
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
-
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
.
-
Confirme comprobando el modo SELinux.
Se debe definir en
Enforcing
.getenforce
-
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.
-
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). - usuario:
-
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
ysshd
. - El comando
-
Obtenga una lista de tipos de SELinux específicos.
grep
limitará la salida solo a aquellos tipos que contengan la palabrassh
.seinfo -t | grep ssh
-
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 tiposshd_t
. Por lo tanto, en la política dirigida, se espera una regla para el atributo SELinuxsshd_t
que indique que los objetos consshd_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 entressh_home_t
yssh_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
-
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.
-
Determine qué paquete proporciona la utilidad.
sudo dnf whatprovides semanage
Los resultados muestran que
/usr/sbin/semanage
forma parte del paquetepolicycoreutils-python-utils
. -
Instale el paquete y las dependencias.
sudo dnf install -y policycoreutils-python-utils
-
Compruebe los puertos que SELinux permite para
sshd
.sudo semanage port -l | grep ssh
Resultado de ejemplo:
ssh_port_t tcp 22
-
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
.
- La opción
-
Compruebe los puertos que SELinux permite ahora.
sudo semanage port -l | grep ssh
Resultado de ejemplo:
ssh_port_t tcp 2222, 22
-
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 tipossh_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.
-
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 usuariounconfined_u
.
- Observe que nuestro usuario
-
Obtenga una lista de los usuarios de SELinux.
seinfo -u
-
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.
-
Cree la nueva asignación en
guest_u
.sudo semanage login -a -s guest_u ralph
-
Verifique la asignación.
sudo semanage login -l
-
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 mediantesudo
osu
.Abra un terminal nuevo y conéctese mediante ssh al sistema ol8-server como usuario ralph.
ssh ralph@<ip_address_of_ol8-server>
-
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
-
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. -
Pruebe la conectividad de red con
ping
.ping localhost
Resultado de ejemplo:
ping: socket: Permission denied
-
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 deifconfig.me
en una dirección IP. El DNS, un servicio de red de Linux, requiere la apertura de un socket, por lo que el usuarioguest_u
de SELinux lo bloquea. -
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.
-
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
).
- La salida explica qué hace cada booleano y si está activado (
-
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 ...
-
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
-
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 ...
-
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.
- La transición está permitida si el booleano de SELinux
-
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.
-
Busque el booleano.
sudo semanage boolean -l | grep virt | grep samba
Resultado de ejemplo:
virt_use_samba (off , off) Allow virt to use samba
-
Cambie el valor booleano a activado.
sudo setsebool virt_use_samba on
o bien
sudo semanage boolean -m --on virt_use_samba
-
Compruebe el estado actual.
getsebool virt_use_samba
-
Asegúrese de que el cambio sobrevive a un reinicio.
sudo setsebool -P virt_use_samba on
-
-
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.
- La salida muestra que el valor por defecto es ahora
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.
-
Cree el nuevo directorio junto con tres archivos.
sudo mkdir -p /web sudo touch /web/file{1,2,3}
-
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.
- El tipo de contexto del nuevo directorio y los archivos son
-
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
-
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
-
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 ejecutarrestorecon
. -
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.
-
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
-
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
-
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.
-
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.