Logo

Mi Blog con Emacs y Esteroides

Emacs, IA y Linux: Poder y Simplicidad en tu Flujo de Trabajo

mybloggingnotes@gmail.com


26/05/2025

Scripts de Ciberseguridad en Bash Linux

1. Introducción

Esta guía presenta los 3 scripts de ciberseguridad más útiles para administradores de sistemas Linux, diseñados para automatizar tareas críticas de seguridad, monitoreo y análisis de amenazas.

1.1. Requisitos Previos

  • Sistema Linux (Ubuntu, CentOS, RHEL, Debian)
  • Bash 4.0 o superior
  • Permisos de root para algunas funcionalidades
  • Herramientas básicas: grep, awk, sed, netstat, ss

2. Script 1: Monitor de Seguridad del Sistema

2.1. Descripción

Script completo para monitorear actividades sospechosas en el sistema, detectar intentos de intrusión y generar alertas automáticas.

2.2. Tags: monitoring intrusion-detection system-security

2.3. Código del Script

#!/bin/bash
# security_monitor.sh - Monitor de Seguridad del Sistema
# Autor: Admin de Seguridad
# Versión: 2.1
# Descripción: Monitorea actividades sospechosas y genera alertas

# Configuración
LOG_FILE="/var/log/security_monitor.log"
ALERT_EMAIL="admin@empresa.com"
MAX_FAILED_LOGINS=5
SUSPICIOUS_PROCESSES=("nc" "nmap" "metasploit" "sqlmap")
ALERT_THRESHOLD=10

# Función de logging
log_event() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE"
}

# Función para enviar alertas
send_alert() {
    local message="$1"
    log_event "ALERT: $message"
    echo "$message" | mail -s "Alerta de Seguridad - $(hostname)" "$ALERT_EMAIL" 2>/dev/null
}

# Verificar intentos de login fallidos
check_failed_logins() {
    local failed_count
    failed_count=$(grep "Failed password" /var/log/auth.log 2>/dev/null | 
                   grep "$(date '+%b %d')" | wc -l)

    if [ "$failed_count" -gt "$MAX_FAILED_LOGINS" ]; then
        send_alert "CRÍTICO: $failed_count intentos de login fallidos detectados hoy"

        # Obtener IPs con más intentos
        grep "Failed password" /var/log/auth.log 2>/dev/null | 
        grep "$(date '+%b %d')" | 
        awk '{print $(NF-3)}' | sort | uniq -c | sort -nr | head -5 >> "$LOG_FILE"
    fi
}

# Verificar conexiones de red sospechosas
check_network_connections() {
    local suspicious_connections
    suspicious_connections=$(ss -tuln | grep -E ':22|:80|:443|:3389|:5432|:3306' | 
                           grep -v '127.0.0.1\|::1' | wc -l)

    if [ "$suspicious_connections" -gt "$ALERT_THRESHOLD" ]; then
        send_alert "ADVERTENCIA: $suspicious_connections conexiones externas activas"
        ss -tuln | grep -v '127.0.0.1\|::1' >> "$LOG_FILE"
    fi
}

# Verificar procesos sospechosos
check_suspicious_processes() {
    for process in "${SUSPICIOUS_PROCESSES[@]}"; do
        if pgrep -f "$process" > /dev/null; then
            send_alert "CRÍTICO: Proceso sospechoso detectado: $process"
            ps aux | grep "$process" | grep -v grep >> "$LOG_FILE"
        fi
    done
}

# Verificar cambios en archivos críticos
check_system_files() {
    local critical_files=("/etc/passwd" "/etc/shadow" "/etc/sudoers" "/etc/hosts")

    for file in "${critical_files[@]}"; do
        if [ -f "$file" ]; then
            local current_hash
            current_hash=$(md5sum "$file" | cut -d' ' -f1)
            local stored_hash_file="/tmp/$(basename "$file").hash"

            if [ -f "$stored_hash_file" ]; then
                local stored_hash
                stored_hash=$(cat "$stored_hash_file")
                if [ "$current_hash" != "$stored_hash" ]; then
                    send_alert "CRÍTICO: Archivo crítico modificado: $file"
                fi
            fi
            echo "$current_hash" > "$stored_hash_file"
        fi
    done
}

# Verificar uso de recursos
check_resource_usage() {
    local cpu_usage
    local memory_usage
    local disk_usage

    cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1 | cut -d',' -f1)
    memory_usage=$(free | grep Mem | awk '{printf "%.1f", $3/$2 * 100.0}')
    disk_usage=$(df / | tail -1 | awk '{print $5}' | cut -d'%' -f1)

    if (( $(echo "$cpu_usage > 90" | bc -l) )); then
        send_alert "ADVERTENCIA: Uso de CPU elevado: ${cpu_usage}%"
    fi

    if (( $(echo "$memory_usage > 90" | bc -l) )); then
        send_alert "ADVERTENCIA: Uso de memoria elevado: ${memory_usage}%"
    fi

    if [ "$disk_usage" -gt 90 ]; then
        send_alert "ADVERTENCIA: Uso de disco elevado: ${disk_usage}%"
    fi
}

# Función principal
main() {
    log_event "Iniciando monitoreo de seguridad"

    check_failed_logins
    check_network_connections
    check_suspicious_processes
    check_system_files
    check_resource_usage

    log_event "Monitoreo completado"
}

# Verificar si se ejecuta como root
if [ "$EUID" -ne 0 ]; then
    echo "Este script debe ejecutarse como root"
    exit 1
