Seguridad y protección del sistema (RSA-14)
Este capítulo aborda la protección integral del sistema Linux a través de tres pilares clave:
- Seguridad de archivos
- Seguridad de red
- 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íticasPermissive
: solo registra violaciones, útil para diagnósticoDisabled
: 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 restrictivaMLS
: 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
yaudit2allow
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