Configuración y activación de SELinux
- Francisco Javier Huete
- Administracion sistemas
- March 3, 2025
Índice
En esta entrada se configura el sistema de seguridad avanzada de SELinux en un sistema operativo Rocky Linux 9 para permitir el uso de diferentes protocolos de comunicación en red.
Instalación y configuración de los servicios
Instalación y configuración de sshfs
Usando el escenario con el que ya se ha trabajado en otros posts, en este caso, el servidor sshfs será la máquina zoro
(Rocky Linux 9) y el cliente es luffy
(Debian 12). Para poder montar un directorio del servidor en el cliente, primero, se debe instalar el paquete sshfs
en el cliente.
sudo apt update
sudo apt install sshfs
A continuación, se crea en el cliente un directorio que será el punto de montaje del directorio compartido por el servidor.
mkdir zoro
En el servidor se crea el directorio que se va a compartir con el cliente y se le da su propiedad al usuario.
sudo mkdir /srv/compartido
sudo chown -R usuario: /srv/compartido/
Para montar el directorio compartido en el cliente de forma no persistente, se usa el comando sshfs
.
sshfs zoro:/srv/compartido zoro/
Así, el directorio compartido por el servidor se monta en el punto de montaje indicado en el cliente.
usuario@luffy:~$ df -Th
Filesystem Type Size Used Avail Use% Mounted on
...
zoro:/srv/compartido fuse.sshfs 14G 1.7G 13G 12% /home/usuario/zoro
Y, por tanto, el cliente puede tener acceso al contenido del directorio compartido en el servidor.
usuario@luffy:~$ ls -l zoro/
total 4
-rw-r--r-- 1 usuario usuario 33 Feb 1 11:17 fichero.txt
Con el comando mount
podemos comprobar las opciones con las que se ha montado este sistema de archivos.
zoro:/srv/compartido on /home/usuario/zoro type fuse.sshfs (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000)
Para hacer este montaje persistente se puede añadir la siguiente entrada al fichero /etc/fstab del cliente:
sshfs#usuario@zoro:/srv/compartido /home/usuario/zoro fuse defaults,allow_other,IdentityFile=/home/usuario/.ssh/id_rsa 0 0
Note
Aunque al montar el sistema de ficheros remoto con el comando sshfs
se puede usar la clave privada herredada al acceder al cliente con ssh -A
, cuando el montaje se especifica en el fichero /etc/fstab de forma persistente es necesario que la clave privada con la que se conectan el cliente y el servidor esté presente en el cliente. Además, este fichero debe contar con permisos restrictivos como 600
para evitar que otros usuarios diferentes al propietario puedan acceder al fichero. Por último, el fichero se debe indicar en la línea de montaje del fichero fstab como se muestra en el ejemplo.
Instalación y configuración de samba
Para configurar un servidor samba en el servidor Rocky Linux 9 es necesario instalar el paquete samba
.
sudo dnf update
sudo dnf install samba
En el servidor, se crea el directorio que se compartirá a través de samba y se la da su propiedad al usuario sin privilegios usuario
.
sudo mkdir /srv/compartido
sudo chown usuario: /srv/compartido/
En el fichero /etc/samba/smb.conf se puede configurar el directorio compartido desde el servidor.
[compartido]
path = /srv/compartido
browsable = yes
writable = yes
Por último, para activar y habilitar el servicio samba se usa systemd.
sudo systemctl start smb nmb
sudo systemctl enable smb nmb
Para poder compartir este sistema de ficheros, el servicio samba debe contar con algún usuario. Se puede crear un usuario específico para el servicio samba o, como en este caso, reutilizar usuarios del sistema operativo. Con el comando smbpasswd
se crea una contraseña de samba para el usuario y se añade a la base de datos del servicio.
sudo smbpasswd -a usuario
New SMB password:
Retype new SMB password:
Added user usuario.
Por último, para aplicar los cambios, se reinicia el servicio.
sudo systemctl restart smb nmb
En el lado del cliente, es necesario instalar el paquete cifs-utils
para poder conectarse al servidor samba.
sudo apt update
sudo apt install cifs-utils samba-common
En el cliente también debe crearse un directorio que sirva de punto de montaje al sistema de ficheros compartido.
mkdir zoro
Para montar el sistema de ficheros remoto compartido por el servidor samba en el cliente se usa el siguiente comando:
sudo mount -t cifs //zoro/compartido zoro -o user=usuario
Configuración de SELinux para permitir el acceso remoto al servidor
Al montar el directorio compartido desde el servidor en el cliente aunque el directorio se monta, no se puede acceder a su contenido.
En el servidor, se puede verificar el log de SELinux para comprobar que este problema se debe a las limitaciones del sistema avanzado de seguridad.
sudo sealert -a /var/log/audit/audit.log
La herramienta sealert
propone tras este análisis varias acciones para solucionar este problema. La primera de ellas pasa por incluir el directorio compartido en el contexto de samba.
semanage fcontext -a -t samba_share_t '/srv/compartido/'
restorecon -v '/srv/compartido/'
Además, hay que poner a 1
los booleanos necesarios para que el servidor samba pueda exportar servidores tanto en modo de lectura como de lectura/escritura.
setsebool -P samba_export_all_ro 1
setsebool -P samba_export_all_rw 1
Por último, la herramienta sealert
recomiand también instalar los módulos de SELinux necesarios para permitir la conexión desde el cliente samba al servidor.
ausearch -c 'smbd[172.16.0.1' --raw] | audit2allow -M my-smbd1721601
semodule -X 300 -i my-smbd1721601.pp
ausearch -c '(l-upload)' --raw | audit2allow -M my-lupload
semodule -X 300 -i my-lupload.pp
De esta manera, el cliente monta en el directorio indicado el sistema de ficheros compartido por el servidor.
usuario@luffy:~$ df -Th
Filesystem Type Size Used Avail Use% Mounted on
...
//zoro/compartido cifs 8.9G 1.3G 7.7G 14% /home/debian/zoro
Y puede acceder al contenido de este sistema de ficheros.
usuario@luffy:~$ ls -l zoro/
total 4
-rw-r--r-- 1 usuario usuario 33 Feb 1 11:17 fichero.txt
Para hacer este montaje persistente usando el fichero /etc/fstab se debe añadir la siguiente línea:
//zoro/compartido /home/debian/zoro cifs rw,relatime,vers=3.1.1,cache=strict,username=usuario,uid=0,noforceuid,gid=0,noforcegid,addr=10.0.0.45,file_mode=0755,dir_mode=0755,soft,nounix,serverino,mapposix,rsize=4194304,wsize=4194304,bsize=1048576,echo_interval=60,actimeo=1,closetimeo=1,user=usuario,password=usuario
Instalación y configuración de nfs
Por defecto, el paquete que instala el servidor NFS está instalado en Rocky Linux 9. Si no es el caso, el paquete con el que se puede instalar este servicio en esta distribución es nfs-utils
.
Para compartir un directorio del servidor usando NFS, se crea el directorio.
sudo mkdir -p /srv/compartido
Para evitar problemas de permisos, hay que darle la propiedad de este directorio al usuario sin privilegios del sistema.
sudo chown -R usuario: /srv/compartido
Los directorios que el servidor comparte con los clientes se configuran en el fichero /etc/exports. El formato en este fichero incluye, en primer lugar, el directorio que se comparte, después la IP del cliente y, entre paréntesis, las opciones con las que se comparte.
/srv/nfs 172.22.201.28(rw,sync,no_subtree_check)
En el cliente, se instala el paquete necesario para montar directorios compartidos por NFS.
sudo apt install nfs-common
Y se monta el directorio compartido.
sudo mount zoro:/srv/compartido zoro/
De esta manera, el cliente puede montar el directorio compartido por el servidor NFS en el punto de montaje indicado.
usuario@luffy:~$ df -Th
Filesystem Type Size Used Avail Use% Mounted on
...
zoro:/srv/compartido nfs4 14G 1.7G 13G 13% /home/usuario/zoro
Y puede acceder al contenido de este sistema de ficheros.
usuario@luffy:~$ ls -l zoro/
total 4
-rw-r--r-- 1 usuario usuario 33 Feb 1 11:17 fichero.txt
Para hacer este montaje persistente se puede añadir la siguiente entrada al fichero /etc/fstab del cliente:
zoro:/srv/compartido /home/usuario/zoro nfs defaults 0 0
Habilitar el inicio de sesión como root en un nuevo puerto
Para permitir el acceso por SSH del root a un servidor Rocky Linux 9, hay que darle el valor yes
al parámetro PermitRootLogin
en el fichero de configuración /etc/ssh/sshd_config. En este mismo fichero, se puede configurar un puerto de escucha para el servidor SSH diferente al habitual (22). Por ejemplo, se puede usar el puerto 2222.
Port 2222
PermitRootLogin yes
Además, como esta máquina es una máquina virtual de Open Stack cuenta con una configuración por defecto generada a través de cloud-config. Esta configuración impide la conexión por SSH usando contraseña y para modificarla hay que editar el fichero /etc/ssh/sshd_config.d/50-cloud-init.conf.
La única configuración que se incluye en este ficher es el parámetro para evitar la autenticación por contraseña durante la conexión SSH para forzar así la autenticación usando un par de claves. Para permitir que el usuario root se pueda identificar con su contraseña a la hora de acceder por SSH al servidor Rocky Linux (una práctica que no es segura ni recomendada en un entorno de producción real) se debe editar este fichero y modificar el valor del único parámetro que incluye.
PasswordAuthentication no
Si se reinicia el servicio tras modificar el puerto sin habilitarlo en el sistema de seguridad SELinux se produce el siguiente error:
error: Bind to port 2222 on 0.0.0.0 failed: Permission denied.
error: Bind to port 2222 on :: failed: Permission denied.
Configuración de SELinux para permitir el acceso por SSH en el nuevo puerto
Para permitir la conexión por SSH a través del nuevo puerto, se debe configurar como un puerto para este tipo de conexiones en el sistema de seguridad de SELinux. Esto se puede hacer usando la herramienta semanage
.
sudo semanage port -a -t ssh_port_t -p tcp 2222
Tras permitir el uso de este puerto para las conexiones SSH se puede reiniciar el servicio.
sudo systemctl restart sshd
Sin embargo, a pesar de haber habilitado el puerto 2222 para las conexiones SSH con semanage
, el análisis de los logs de SELinux con la herramienta sealert
devuelve una alerta.
sudo sealert -a /var/log/audit/audit.log
100% done
found 1 alerts in /var/log/audit/audit.log
--------------------------------------------------------------------------------
SELinux is preventing /usr/sbin/sshd from name_bind access on the tcp_socket port 2222.
En esta alerta se advierte de que la configuración de SELinux evita que el servicio sshd pueda utilizar el puerto 2222 para la escucha de conexiones. Esta herramienta cuenta, además, con diferentes plugins que ofrecen soluciones alternativas a esta alerta. La primera de estas soluciones, aportada por el plugin bind_ports
propone habilitar el puerto 2222 para el servicio SSH tal y como ya se ha hecho previamente:
***** Plugin bind_ports (92.2 confidence) suggests ************************
If you want to allow /usr/sbin/sshd to bind to network port 2222
Then you need to modify the port type.
Do
# semanage port -a -t PORT_TYPE -p tcp 2222
where PORT_TYPE is one of the following: ssh_port_t, vnc_port_t, xserver_port_t.
Otra solución viene propuesta por el plugin catchall
, que facilita la posibilidad de generar un módulo de políticas de seguridad de SELinux local que permite el acceso por SSH a través del puerto 2222.
***** Plugin catchall (1.41 confidence) suggests **************************
If you believe that sshd should be allowed name_bind access on the port 2222 tcp_socket by default.
Then you should report this as a bug.
You can generate a local policy module to allow this access.
Do
allow this access for now by executing:
# ausearch -c 'sshd' --raw | audit2allow -M my-sshd
# semodule -X 300 -i my-sshd.pp
Así, en primer lugar se puede generar un nuevo módulo que permita esta regla en SELinux.
sudo ausearch -c 'sshd' --raw | audit2allow -M my-sshd
******************** IMPORTANT ***********************
To make this policy package active, execute:
semodule -i my-sshd.pp
El segundo comando propuesto por el script tras analizar los logs de SELinux instala el módulo creado. Este comando cuenta con dos opciones, la primera, -X
, indica un número de prioridad entre el 1 y el 999 y la segunda, -i
, indica el módulo que se instala. Esta segunda opción debe aparecer obligatoriamente para la instalación de un módulo. Asignarle una prioridad es opcional.
sudo semodule -i my-sshd.pp
Tras instalar el módulo, la herramienta de análisis de los logs de SELinux no devuelve ninguna alerta.
sudo sealert -a /var/log/audit/audit.log
100% done
found 0 alerts in /var/log/audit/audit.log
Tras establecer esta nueva configuración en SELinux, el servidor permite conexiones SSH usando el puerto 2222.
usuario@luffy:~$ ssh zoro -p 2222
Last login: Thu Feb 6 12:39:44 2025 from 172.16.0.1
[usuario@zoro ~]$ pwd
/home/usuario
[usuario@zoro ~]$ echo $USER
usuario
[usuario@zoro ~]$
Además, esta conexión se puede hacer como el usuario privilegiado root.
usuario@luffy:~$ sudo su
root@luffy:/home/usuario# ssh zoro -p 2222
root@zoro's password:
Activate the web console with: systemctl enable --now cockpit.socket
Last login: Fri Feb 7 07:47:03 2025 from 172.16.0.1
[root@zoro ~]# pwd
/root
[root@zoro ~]# echo $USER
root
[root@zoro ~]#
Fuentes
How to convert sshfs command to fstab entry?
Connection reset by peer using sshfs
How to Set Up an NFS Mount on Rocky Linux 8
Install and Configure NFS Server on Rocky Linux 8
Linux NFS Mount Entry in fstab (/etc/fstab) with Example
How to Enable Root Login Via SSH on Rocky Linux 9
Rocky linux 9.1 ssh root login
How To Change SSH port on Rocky Linux
Cambiar el puerto de SSH en Derivados Red Hat Enterprise Linux 8