fi

# Crear directorio de logs si no existe
mkdir -p "$(dirname "$LOG_FILE")"

# Ejecutar función principal
main "$@"

2.4. Instalación y Configuración

2.4.1. Paso 1: Preparar el script

# Crear el archivo del script
sudo nano /usr/local/bin/security_monitor.sh

# Copiar el código anterior y guardar

# Hacer ejecutable
sudo chmod +x /usr/local/bin/security_monitor.sh

2.4.2. Paso 2: Configurar cron para ejecución automática

# Editar crontab
sudo crontab -e

# Agregar línea para ejecutar cada 15 minutos
*/15 * * * * /usr/local/bin/security_monitor.sh

2.4.3. Paso 3: Configurar alertas por email (opcional)

# Instalar mailutils
sudo apt-get install mailutils

# Configurar postfix o sendmail según necesidades

2.5. Ejemplos de Uso

2.5.1. Ejecución manual

sudo /usr/local/bin/security_monitor.sh

2.5.2. Revisar logs

sudo tail -f /var/log/security_monitor.log

3. Script 2: Analizador de Logs de Seguridad

3.1. Descripción

Script avanzado para analizar logs del sistema en busca de patrones de ataque, generar reportes y identificar amenazas.

3.2. Tags: log-analysis forensics threat-detection

3.3. Código del Script

#!/bin/bash
# log_analyzer.sh - Analizador de Logs de Seguridad
# Autor: Security Team
# Versión: 1.8
# Descripción: Analiza logs del sistema para detectar amenazas

# Configuración
REPORT_DIR="/var/log/security_reports"
DATE_PATTERN=$(date '+%Y-%m-%d')
LOG_FILES=("/var/log/auth.log" "/var/log/syslog" "/var/log/apache2/access.log" "/var/log/nginx/access.log")

# Patrones de ataque conocidos
declare -A ATTACK_PATTERNS=(
    ["SQL_INJECTION"]="union.*select|drop.*table|exec.*sp_|script.*alert"
    ["XSS"]="<script|javascript:|onload=|onerror="
    ["PATH_TRAVERSAL"]="\.\.\/|\.\.\\|directory.*traversal"
    ["BRUTE_FORCE"]="Failed password|authentication failure|invalid user"
    ["PORT_SCAN"]="nmap|port.*scan|stealth.*scan"
    ["PRIVILEGE_ESCALATION"]="sudo.*su|privilege.*escalation|root.*access"
)

# Función para crear reportes
create_report_header() {
    local report_file="$1"
    cat > "$report_file" << EOF
===========================================
REPORTE DE ANÁLISIS DE SEGURIDAD
===========================================
Fecha: $(date)
Hostname: $(hostname)
Sistema: $(uname -a)
===========================================

EOF
}

# Análisis de intentos de autenticación
analyze_auth_attempts() {
    local report_file="$1"

    echo "ANÁLISIS DE AUTENTICACIÓN" >> "$report_file"
    echo "=========================" >> "$report_file"

    # Intentos fallidos por IP
    echo "Top 10 IPs con intentos fallidos:" >> "$report_file"
    grep "Failed password" /var/log/auth.log 2>/dev/null | 
    awk '{print $(NF-3)}' | sort | uniq -c | sort -nr | head -10 >> "$report_file"

    echo "" >> "$report_file"

    # Usuarios más atacados
    echo "Usuarios más atacados:" >> "$report_file"
    grep "Failed password" /var/log/auth.log 2>/dev/null | 
    awk '{print $9}' | sort | uniq -c | sort -nr | head -10 >> "$report_file"

    echo "" >> "$report_file"

    # Logins exitosos sospechosos (fuera de horario)
    echo "Logins exitosos fuera de horario (22:00-06:00):" >> "$report_file"
    grep "Accepted" /var/log/auth.log 2>/dev/null | 
    awk '$3 ~ /^(2[2-3]|0[0-6]):/ {print}' >> "$report_file"

    echo "" >> "$report_file"
}

# Análisis de patrones de ataque
analyze_attack_patterns() {
    local report_file="$1"

    echo "ANÁLISIS DE PATRONES DE ATAQUE" >> "$report_file"
    echo "==============================" >> "$report_file"

    for attack_type in "${!ATTACK_PATTERNS[@]}"; do
        local pattern="${ATTACK_PATTERNS[$attack_type]}"
        local count=0

        echo "Analizando: $attack_type" >> "$report_file"

        for log_file in "${LOG_FILES[@]}"; do
            if [ -f "$log_file" ]; then
                local matches
                matches=$(grep -iE "$pattern" "$log_file" 2>/dev/null)
                if [ -n "$matches" ]; then
                    local match_count
                    match_count=$(echo "$matches" | wc -l)
                    count=$((count + match_count))

                    echo "  Archivo: $log_file - Coincidencias: $match_count" >> "$report_file"
                    echo "$matches" | head -5 >> "$report_file"
                fi
            fi
        done

        echo "  Total de coincidencias para $attack_type: $count" >> "$report_file"
        echo "" >> "$report_file"
    done
}

