Configuración y activación de SELinux

Í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

Lab 8: Samba

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

comments powered by Disqus

Relacionados

Cómo simular un servidor web en GNS3

Existen varias formas de crear un servidor web en un escenario de GNS3. En este post se optará por añadir una máquina Linux con Debian 11 en la que se instalará el servidor Nginx para que pueda actuar a forma de servidor web en el escenario.

Leer

Uso de cloud-init con libvirt

OpenStack es una herramienta de infraestructura como servicio que puede gestionarse desde la línea de comandos a través de su cliente.

Leer

Instalación de minikube

Minikube es una distribución minimalista de Kubernetes ideal para aprender a usar este orquestador, que instala una distribución de k8s en un único nodo, en este caso, en una máquina virtual usando libvirt y KVM. Para instalar minikube, en primer lugar, se descarga el binario desde el repositorio de Google en el que está publicado.

Leer