#!/bin/bash
# Script de segurança para o servidor VPS
# Execute: bash security-setup.sh

echo "🔒 Configurando segurança do servidor..."
echo ""

# 1. Configurar UFW (Uncomplicated Firewall) se disponível
if command -v ufw &> /dev/null; then
    echo "1️⃣ Configurando UFW..."
    
    # Permitir SSH (porta 22)
    ufw allow 22/tcp
    
    # Permitir HTTP (porta 80)
    ufw allow 80/tcp
    
    # Permitir HTTPS (porta 443)
    ufw allow 443/tcp
    
    # Permitir porta da API (8000) - apenas se necessário para acesso externo
    # ufw allow 8000/tcp
    
    # Habilitar UFW
    ufw --force enable
    
    echo "✅ UFW configurado"
else
    echo "⚠️  UFW não instalado. Instale com: apt-get install ufw"
fi

# 2. Instalar fail2ban para bloquear IPs suspeitos
if command -v fail2ban-server &> /dev/null; then
    echo "2️⃣ Fail2ban já instalado"
else
    echo "2️⃣ Instalando fail2ban..."
    apt-get update
    apt-get install -y fail2ban
    
    # Criar configuração customizada para Node.js
    cat > /etc/fail2ban/jail.local << 'EOF'
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 5

[sshd]
enabled = true
port = 22
logpath = /var/log/auth.log

[nodejs-api]
enabled = true
port = 8000
filter = nodejs-api
logpath = /var/www/maktubia-backend/logs/*.log
maxretry = 10
bantime = 7200
EOF

    # Criar filtro para Node.js
    cat > /etc/fail2ban/filter.d/nodejs-api.conf << 'EOF'
[Definition]
failregex = ^.*"(GET|POST|PUT|DELETE) /\.(git|env|config).*" 404.*$
            ^.*"(GET|POST|PUT|DELETE) /(wp-admin|phpmyadmin|admin).*" 404.*$
            ^.*Rate limit exceeded.*$
ignoreregex =
EOF

    systemctl enable fail2ban
    systemctl restart fail2ban
    echo "✅ Fail2ban instalado e configurado"
fi

# 3. Configurar nginx (se estiver usando)
if command -v nginx &> /dev/null; then
    echo "3️⃣ Nginx detectado. Criando configuração de segurança..."
    
    cat > /etc/nginx/snippets/security.conf << 'EOF'
# Bloquear acesso a arquivos sensíveis
location ~ /\.(git|env|config|htaccess|htpasswd) {
    deny all;
    return 404;
}

# Bloquear caminhos comuns de exploração
location ~ ^/(wp-admin|phpmyadmin|administrator|admin) {
    deny all;
    return 404;
}

# Bloquear User-Agents suspeitos
if ($http_user_agent ~* (bot|crawler|spider|scanner|exploit|hack)) {
    return 403;
}
EOF

    echo "✅ Snippets de segurança criados para Nginx"
    echo "   Adicione 'include snippets/security.conf;' no seu bloco server do Nginx"
fi

# 4. Criar script para bloquear IPs manualmente
cat > /usr/local/bin/block-ip.sh << 'EOF'
#!/bin/bash
# Bloquear IP manualmente
# Uso: block-ip.sh <IP>

if [ -z "$1" ]; then
    echo "Uso: block-ip.sh <IP>"
    exit 1
fi

IP=$1

# Bloquear com iptables
iptables -A INPUT -s $IP -j DROP

# Adicionar ao fail2ban
if command -v fail2ban-client &> /dev/null; then
    fail2ban-client set sshd banip $IP
fi

echo "✅ IP $IP bloqueado"
EOF

chmod +x /usr/local/bin/block-ip.sh

# 5. Criar script para listar IPs suspeitos
cat > /usr/local/bin/list-suspicious-ips.sh << 'EOF'
#!/bin/bash
# Listar IPs suspeitos dos logs
# Uso: list-suspicious-ips.sh

LOG_FILE="/var/www/maktubia-backend/logs/combined.log"

if [ ! -f "$LOG_FILE" ]; then
    echo "⚠️  Arquivo de log não encontrado: $LOG_FILE"
    exit 1
fi

echo "🔍 IPs suspeitos (acessando /.git, /.env, etc.):"
grep -E "(GET|POST|PUT|DELETE) /\.(git|env|config)" $LOG_FILE | \
    awk '{print $1}' | \
    sort | uniq -c | sort -rn | head -20

echo ""
echo "🔍 IPs com muitas requisições 404:"
grep " 404 " $LOG_FILE | \
    awk '{print $1}' | \
    sort | uniq -c | sort -rn | head -20
EOF

chmod +x /usr/local/bin/list-suspicious-ips.sh

echo ""
echo "✅ Configuração de segurança concluída!"
echo ""
echo "📋 Comandos úteis:"
echo "   - Bloquear IP: block-ip.sh <IP>"
echo "   - Listar IPs suspeitos: list-suspicious-ips.sh"
echo "   - Ver logs do fail2ban: fail2ban-client status sshd"
echo "   - Ver IPs bloqueados: iptables -L -n"