# Análisis de conexiones de red
analyze_network_activity() {
    local report_file="$1"

    echo "ANÁLISIS DE ACTIVIDAD DE RED" >> "$report_file"
    echo "============================" >> "$report_file"

    # Conexiones establecidas
    echo "Conexiones activas:" >> "$report_file"
    ss -tuln | grep ESTAB >> "$report_file"

    echo "" >> "$report_file"

    # Puertos en escucha
    echo "Puertos en escucha:" >> "$report_file"
    ss -tuln | grep LISTEN >> "$report_file"

    echo "" >> "$report_file"

    # Análisis de logs de firewall
    if [ -f "/var/log/ufw.log" ]; then
        echo "Actividad del firewall (últimos bloqueos):" >> "$report_file"
        grep "BLOCK" /var/log/ufw.log | tail -20 >> "$report_file"
    fi

    echo "" >> "$report_file"
}

# Análisis de cambios en el sistema
analyze_system_changes() {
    local report_file="$1"

    echo "ANÁLISIS DE CAMBIOS DEL SISTEMA" >> "$report_file"
    echo "===============================" >> "$report_file"

    # Nuevos usuarios
    echo "Usuarios creados recientemente:" >> "$report_file"
    grep "useradd" /var/log/auth.log 2>/dev/null | tail -10 >> "$report_file"

    echo "" >> "$report_file"

    # Cambios de contraseña
    echo "Cambios de contraseña recientes:" >> "$report_file"
    grep "password changed" /var/log/auth.log 2>/dev/null | tail -10 >> "$report_file"

    echo "" >> "$report_file"

    # Comandos sudo ejecutados
    echo "Comandos sudo ejecutados (últimos 20):" >> "$report_file"
    grep "sudo:" /var/log/auth.log 2>/dev/null | tail -20 >> "$report_file"

    echo "" >> "$report_file"
}

# Generar resumen ejecutivo
generate_executive_summary() {
    local report_file="$1"

    echo "RESUMEN EJECUTIVO" >> "$report_file"
    echo "=================" >> "$report_file"

    local failed_logins
    local successful_logins
    local sudo_commands
    local firewall_blocks

    failed_logins=$(grep -c "Failed password" /var/log/auth.log 2>/dev/null || echo "0")
    successful_logins=$(grep -c "Accepted" /var/log/auth.log 2>/dev/null || echo "0")
    sudo_commands=$(grep -c "sudo:" /var/log/auth.log 2>/dev/null || echo "0")
    firewall_blocks=$(grep -c "BLOCK" /var/log/ufw.log 2>/dev/null || echo "0")

    echo "Estadísticas del día:" >> "$report_file"
    echo "- Intentos de login fallidos: $failed_logins" >> "$report_file"
    echo "- Logins exitosos: $successful_logins" >> "$report_file"
    echo "- Comandos sudo ejecutados: $sudo_commands" >> "$report_file"
    echo "- Conexiones bloqueadas por firewall: $firewall_blocks" >> "$report_file"

    # Nivel de riesgo
    local risk_level="BAJO"
    if [ "$failed_logins" -gt 100 ]; then
        risk_level="ALTO"
    elif [ "$failed_logins" -gt 50 ]; then
        risk_level="MEDIO"
    fi

    echo "- Nivel de riesgo estimado: $risk_level" >> "$report_file"
    echo "" >> "$report_file"
}

# Función principal
main() {
    local report_file="$REPORT_DIR/security_report_$DATE_PATTERN.txt"

    # Crear directorio de reportes
    mkdir -p "$REPORT_DIR"

    # Crear reporte
    create_report_header "$report_file"
    generate_executive_summary "$report_file"
    analyze_auth_attempts "$report_file"
    analyze_attack_patterns "$report_file"
    analyze_network_activity "$report_file"
    analyze_system_changes "$report_file"

    echo "Reporte generado: $report_file"

    # Mostrar resumen en pantalla
    echo "=== RESUMEN ==="
    grep -A 10 "RESUMEN EJECUTIVO" "$report_file" | tail -8
}

# Verificar permisos
if [ "$EUID" -ne 0 ]; then
    echo "Se recomienda ejecutar como root para acceso completo a logs"
fi

# Ejecutar
main "$@"

3.4. Instalación y Uso

3.4.1. Instalación

# Crear el script
sudo nano /usr/local/bin/log_analyzer.sh

# Hacer ejecutable
sudo chmod +x /usr/local/bin/log_analyzer.sh

# Crear directorio de reportes
sudo mkdir -p /var/log/security_reports

3.4.2. Uso básico

# Ejecutar análisis
sudo /usr/local/bin/log_analyzer.sh

# Ver el reporte generado
sudo cat /var/log/security_reports/security_report_$(date +%Y-%m-%d).txt

3.4.3. Automatización

# Agregar a cron para ejecución diaria
echo "0 6 * * * /usr/local/bin/log_analyzer.sh" | sudo crontab -

4. Script 3: Escáner de Vulnerabilidades del Sistema

4.1. Descripción

Script comprehensivo para escanear el sistema en busca de vulnerabilidades comunes, configuraciones inseguras y problemas de seguridad.

4.2. Tags: vulnerability-scanner security-audit system-hardening

4.3. Código del Script

#!/bin/bash
# vuln_scanner.sh - Escáner de Vulnerabilidades del Sistema
# Autor: Security Audit Team
# Versión: 2.3
# Descripción: Escanea vulnerabilidades y configuraciones inseguras

# Configuración
REPORT_FILE="/tmp/vulnerability_scan_$(date +%Y%m%d_%H%M%S).txt"
CRITICAL_COUNT=0
HIGH_COUNT=0
MEDIUM_COUNT=0
LOW_COUNT=0

# Colores para output
RED='\033[0;31m'
YELLOW='\033[1;33m'
GREEN='\033[0;32m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# Función para logging con niveles
log_vulnerability() {
    local level="$1"
    local description="$2"
    local details="$3"

    case $level in
        "CRITICAL")
            echo -e "${RED}[CRÍTICO]${NC} $description" | tee -a "$REPORT_FILE"
            ((CRITICAL_COUNT++))
            ;;
        "HIGH")
            echo -e "${RED}[ALTO]${NC} $description" | tee -a "$REPORT_FILE"
            ((HIGH_COUNT++))
            ;;
        "MEDIUM")
            echo -e "${YELLOW}[MEDIO]${NC} $description" | tee -a "$REPORT_FILE"
            ((MEDIUM_COUNT++))
            ;;
        "LOW")
            echo -e "${BLUE}[BAJO]${NC} $description" | tee -a "$REPORT_FILE"
            ((LOW_COUNT++))
            ;;
    esac

    if [ -n "$details" ]; then
        echo "    Detalles: $details" >> "$REPORT_FILE"
    fi
    echo "" >> "$REPORT_FILE"
}

# Verificar configuración de SSH
check_ssh_config() {
    echo -e "${GREEN}Verificando configuración SSH...${NC}"

    if [ -f "/etc/ssh/sshd_config" ]; then
        # Verificar root login
        if grep -q "^PermitRootLogin yes" /etc/ssh/sshd_config; then
            log_vulnerability "HIGH" "SSH permite login directo como root" \
                "Cambiar 'PermitRootLogin' a 'no' en /etc/ssh/sshd_config"
        fi

        # Verificar autenticación por contraseña
        if grep -q "^PasswordAuthentication yes" /etc/ssh/sshd_config; then
            log_vulnerability "MEDIUM" "SSH permite autenticación por contraseña" \
                "Considerar usar solo autenticación por clave pública"
        fi

        # Verificar protocolo SSH
        if ! grep -q "^Protocol 2" /etc/ssh/sshd_config; then
            log_vulnerability "HIGH" "SSH no está configurado específicamente para protocolo 2" \
                "Agregar 'Protocol 2' en /etc/ssh/sshd_config"
        fi

        # Verificar puerto por defecto
        if grep -q "^Port 22" /etc/ssh/sshd_config || ! grep -q "^Port" /etc/ssh/sshd_config; then
            log_vulnerability "LOW" "SSH usando puerto por defecto (22)" \
                "Considerar cambiar el puerto SSH"
        fi
    else
        log_vulnerability "LOW" "Archivo de configuración SSH no encontrado" ""
    fi
}

# Verificar usuarios y permisos
check_users_permissions() {
    echo -e "${GREEN}Verificando usuarios y permisos...${NC}"

    # Usuarios con UID 0
    local root_users
    root_users=$(awk -F: '$3 == 0 {print $1}' /etc/passwd | grep -v "^root$")
    if [ -n "$root_users" ]; then
        log_vulnerability "CRITICAL" "Usuarios adicionales con UID 0 detectados" \
            "Usuarios: $root_users"
    fi

    # Usuarios sin contraseña
    local no_passwd_users
    no_passwd_users=$(awk -F: '$2 == "" {print $1}' /etc/shadow 2>/dev/null)
    if [ -n "$no_passwd_users" ]; then
        log_vulnerability "CRITICAL" "Usuarios sin contraseña detectados" \
            "Usuarios: $no_passwd_users"
    fi

    # Archivos con permisos 777
    local world_writable
    world_writable=$(find /etc /bin /sbin /usr/bin /usr/sbin -type f -perm -002 2>/dev/null | head -10)
    if [ -n "$world_writable" ]; then
        log_vulnerability "HIGH" "Archivos críticos con permisos de escritura mundial" \
            "$(echo "$world_writable" | tr '\n' ' ')"
    fi

    # Verificar sudo sin contraseña
    if grep -q "NOPASSWD" /etc/sudoers 2>/dev/null; then
        log_vulnerability "MEDIUM" "Configuración sudo sin contraseña detectada" \
            "Revisar configuración en /etc/sudoers"
    fi
}

# Verificar servicios y puertos
check_services_ports() {
    echo -e "${GREEN}Verificando servicios y puertos...${NC}"

    # Servicios innecesarios comunes
    local unnecessary_services=("telnet" "rsh" "rlogin" "ftp" "tftp")

    for service in "${unnecessary_services[@]}"; do
        if systemctl is-active --quiet "$service" 2>/dev/null; then
            log_vulnerability "HIGH" "Servicio inseguro activo: $service" \
                "Considerar deshabilitar con: systemctl disable $service"
        fi
    done

    # Puertos abiertos sospechosos
    local open_ports
    open_ports=$(ss -tuln | grep LISTEN | awk '{print $5}' | cut -d: -f2 | sort -n | uniq)

    for port in $open_ports; do
        case $port in
            23) log_vulnerability "HIGH" "Puerto Telnet (23) abierto" "Servicio inseguro" ;;
            69) log_vulnerability "HIGH" "Puerto TFTP (69) abierto" "Servicio inseguro" ;;
            135|139|445) log_vulnerability "MEDIUM" "Puerto SMB/NetBIOS ($port) abierto" "Revisar necesidad" ;;
            1433|3306|5432) log_vulnerability "MEDIUM" "Puerto de base de datos ($port) abierto" "Verificar acceso remoto" ;;
        esac
    done
}

# Verificar actualizaciones del sistema
check_system_updates() {
    echo -e "${GREEN}Verificando actualizaciones del sistema...${NC}"

    if command -v apt &> /dev/null; then
        # Debian/Ubuntu
        apt list --upgradable 2>/dev/null | grep -c "upgradable" > /tmp/update_count
        local update_count
        update_count=$(cat /tmp/update_count)

        if [ "$update_count" -gt 50 ]; then
            log_vulnerability "HIGH" "$update_count actualizaciones pendientes" \
                "Ejecutar: apt update && apt upgrade"
        elif [ "$update_count" -gt 10 ]; then
            log_vulnerability "MEDIUM" "$update_count actualizaciones pendientes" \
                "Ejecutar: apt update && apt upgrade"
        fi

        # Verificar actualizaciones de seguridad
        local security_updates
        security_updates=$(apt list --upgradable 2>/dev/null | grep -i security | wc -l)
        if [ "$security_updates" -gt 0 ]; then
            log_vulnerability "HIGH" "$security_updates actualizaciones de seguridad pendientes" \
                "Instalar inmediatamente"
        fi

    elif command -v yum &> /dev/null; then
        # CentOS/RHEL
        local update_count
        update_count=$(yum check-update 2>/dev/null | grep -c "updates")

        if [ "$update_count" -gt 50 ]; then
            log_vulnerability "HIGH" "$update_count actualizaciones pendientes" \
                "Ejecutar: yum update"
        elif [ "$update_count" -gt 10 ]; then
            log_vulnerability "MEDIUM" "$update_count actualizaciones pendientes" \
                "Ejecutar: yum update"
        fi
    fi
}

# Verificar configuración del firewall
check_firewall_config() {
    echo -e "${GREEN}Verificando configuración del firewall...${NC}"

    # UFW
    if command -v ufw &> /dev/null; then
        local ufw_status
        ufw_status=$(ufw status | grep "Status:" | awk '{print $2}')

        if [ "$ufw_status" = "inactive" ]; then
            log_vulnerability "HIGH" "Firewall UFW desactivado" \
                "Activar con: ufw enable"
        fi
    fi

    # iptables
    local iptables_rules
    iptables_rules=$(iptables -L | grep -c "Chain")

    if [ "$iptables_rules" -lt 3 ]; then
        log_vulnerability "MEDIUM" "Reglas de iptables mínimas o inexistentes" \
            "Configurar reglas de firewall apropiadas"
    fi

    # Verificar políticas por defecto
    local default_policy
    default_policy=$(iptables -L | grep "policy ACCEPT" | wc -l)

    if [ "$default_policy" -gt 0 ]; then
        log_vulnerability "MEDIUM" "Políticas de firewall permisivas detectadas" \
            "Revisar políticas por defecto"
    fi
}

# Verificar logs y auditoría
check_logging_audit() {
    echo -e "${GREEN}Verificando configuración de logs y auditoría...${NC}"

    # Verificar syslog
    if ! systemctl is-active --quiet rsyslog; then
        log_vulnerability "MEDIUM" "Servicio rsyslog no está activo" \
            "Activar con: systemctl enable rsyslog"
    fi

    # Verificar auditd
    if ! systemctl is-active --quiet auditd 2>/dev/null; then
        log_vulnerability "LOW" "Sistema de auditoría (auditd) no está activo" \
            "Instalar y configurar auditd"
    fi

    # Verificar rotación de logs
    if [ ! -f "/etc/logrotate.conf" ]; then
        log_vulnerability "MEDIUM" "Configuración de rotación de logs no encontrada" \
            "Configurar logrotate"
    fi
}

# Verificar configuraciones de seguridad del kernel
check_kernel_security() {
    echo -e "${GREEN}Verificando configuraciones de seguridad del kernel...${NC}"

    # Verificar ASLR
    local aslr_status
    aslr_status=$(cat /proc/sys/kernel/randomize_va_space 2>/dev/null)

    if [ "$aslr_status" != "2" ]; then
        log_vulnerability "MEDIUM" "ASLR no está completamente habilitado" \
            "Configurar kernel.randomize_va_space = 2"
    fi

    # Verificar protección exec-shield
    if [ -f "/proc/sys/kernel/exec-shield" ]; then
        local exec_shield
        exec_shield=$(cat /proc/sys/kernel/exec-shield)
        if [ "$exec_shield" != "1" ]; then
            log_vulnerability "LOW" "Exec-shield no está habilitado" \
                "Habilitar exec-shield"
        fi
    fi

    # Verificar control de acceso obligatorio (SELinux/AppArmor)
    if command -v getenforce &> /dev/null; then
        local selinux_status
        selinux_status=$(getenforce)
        if [ "$selinux_status" = "Disabled" ]; then
            log_vulnerability "MEDIUM" "SELinux está deshabilitado" \
                "Considerar habilitar SELinux"
        fi
    elif command -v aa-status &> /dev/null; then
        if ! aa-status &> /dev/null; then
            log_vulnerability "MEDIUM" "AppArmor no está activo" \
                "Verificar estado de AppArmor"
        fi
    else
        log_vulnerability "LOW" "No se detectó sistema de control de acceso obligatorio" \
            "Considerar instalar SELinux o AppArmor"
    fi
}

