Segurança do Apache: Automatização simples de ataques DoS com Python

Sempre fui fascinado pela resiliência e vulnerabilidades dos servidores. Recentemente, meu servidor Apache sofreu uma queda inesperada. Esse incidente me levou a uma investigação mais profunda dos logs do servidor e das medidas de segurança. Aqui está um resumo do que aconteceu, como identifiquei o problema e as medidas que tomei para prevenir ocorrências futuras.

A Descoberta do Problema

Tudo começou com a queda inesperada do servidor. Inicialmente, suspeitei de um erro, mas uma rápida revisão dos logs de acesso do Apache (access.log) revelou uma causa mais sinistra: um ataque de Negação de Serviço (DoS). Os logs estavam repletos de padrões suspeitos que acenderam alertas imediatos:

  • Excessivos pedidos POST para /xmlrpc.php um alvo conhecido para atacantes tentando explorar o XML-RPC para sites WordPress.
  • Uma série de erros HTTP 404 e 436 indicando pedidos fracassados, provavelmente devido ao atacante sondando vulnerabilidades.
  • Um volume alto de pedidos em um curto período de tempo, muito acima dos padrões de tráfego normal.

Desenvolvendo uma Defesa Automatizada

Para abordar essa questão de forma proativa, desenvolvi um script em Python que monitora continuamente o arquivo access.log do Apache em busca de tal atividade suspeita. O script usa uma lógica simples, porém eficaz, para detectar padrões potenciais de ataques DoS:

  1. Monitoramento de Pedidos de Alta Frequência: O script varre o arquivo de log em busca de quaisquer endereços IP que façam pedidos a uma taxa anormalmente alta.
  2. Verificação de Vetores de Ataque Específicos: Ele busca por múltiplos pedidos fracassados, particularmente para endpoints sensíveis como /xmlrpc.php.
  3. Detecção de Erros em Sequência: Uma sequência de erros 404 e 436 de um único IP dentro de um curto período aciona um alerta.

Implementando o Bloqueio com UFW

Ao detectar qualquer uma dessas atividades, o script automaticamente bloqueia o endereço IP ofensivo usando o Uncomplicated Firewall (ufw) do Ubuntu. Aqui está um trecho do script Python que integra com o ufw para efetuar o bloqueio:

import subprocess

def block_ip(ip_address):
    command = f'sudo ufw deny from {ip_address}'
    process = subprocess.Popen(command.split(), stdout=subprocess.PIPE)
    output, error = process.communicate()
    if error:
        print(f"Erro ao bloquear IP: {error}")
    else:
        print(f"IP bloqueado com sucesso: {ip_address}")

def process_line(line):
    """Process each log line to check for excessive access by IP addresses."""
    match = re.search(r'(\d+\.\d+\.\d+\.\d+)', line)
    if match:
        ip = match.group(1)
        current_time = time.time()
        access_times = ip_access_records[ip]

        # Remove times older than the last 60 seconds
        ip_access_records[ip] = [t for t in access_times if current_time - t <= time_frame]

        # Add current access time
        ip_access_records[ip].append(current_time)

        if len(ip_access_records[ip]) > request_threshold or "POST /wp-cron.php" in line or "POST /xmlrpc.php HTTP/1.1" in line or "SemrushBot" in line:
            block_ip(ip)
            ip_access_records[ip] = []  # Reset after blocking

Essa função é chamada sempre que o script detecta uma atividade suspeita que corresponde aos critérios para um ataque DoS.

Melhoria Contínua

Apesar de já bloquear IPs específicos e abordar vulnerabilidades conhecidas, os ataques evoluíram, mostrando diferentes táticas e novos endereços IP. Esta situação destacou a necessidade de medidas de segurança dinâmicas e monitoramento contínuo.

Conclusão

Construir e implantar este script foi uma experiência esclarecedora, enfatizando a importância de medidas de segurança proativas. É uma batalha constante para acompanhar as táticas nefastas dos ciberatacantes, mas com ferramentas como Python e ufw, podemos oferecer uma luta formidável. Espero que compartilhar isso incentive outros a considerar soluções automatizadas para melhorar a segurança do servidor.

Para aqueles interessados, continuarei atualizando meu script com base nos padrões de ataque que observo e compartilharei atualizações sobre melhorias. Fiquem atentos!

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *