Capítulo 9.1 - Aseguramiento de Permisos
Objetivos de Aprendizaje
Al finalizar este capítulo, usted será capaz de:
- Aplicar el principio de menor privilegio
- Asegurar los permisos de archivos
- Comprender los riesgos de permisos amplios
- Auditar los permisos del sistema
- Corregir permisos incorrectos
Principio de Menor Privilegio
Concepto
Otorgar solo los permisos necesarios, nada más.
Ventajas:
- Reducción de la superficie de ataque
- Limitación de daños
- Cumplimiento de seguridad
Permisos Seguros
Archivos Normales
# Archivos de configuración
chmod 644 fichier.conf # rw-r--r--
chmod 600 fichier.conf # rw------- (privado)
# Scripts ejecutables
chmod 755 script.sh # rwxr-xr-x
chmod 700 script.sh # rwx------ (privado)
# Archivos sensibles
chmod 600 .ssh/id_rsa # Clave privada
chmod 644 .ssh/id_rsa.pub # Clave pública
chmod 700 .ssh/ # Directorio SSH
Directorios
# Directorios normales
chmod 755 repertoire/ # rwxr-xr-x
# Directorios privados
chmod 700 repertoire/ # rwx------
# Directorios compartidos
chmod 775 shared/ # rwxrwxr-x
chmod 1777 /tmp # Sticky bit
Permisos Peligrosos
A Evitar
# 777 - Todos los permisos (¡PELIGROSO!)
chmod 777 fichier # ¡EVITAR!
# SUID/SGID innecesarios
chmod u+s script.sh # Verificar necesidad
# Directorios world-writable
chmod 777 repertoire/ # ¡EVITAR!
Detectar
# Archivos con permisos amplios
find /home -type f -perm -o+w
find / -type f -perm 777 2>/dev/null
# Directorios world-writable
find / -type d -perm -o+w ! -path "/proc/*" 2>/dev/null
# Archivos SUID/SGID
find / -type f -perm /4000 2>/dev/null # SUID
find / -type f -perm /2000 2>/dev/null # SGID
Aseguramiento SSH
Permisos Correctos
# Directorio .ssh
chmod 700 ~/.ssh
# Claves privadas
chmod 600 ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_ed25519
# Claves públicas
chmod 644 ~/.ssh/id_rsa.pub
chmod 644 ~/.ssh/authorized_keys
# Config
chmod 600 ~/.ssh/config
Verificación
# Script de verificación
#!/bin/bash
SSH_DIR="$HOME/.ssh"
if [ -d "$SSH_DIR" ]; then
# Verificar permisos del directorio
PERMS=$(stat -c "%a" "$SSH_DIR")
if [ "$PERMS" != "700" ]; then
echo "ATENCIÓN: .ssh debería ser 700, actualmente $PERMS"
fi
# Verificar claves privadas
for key in "$SSH_DIR"/id_*; do
if [ -f "$key" ] && [[ "$key" != *.pub ]]; then
PERMS=$(stat -c "%a" "$key")
if [ "$PERMS" != "600" ]; then
echo "ATENCIÓN: $key debería ser 600, actualmente $PERMS"
fi
fi
done
fi
Aseguramiento Cron
Permisos Crontab
# Crontab de usuario
chmod 600 ~/.crontab # Si archivo externo
# Verificar crontab del sistema
ls -l /etc/crontab
ls -l /etc/cron.d/*
Entorno Cron
# Crontab seguro
PATH=/usr/bin:/bin
SHELL=/bin/bash
MAILTO=admin@example.com
# Usar rutas absolutas
0 2 * * * /usr/local/bin/backup.sh
# Redirigir salida
0 2 * * * /usr/local/bin/script.sh > /var/log/script.log 2>&1
# No usar variables no definidas
Scripts Cron Seguros
#!/bin/bash
# Script cron seguro
# Opciones de seguridad
set -euo pipefail
# Rutas absolutas
SCRIPT_DIR="/usr/local/bin"
LOG_FILE="/var/log/mon-script.log"
# Función de logging
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" >> "$LOG_FILE"
}
# Verificaciones
if [ ! -f "$SCRIPT_DIR/config" ]; then
log "ERROR: Archivo de configuración faltante"
exit 1
fi
# Procesamiento...
log "Inicio de procesamiento"
# ...
log "Fin de procesamiento"
Auditoría de Permisos
Script de Auditoría
#!/bin/bash
# Auditoría de permisos
echo "=== Archivos world-writable ==="
find /home -type f -perm -o+w 2>/dev/null
echo "=== Directorios world-writable ==="
find /home -type d -perm -o+w 2>/dev/null
echo "=== Archivos SUID ==="
find /home -type f -perm /4000 2>/dev/null
echo "=== Archivos SGID ==="
find /home -type f -perm /2000 2>/dev/null
echo "=== Permisos SSH ==="
if [ -d ~/.ssh ]; then
ls -la ~/.ssh
fi
Corrección Automática
#!/bin/bash
# Corregir permisos SSH
SSH_DIR="$HOME/.ssh"
if [ -d "$SSH_DIR" ]; then
chmod 700 "$SSH_DIR"
# Claves privadas
find "$SSH_DIR" -name "id_*" ! -name "*.pub" -exec chmod 600 {} \;
# Claves públicas
find "$SSH_DIR" -name "*.pub" -exec chmod 644 {} \;
# authorized_keys
[ -f "$SSH_DIR/authorized_keys" ] && chmod 600 "$SSH_DIR/authorized_keys"
# config
[ -f "$SSH_DIR/config" ] && chmod 600 "$SSH_DIR/config"
echo "Permisos SSH corregidos"
fi
Buenas Prácticas
Archivos
- 644 para archivos normales
- 600 para archivos sensibles
- 755 para scripts ejecutables
- 700 para scripts privados
Directorios
- 755 para directorios normales
- 700 para directorios privados
- 775 para directorios compartidos (con grupo)
- 1777 para /tmp (sticky bit)
Verificaciones
- Auditar regularmente
- Automatizar con scripts
- Documentar excepciones
- Revisar después de cambios
Resumen
En este capítulo, usted ha aprendido:
Menor privilegio: Permisos mínimos necesarios
Aseguramiento: Permisos apropiados según el tipo
Detección: Encontrar permisos peligrosos
SSH: Permisos correctos para claves y configuración
Cron: Aseguramiento de scripts y entorno
Auditoría: Scripts para verificar y corregir
Próximos Pasos
Capítulo 9.2: Configuración de sudo
Capítulo 9.3: Firewall
Capítulo creado el: Diciembre 2024