# Verificar archivos de configuración críticos
check_critical_files() {
    echo -e "${GREEN}Verificando archivos de configuración críticos...${NC}"

    # Verificar permisos de archivos sensibles
    local critical_files=(
        "/etc/passwd:644"
        "/etc/shadow:640"
        "/etc/group:644"
        "/etc/gshadow:640"
        "/etc/sudoers:440"
    )

    for file_perm in "${critical_files[@]}"; do
        local file="${file_perm%:*}"
        local expected_perm="${file_perm#*:}"

        if [ -f "$file" ]; then
            local actual_perm
            actual_perm=$(stat -c "%a" "$file")

            if [ "$actual_perm" != "$expected_perm" ]; then
                log_vulnerability "HIGH" "Permisos incorrectos en $file" \
                    "Actual: $actual_perm, Esperado: $expected_perm"
            fi
        fi
    done

    # Verificar archivos de configuración backup
    local backup_files
    backup_files=$(find /etc -name "*.bak" -o -name "*.old" -o -name "*~" 2>/dev/null)

    if [ -n "$backup_files" ]; then
        log_vulnerability "LOW" "Archivos de respaldo encontrados en /etc" \
            "$(echo "$backup_files" | head -5 | tr '\n' ' ')"
    fi
}

# Verificar configuración de red
check_network_security() {
    echo -e "${GREEN}Verificando configuración de seguridad de red...${NC}"

    # Verificar IP forwarding
    local ip_forward
    ip_forward=$(cat /proc/sys/net/ipv4/ip_forward)

    if [ "$ip_forward" = "1" ] && ! grep -q "router\|gateway" /etc/hostname; then
        log_vulnerability "MEDIUM" "IP forwarding habilitado" \
            "Deshabilitar si no es necesario: echo 0 > /proc/sys/net/ipv4/ip_forward"
    fi

    # Verificar source routing
    local accept_source_route
    accept_source_route=$(cat /proc/sys/net/ipv4/conf/all/accept_source_route)

    if [ "$accept_source_route" = "1" ]; then
        log_vulnerability "MEDIUM" "Source routing habilitado" \
            "Deshabilitar source routing"
    fi

    # Verificar ICMP redirects
    local accept_redirects
    accept_redirects=$(cat /proc/sys/net/ipv4/conf/all/accept_redirects)

    if [ "$accept_redirects" = "1" ]; then
        log_vulnerability "LOW" "ICMP redirects habilitados" \
            "Considerar deshabilitar ICMP redirects"
    fi
}

# Verificar software instalado
check_installed_software() {
    echo -e "${GREEN}Verificando software instalado...${NC}"

    # Software potencialmente peligroso
    local risky_software=("netcat" "ncat" "socat" "telnet-server" "rsh-server")

    for software in "${risky_software[@]}"; do
        if dpkg -l "$software" 2>/dev/null | grep -q "^ii"; then
            log_vulnerability "MEDIUM" "Software potencialmente riesgoso instalado: $software" \
                "Revisar necesidad y considerar desinstalar"
        elif rpm -q "$software" 2>/dev/null; then
            log_vulnerability "MEDIUM" "Software potencialmente riesgoso instalado: $software" \
                "Revisar necesidad y considerar desinstalar"
        fi
    done

    # Verificar compiladores (en servidores de producción)
    local compilers=("gcc" "g++" "make" "cmake")
    local compiler_found=false

    for compiler in "${compilers[@]}"; do
        if command -v "$compiler" &> /dev/null; then
            compiler_found=true
            break
        fi
    done

    if [ "$compiler_found" = true ]; then
        log_vulnerability "LOW" "Compiladores encontrados en el sistema" \
            "En servidores de producción, considerar remover herramientas de desarrollo"
    fi
}

# Generar reporte final
generate_final_report() {
    echo "" >> "$REPORT_FILE"
    echo "========================================" >> "$REPORT_FILE"
    echo "RESUMEN DE VULNERABILIDADES ENCONTRADAS" >> "$REPORT_FILE"
    echo "========================================" >> "$REPORT_FILE"
    echo "Críticas: $CRITICAL_COUNT" >> "$REPORT_FILE"
    echo "Altas: $HIGH_COUNT" >> "$REPORT_FILE"
    echo "Medias: $MEDIUM_COUNT" >> "$REPORT_FILE"
    echo "Bajas: $LOW_COUNT" >> "$REPORT_FILE"
    echo "Total: $((CRITICAL_COUNT + HIGH_COUNT + MEDIUM_COUNT + LOW_COUNT))" >> "$REPORT_FILE"
    echo "" >> "$REPORT_FILE"

    # Calcular score de seguridad
    local security_score
    security_score=$((100 - (CRITICAL_COUNT * 25) - (HIGH_COUNT * 10) - (MEDIUM_COUNT * 5) - (LOW_COUNT * 1)))

    if [ $security_score -lt 0 ]; then
        security_score=0
    fi

    echo "Score de Seguridad: $security_score/100" >> "$REPORT_FILE"

    if [ $security_score -ge 80 ]; then
        echo "Estado: BUENO" >> "$REPORT_FILE"
    elif [ $security_score -ge 60 ]; then
        echo "Estado: REGULAR - Requiere atención" >> "$REPORT_FILE"
    else
        echo "Estado: CRÍTICO - Requiere acción inmediata" >> "$REPORT_FILE"
    fi

    echo "" >> "$REPORT_FILE"
    echo "Fecha del escaneo: $(date)" >> "$REPORT_FILE"
    echo "Sistema: $(uname -a)" >> "$REPORT_FILE"
    echo "Hostname: $(hostname)" >> "$REPORT_FILE"
}

# Función principal
main() {
    echo -e "${GREEN}===========================================${NC}"
    echo -e "${GREEN}    ESCÁNER DE VULNERABILIDADES v2.3     ${NC}"
    echo -e "${GREEN}===========================================${NC}"
    echo ""

    # Crear encabezado del reporte
    echo "REPORTE DE VULNERABILIDADES" > "$REPORT_FILE"
    echo "============================" >> "$REPORT_FILE"
    echo "Fecha: $(date)" >> "$REPORT_FILE"
    echo "Sistema: $(uname -a)" >> "$REPORT_FILE"
    echo "Hostname: $(hostname)" >> "$REPORT_FILE"
    echo "" >> "$REPORT_FILE"

    # Ejecutar verificaciones
    check_ssh_config
    check_users_permissions
    check_services_ports
    check_system_updates
    check_firewall_config
    check_logging_audit
    check_kernel_security
    check_critical_files
    check_network_security
    check_installed_software

    # Generar reporte final
    generate_final_report

    # Mostrar resumen
    echo ""
    echo -e "${GREEN}===========================================${NC}"
    echo -e "${GREEN}            RESUMEN FINAL                  ${NC}"
    echo -e "${GREEN}===========================================${NC}"
    echo -e "Vulnerabilidades ${RED}CRÍTICAS${NC}: $CRITICAL_COUNT"
    echo -e "Vulnerabilidades ${RED}ALTAS${NC}: $HIGH_COUNT"
    echo -e "Vulnerabilidades ${YELLOW}MEDIAS${NC}: $MEDIUM_COUNT"
    echo -e "Vulnerabilidades ${BLUE}BAJAS${NC}: $LOW_COUNT"
    echo ""
    echo -e "Reporte completo guardado en: ${GREEN}$REPORT_FILE${NC}"
    echo ""

    # Mostrar recomendaciones prioritarias
    if [ $CRITICAL_COUNT -gt 0 ] || [ $HIGH_COUNT -gt 0 ]; then
        echo -e "${RED}⚠️  ATENCIÓN: Se encontraron vulnerabilidades críticas o altas${NC}"
        echo -e "${RED}   Revisar el reporte y tomar medidas correctivas inmediatamente${NC}"
    elif [ $MEDIUM_COUNT -gt 5 ]; then
        echo -e "${YELLOW}⚠️  ADVERTENCIA: Múltiples vulnerabilidades de nivel medio${NC}"
        echo -e "${YELLOW}   Se recomienda revisar y corregir en el próximo mantenimiento${NC}"
    else
        echo -e "${GREEN}✅ Estado de seguridad: Aceptable${NC}"
    fi
}

