Incident Report: Mitigazione Bot e Hardening Gitea

Incident Report: Mitigazione Bot e Hardening Gitea

Questo documento analizza il problema della saturazione delle risorse (CPU e Banda) causata da crawler automatizzati (Bot) su un’istanza self-hosted di Gitea e fornisce una guida passo-passo per la messa in sicurezza.

1. Analisi del Problema

Nel caso specifico, il server Gitea ha subito un picco di carico (CPU > 95%) e traffico in uscita costante (~1MB/s).

La Causa: GPTBot (OpenAI)

L’analisi dei log ha rivelato che GPTBot stava effettuando scansioni aggressive sull’endpoint /compare/.

  • Perché è pesante: L’operazione di compare tra due tag o branch richiede a Git di calcolare le differenze (diff) in tempo reale. Se il repository è grande o i tag sono molti, questo processo consuma enormi quantità di cicli CPU.
  • Effetto Sinergico: Molteplici richieste simultanee saturano i worker di Gitea, rendendo il servizio non disponibile.

2. Come Individuare il Problema

Per identificare se il tuo server è sotto stress da bot, segui questi passaggi:

A. Monitoraggio Risorse (Host/LXC)

Usa htop o top nel container Gitea. Se vedi molti processi chiamati git o gitea con alta percentuale di CPU, il problema è a livello applicativo.

B. Analisi Log Reverse Proxy (Nginx Proxy Manager)

Cerca pattern sospetti nei log di accesso:

# Sostituisci con l'ID del tuo container
docker exec -it npm-app-1 grep -i "GPTBot" /data/logs/proxy-host-2_access.log

C. Identificazione dello User-Agent

Nei log, osserva la stringa finale. Se vedi nomi come GPTBot, CCBot, Bytespider o YandexBot, si tratta di crawler automatizzati.


3. Soluzioni Immediate (Quick Fix)

Blocco tramite Nginx Proxy Manager (NPM)

Accedi alla dashboard di NPM, vai nell’host specifico, scheda Advanced e inserisci:

# Blocco per User-Agent (Copre i bot più aggressivi)
if ($http_user_agent ~* (GPTBot|ChatGPT-User|CCBot|Bytespider|YandexBot|Amazonbot)) {
    return 403;
}

# Blocco IP specifico (Se il bot insiste da un unico IP)
deny 74.7.243.204;

4. Messa in Sicurezza (Hardening) di Gitea

A. Rendere Gitea Privato (Altamente Consigliato)

Se non hai bisogno che il tuo codice sia pubblico su internet, disabilita la visualizzazione agli utenti non loggati. I bot vedranno solo la pagina di login.

Modifica app.ini (solitamente in /var/lib/gitea/custom/conf/app.ini):

[service]
REQUIRE_SIGNIN_VIEW = true

B. Configurare il file robots.txt

Indica ai bot “educati” quali aree non devono scansionare. Crea il file in custom/public/robots.txt:

User-agent: *
Disallow: /*/compare/*
Disallow: /*/commits/*
Disallow: /*/archive/*
Disallow: /api/*

C. Limitare le risorse di Git

Impedisci che una singola richiesta “uccida” il server impostando dei timeout:

[git]
TIMEOUT.DEFAULT = 60

[repository]
MAX_REVISION_LIMIT = 100

5. Protezione Generale per altri Servizi

Queste regole valgono per qualsiasi servizio esponi (Nextcloud, Home Assistant, ecc.):

  1. Rate Limiting: Configura NPM per limitare il numero di richieste al secondo per IP.
  2. CrowdSec o Fail2Ban: Installa un sistema di prevenzione intrusioni che blocca automaticamente gli IP che mostrano comportamenti malevoli.
  3. Cloudflare (Opzionale): Usa Cloudflare come DNS/Proxy. Offre una “Bot Fight Mode” gratuita che filtra gran parte di questo traffico prima ancora che raggiunga il tuo server Proxmox.

Nota di Sicurezza: Ricorda sempre di riavviare il servizio Gitea (systemctl restart gitea) dopo ogni modifica al file app.ini per rendere effettive le impostazioni.

Built with Hugo
Theme Stack designed by Jimmy