Tema 10 / 11
RHCSA Objetivo

Administrar la seguridad

Firewall, permisos, autenticación SSH y hardening con SELinux

🎬
VER VIDEO YOUTUBE - CLASE 10 Firewall, SSH y seguridad avanzada con SELinux

1. Configurar el firewall con firewalld

Como ya sabemos, firewalld permite gestionar reglas dinámicas mediante zonas, servicios y reglas avanzadas almacenadas en /etc/firewalld/zones/.

Podemos crear aplicaciones personalizadas copiando servicios desde /usr/lib/firewalld/services/ hacia /etc/firewalld/services/ y aplicando contextos SELinux con restorecon.

app perso de firewall

Las rich rules permiten crear reglas específicas por IP, puerto o servicio.

richrules de firewall

NAT permite enrutar tráfico mediante:

  • Masquerade → acceso a internet desde redes internas.
  • Port Forwarding → redirección de puertos.
  • Rich Rule NAT → redirección específica por IP/red.
nat de firewall

Las ipset permiten manejar listas grandes de IPs de forma eficiente.

ipset de firewall

2. Administrar permisos predeterminados (umask)

umask define los permisos que se eliminan al crear archivos o directorios.

El valor máximo es 666 para archivos y 777 para directorios (ya que x no se aplica por seguridad).Es decir, la regla o la suma es Permisos totales - UMASK = Permisos reales. Si el umask es 022, el archivo se crea con 644 (666-022) y el directorio con 755 (777-022).

Puede aplicarse temporalmente con umask o permanentemente en /etc/profile para global o ~/.bashrc para un usuario en especifico.

3. Autenticación SSH mediante claves

Permite acceso seguro sin contraseña usando criptografía pública/privada. La clave pública se copia al servidor y la privada nunca se comparte.

Lo que tenemos que tener más claro es que la clave publica es la que compartiremos con el servidor pero la privada NUNCA la compartiremos. Practicad el hecho de que ssh-copy-id podría fallar, el examen está hecho para ponernos trampas en todo momento

Autenticación SSH

Debemos verificar en /etc/ssh/sshd_config que estén activadas las opciones:

  • PubkeyAuthentication yes
  • AuthorizedKeysFile .ssh/authorized_keys

Tras cambios reiniciamos el servicio con systemctl restart sshd.

4. Modos de SELinux

SELinux puede funcionar en tres estados:

  • Enforcing → bloquea accesos no permitidos.
  • Permissive → solo registra eventos.
  • Disabled → desactivado.

Se consulta con getenforce y se cambia temporalmente con setenforce. Para hacerlo permanente se modifica /etc/selinux/config.

Modos SELinux

5. Contextos SELinux

SELinux etiqueta recursos con un contexto (usuario:rol:tipo:nivel). El campo más importante es el tipo.

  • ls -Z → contexto de archivos.
  • ps -eZ → contexto de procesos.

No hay que memorizarlos los contextos.semanage fcontext -l | grep servicio lista las etiquetas recomendadas, matchpathcon /ruta/archivo indica la que debería tener y ls -Z la que tiene realmente.

Contextos SELinux

Para investigar fallos de SELinux, usa ausearch (rastreador) y audit2why (traductor). Lo más común es combinarlos con ausearch -m avc -ts recent | audit2why, ya que la mayoría de bloqueos se registran bajo el tipo avc.

AUSEARCH -AUDIT- SELinux

6. Restaurar contextos predeterminados

restorecon restaura etiquetas correctas cuando archivos se mueven o cambian manualmente.

El ejemplo más sencillo es el servicio httpd. Este servicio se encuentra en /var/www/html/ y necesita un contexto para funcionar. Si importamos un archivo desde otra ubicación y no nos aseguramos de que tenga un contexto correcto, no funcionará. Tal y como hemos visto en la imagen de ausearch -m avc -ts recent | audit2why

Uso de restorecon

Para nuevas rutas usamos semanage fcontext -a y aplicamos cambios con restorecon -Rv.

Uso de restorecon

De la misma manera que agregamos con -a, podemos eliminar una regla que hayamos creado exactamente igual pero con -d o modificarla con -m. Recordad lanzar siempre el comando restorecon -Rv para aplicar esos cambios. En el video menciono chcon pero este haría un cambio temporal y se perdería al reiniciar, por lo que mejor usar semanage fcontext.

7. Administrar etiquetas de puerto SELinux

Si un servicio (ej. Apache) debe escuchar en un puerto no estándar, debemos etiquetar ese puerto en SELinux. Podemos comprobar el contexto de los puertos de la misma manera que la de los servicios : semanage port -l | grep servicio.

Puertos SELinux

Si un servicio necesita usar un puerto diferente, debemos añadirlo con semanage port -a X -p tcp PUERTO. Por ejemplo, permitir que httpd use el puerto 8080:

Puertos SELinux change

Si el puerto ya existe y queremos modificarlo usamos -m, y para eliminarlo usamos -d.

8. Booleanos SELinux

Los booleanos son interruptores (on/off) que permiten cambiar reglas de SELinux en tiempo real sin modificar la política completa. Tenemos que tener en cuenta que si un servicio funciona pero SELinux lo bloquea lo primero que revisaremos será los booleanos

Con el comando getsebool -a podemos listar todos los booleanos disponibles y podemos filtrar con grep servicio. Tambien podemos filtrar con semanage boolean -l | grep X.

Booleanos SELinux

Se listan con getsebool -a y se modifican con setsebool. Para hacerlo persistente usamos -P.

Booleanos SELinux

No es necesario memorizar booleanos concretos, sino saber identificarlos con getsebool o getsebool -a y activarlos correctamente usando setsebool o setsebool -P cuando SELinux bloquea un servicio.

Ejemplos comunes:

  • httpd_can_network_connect
  • httpd_enable_homedirs
  • ftp_home_dir
  • ssh_sysadm_login
  • container_manage_cgroup