Administrar la seguridad
Firewall, permisos, autenticación SSH y hardening 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.
Las rich rules permiten crear reglas específicas por IP, puerto o servicio.
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.
Las ipset permiten manejar listas grandes de IPs de forma eficiente.
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
Debemos verificar en /etc/ssh/sshd_config que estén activadas las opciones:
PubkeyAuthentication yesAuthorizedKeysFile .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.
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.
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.
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
Para nuevas rutas usamos semanage fcontext -a y aplicamos cambios con restorecon -Rv.
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.
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:
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.
Se listan con getsebool -a y se modifican con setsebool. Para hacerlo persistente usamos -P.
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_connecthttpd_enable_homedirsftp_home_dirssh_sysadm_logincontainer_manage_cgroup