Seguridad y protección del sistema (RSA-14)

La ruta del SysAdmin 15 de jul. de 2025

Este capítulo aborda la protección integral del sistema Linux a través de tres pilares clave:

  1. Seguridad de archivos
  2. Seguridad de red
  3. Auditoría y análisis

1. Seguridad de archivos

Protege el acceso local, el contenido sensible y la integridad del sistema de archivos.

Permisos y propietarios

# chmod 640 informe.txt             # Solo lectura para grupo, nada para otros
# chown luisgulo:luisgulo informe.txt       # Asignar dueño y grupo
# ls -l                             # Consultar permisos

Control avanzado con ACL (Access Control Lists)

# setfacl -m u:ana:rw informe.txt   # Permite a ana leer/escribir
# getfacl informe.txt               # Ver permisos extendidos

Cifrado de archivos y carpetas

Archivo individual con GPG:

$ gpg -c secreto.txt

Carpeta cifrada con encfs:

$ encfs ~/privada ~/privada_montada

Volumen cifrado con LUKS:

# cryptsetup luksFormat /dev/sdb1
# cryptsetup open /dev/sdb1 seguro
# mkfs.ext4 /dev/mapper/seguro
# mount /dev/mapper/seguro /mnt/seguro

Integridad y revisión de permisos peligrosos

# find / -type f -perm -o+w            # Archivos mundialmente escribibles
# find / -type f -perm -4000           # Archivos con setuid (potencialmente peligrosos)

2. Seguridad de red

Controla el acceso remoto, protege servicios expuestos y restringe comunicaciones no autorizadas.

Configuración segura de SSH

Modificar /etc/ssh/sshd_config:

PermitRootLogin no
PasswordAuthentication no
MaxAuthTries 3
AllowUsers luisgulo soporte

Aplicar cambios:

# systemctl restart sshd

Filtrado de IPs y puertos con iptables

Permitir solo una IP para SSH:

# iptables -A INPUT -p tcp --dport 22 -s 192.168.1.100 -j ACCEPT
# iptables -A INPUT -p tcp --dport 22 -j DROP

Guardar reglas y restaurar:

# iptables-save > /etc/iptables/rules.v4
# iptables-restore < /etc/iptables/rules.v4

Restricción de servicios expuestos

Ver qué puertos están abiertos:

$ ss -tuln
$ netstat -tulnp

Escanear con nmap:

$ nmap -sS localhost

Limitar procesos con firewall y systemd:

# systemctl disable cups
# systemctl mask telnet

3. Auditoría y análisis

Detecta actividades sospechosas, registra eventos críticos y genera informes de seguridad.

Revisión de logs clave

$ tail -n 100 /var/log/auth.log          # Actividad de autenticación
$ journalctl -u sshd                     # Estado del servicio SSH
$ last                                   # Accesos recientes
$ lastlog                                # Última conexión por usuario

Uso de fail2ban para bloquear IPs

# apt install fail2ban
# systemctl enable fail2ban
# systemctl start fail2ban

Ver estado:

# fail2ban-client status sshd

Auditoría con auditd, auditctl, ausearch

Instalar sistema de auditoría:

# apt install auditd
# systemctl enable auditd
# systemctl start auditd

Ejemplo: registrar cambios en /etc/passwd:

# auditctl -w /etc/passwd -p wa -k passwd_watch

Buscar eventos relacionados:

# ausearch -k passwd_watch
# aureport --file

Generar resumen diario con cron:

Script: /usr/local/bin/reporte_audit.sh

#!/bin/bash
FECHA=$(date +%F)
aureport --summary > /var/log/audit/resumen_$FECHA.log

Agendar con cron:

$ crontab -e
0 1 * * * /usr/local/bin/reporte_audit.sh

Herramientas complementarias

chkrootkit, rkhunter, lynis:

# apt install chkrootkit rkhunter lynis
# chkrootkit
# rkhunter --check
# lynis audit system

Monitorización histórica con atop o PCP:

  • atop: registros diarios por proceso
  • PCP + pmchart: métricas por CPU, RAM, disco y red con visualización

Recomendaciones generales

  • Desactiva servicios no utilizados
  • Mantén el sistema y los paquetes actualizados
  • Usa contraseñas fuertes y autenticación por clave pública
  • Realiza backups periódicos y cifrados
  • Asegura puertos abiertos y verifica con escaneos regulares
  • Revisa logs automáticamente y configura alertas por anomalías

Seguridad avanzada con SELinux

SELinux es un sistema de control de acceso obligatorio (MAC) que refuerza la seguridad del kernel. En lugar de confiar únicamente en permisos tradicionales o usuarios, define reglas precisas sobre qué recursos puede usar cada proceso, usuario o servicio. Es comúnmente usado en distribuciones como Fedora, Red Hat y CentOS.


1. Verificación y modo de operación

$ getenforce          # Verifica modo actual (Enforcing, Permissive, Disabled)
$ sestatus            # Estado general de SELinux

Modos disponibles:

  • Enforcing: bloquea acciones que violan políticas
  • Permissive: solo registra violaciones, útil para diagnóstico
  • Disabled: inactivo

Cambiar temporalmente:

# setenforce 0        # Permissive
# setenforce 1        # Enforcing

Cambiar de forma permanente en /etc/selinux/config:

SELINUX=enforcing

2. Políticas disponibles

$ sestatus | grep "Loaded policy"

Tipos:

  • targeted: aplica a procesos seleccionados (predeterminada en la mayoría)
  • strict: se aplica globalmente, mucho más restrictiva
  • MLS: control por niveles de seguridad (usado en entornos gubernamentales)

3. Contextos de seguridad

Cada archivo, proceso, puerto o recurso tiene un contexto SELinux compuesto por:

usuario:rol:tipo:nivel

Ejemplo con archivos web:

$ ls -Z /var/www/html
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 index.html

Modificación temporal del tipo:

# chcon -t httpd_sys_content_t index.html

Modificación permanente usando semanage:

# semanage fcontext -a -t httpd_sys_content_t '/web(/.*)?'
# restorecon -Rv /web

Reetiquetado de archivos según política:

# restorecon -Rv /var/www/html/

4. Análisis de errores y solución de conflictos

Consultar eventos bloqueados:

$ journalctl -xe | grep AVC
$ ausearch -m AVC

Interpretar causa:

# audit2why < /var/log/audit/audit.log

Generar política para permitir la acción bloqueada:

# audit2allow -a -M apache_excepcion
# semodule -i apache_excepcion.pp

Ejemplo: Apache no puede acceder a /datos/web

# semanage fcontext -a -t httpd_sys_content_t '/datos/web(/.*)?'
# restorecon -Rv /datos/web/

5. Control de puertos y servicios

Ver puertos y sus contextos:

$ semanage port -l | grep http

Agregar puerto alternativo para Apache:

# semanage port -a -t http_port_t -p tcp 8080

6. Etiquetado de procesos

Ver procesos con su contexto SELinux:

$ ps -eZ | grep nginx

Ejemplo de resultado:

system_u:system_r:httpd_t:s0 1234 ? 00:00:00 nginx

Significa que el proceso nginx está etiquetado como httpd_t.


7. Reglas personalizadas

Crear una política con nombre nginx_permit_rw:

# audit2allow -a -M nginx_permit_rw
# semodule -i nginx_permit_rw.pp

Listar políticas cargadas:

$ semodule -l

Eliminar una política:

# semodule -r nginx_permit_rw

8. Administración básica de SELinux

Instalar herramientas si no están presentes:

# dnf install policycoreutils policycoreutils-python-utils selinux-policy selinux-policy-targeted

Si usas Debian, SELinux requiere habilitación manual y reinicio:

# apt install selinux-basics selinux-policy-default auditd
# selinux-activate

9. Recomendaciones generales

  • Evita desactivar SELinux: usa modo Permissive para resolver problemas sin sacrificar protección
  • Aplica etiquetados correctos a carpetas web, logs, configuraciones y rutas personalizadas
  • Usa audit2why y audit2allow para diagnosticar y corregir errores sin modificar permisos innecesarios
  • Documenta tus módulos personalizados y mantén una copia de respaldo
  • En contenedores Docker, usa opciones :Z o :z al montar volúmenes si SELinux está activo

Etiquetas

Luis GuLo

🐧 SysAdmin GNU/Linux - 🐳 Docker - 🖥️ Bash Scripting - 🐪 Perl - 🐬 MySQL - 👥 Formador de TI - 👥 Formador de SysAdmin's - 💢 Ansible - ☁️ Cloud Computing - ❤️ Debian GNU/Linux