# Verificar herramientas necesarias
check_dependencies() {
    local missing_tools=()
    local tools=("awk" "grep" "find" "stat" "systemctl")

    for tool in "${tools[@]}"; do
        if ! command -v "$tool" &> /dev/null; then
            missing_tools+=("$tool")
        fi
    done

    if [ ${#missing_tools[@]} -gt 0 ]; then
        echo -e "${RED}Error: Herramientas faltantes: ${missing_tools[*]}${NC}"
        exit 1
    fi
}

# Verificar dependencias y ejecutar
check_dependencies
main "$@"

4.4. Instalación y Configuración

4.4.1. Paso 1: Instalación del script

# Crear el archivo del script
sudo nano /usr/local/bin/vuln_scanner.sh

# Copiar el código y guardar

# Hacer ejecutable
sudo chmod +x /usr/local/bin/vuln_scanner.sh

4.4.2. Paso 2: Ejecución básica

# Ejecutar escaneo completo
sudo /usr/local/bin/vuln_scanner.sh

# Ver el reporte generado
cat /tmp/vulnerability_scan_*.txt

4.4.3. Paso 3: Automatización (recomendado semanal)

# Agregar a cron para ejecución semanal
echo "0 2 * * 0 /usr/local/bin/vuln_scanner.sh" | sudo crontab -

# Crear script para envío de reportes por email
cat > /usr/local/bin/send_vuln_report.sh << 'EOF'
#!/bin/bash
REPORT=$(ls -t /tmp/vulnerability_scan_*.txt | head -1)
if [ -f "$REPORT" ]; then
    mail -s "Reporte de Vulnerabilidades - $(hostname)" admin@empresa.com < "$REPORT"
fi
EOF

sudo chmod +x /usr/local/bin/send_vuln_report.sh

4.5. Ejemplos de Uso Avanzado

4.5.1. Escaneo específico por categoría

# Modificar el script para escaneos específicos
# Ejemplo: solo verificar SSH y usuarios
/usr/local/bin/vuln_scanner.sh --ssh --users

4.5.2. Integración con otros sistemas

# Exportar resultados en formato JSON para SIEM
# Agregar función de exportación al script
export_json() {
    local json_file="/tmp/vulnerabilities.json"
    cat > "$json_file" << EOF
{
    "timestamp": "$(date -Iseconds)",
    "hostname": "$(hostname)",
    "vulnerabilities": {
        "critical": $CRITICAL_COUNT,
        "high": $HIGH_COUNT,
        "medium": $MEDIUM_COUNT,
        "low": $LOW_COUNT
    }
}
EOF
    echo "Reporte JSON: $json_file"
}

5. Guía de Implementación y Mejores Prácticas

5.1. Configuración Inicial del Entorno

5.1.1. Preparación del sistema

# Crear estructura de directorios
sudo mkdir -p /var/log/security/{reports,alerts,scans}
sudo mkdir -p /etc/security/scripts

# Configurar permisos
sudo chmod 750 /var/log/security
sudo chown root:adm /var/log/security

# Instalar dependencias necesarias
sudo apt-get update
sudo apt-get install -y mailutils bc netcat-openbsd

5.1.2. Configuración de alertas

# Configurar postfix para alertas por email
sudo dpkg-reconfigure postfix

# Crear archivo de configuración de alertas
cat > /etc/security/alert.conf << 'EOF'
# Configuración de alertas de seguridad
ALERT_EMAIL="security@empresa.com"
ALERT_THRESHOLD_CRITICAL=1
ALERT_THRESHOLD_HIGH=3
SEND_DAILY_REPORT=true
EOF

5.2. Programación y Automatización

5.2.1. Script de orquestación

#!/bin/bash
# security_orchestrator.sh - Orquestador de scripts de seguridad

# Ejecutar monitoreo cada 15 minutos
*/15 * * * * /usr/local/bin/security_monitor.sh

# Ejecutar análisis de logs diariamente a las 6 AM
0 6 * * * /usr/local/bin/log_analyzer.sh

# Ejecutar escaneo de vulnerabilidades semanalmente
0 2 * * 0 /usr/local/bin/vuln_scanner.sh

# Limpiar logs antiguos mensualmente
0 0 1 * * find /var/log/security -name "*.log" -mtime +30 -delete

5.3. Personalización y Extensión

5.3.1. Agregar nuevas verificaciones

Los scripts están diseñados para ser extensibles. Para agregar nuevas verificaciones:

  1. En securitymonitor.sh: Agregar nueva función `checknuevaverificacion()`
  2. En loganalyzer.sh: Añadir patrones a `ATTACKPATTERNS`
  3. En vulnscanner.sh: Crear nueva función `checknuevacategoria()`

5.3.2. Integración con SIEM

# Función para enviar datos a SIEM
send_to_siem() {
    local event_data="$1"
    local siem_endpoint="https://siem.empresa.com/api/events"

    curl -X POST "$siem_endpoint" \
         -H "Content-Type: application/json" \
         -H "Authorization: Bearer $SIEM_TOKEN" \
         -d "$event_data"
}

5.4. Mantenimiento y Monitoreo

5.4.1. Verificación de funcionamiento

# Script de verificación del estado de los scripts de seguridad
#!/bin/bash
echo "Verificando scripts de seguridad..."

for script in security_monitor log_analyzer vuln_scanner; do
    if [ -x "/usr/local/bin/${script}.sh" ]; then
        echo "✅ $script - OK"
    else
        echo "❌ $script - FALTA O NO EJECUTABLE"
    fi
done

# Verificar logs recientes
if [ -f "/var/log/security_monitor.log" ]; then
    last_entry=$(tail -1 /var/log/security_monitor.log | cut -d']' -f1 | tr -d '[')
    echo "Último monitoreo: $last_entry"
fi

5.5. Consideraciones de Seguridad

5.5.1. Protección de los scripts

  • Almacenar en ubicaciones seguras (`/usr/local/bin/`)
  • Permisos restrictivos (755 para ejecución, 644 para configuración)
  • Validar todas las entradas
  • Usar rutas absolutas para comandos

5.5.2. Gestión de logs

  • Rotación automática con `logrotate`
  • Envío seguro a sistemas centralizados
  • Encriptación de logs sensibles
  • Retención según políticas de la organización

6. Solución de Problemas Comunes

6.1. Problemas de Permisos

# Error: Permission denied
# Solución: Verificar permisos y ejecutar como root si es necesario
sudo chmod +x /usr/local/bin/script_name.sh
sudo chown root:root /usr/local/bin/script_name.sh

6.2. Problemas de Dependencias

# Error: command not found
# Solución: Instalar herramientas faltantes
sudo apt-get install -y bc netcat-openbsd mailutils

# Para CentOS/RHEL
sudo yum install -y bc nc mailx

6.3. Problemas de Conectividad

# Error al enviar emails
# Verificar configuración de MTA
systemctl status postfix
# O configurar relay SMTP externo

7. Conclusión

Estos tres scripts proporcionan una base sólida para la monitorización y auditoría de seguridad en sistemas Linux. Cada script está diseñado para:

  • Facilidad de uso: Instalación y configuración simples
  • Extensibilidad: Fácil personalización y adición de nuevas funcionalidades
  • Automatización: Integración perfecta con cron y sistemas de monitoreo
  • Reporting: Generación de reportes detallados y alertas automáticas

La implementación de estos scripts como parte de una estrategia integral de ciberseguridad ayudará a mantener los sistemas Linux seguros y detectar amenazas de manera proactiva.

7.1. Próximos Pasos Recomendados

  1. Implementar los scripts en un entorno de prueba
  2. Personalizar las configuraciones según las necesidades específicas
  3. Integrar con sistemas de monitoreo existentes
  4. Establecer procedimientos de respuesta a incidentes
  5. Capacitar al equipo en el uso y mantenimiento de los scripts

Mantener estos scripts actualizados y revisar periódicamente su efectividad es crucial para una seguridad óptima.

Categoría: security, bash, linux, monitoring, intrusion-detection, log-analysis

Suscribirse al Feed RSS | Mapa del Sitio

© 2025 M.Castillo | Hecho con ❤️ en Emacs y org-static-blog

📊 Estadísticas Visit counter For Websites