<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Incident on GeppettoBarbuto - Wiki</title><link>https://blog.carrubanet.duckdns.org/tags/incident/</link><description>Recent content in Incident on GeppettoBarbuto - Wiki</description><generator>Hugo -- gohugo.io</generator><language>it-it</language><lastBuildDate>Fri, 20 Mar 2026 17:21:10 +0000</lastBuildDate><atom:link href="https://blog.carrubanet.duckdns.org/tags/incident/index.xml" rel="self" type="application/rss+xml"/><item><title>Incident Report: Mitigazione Bot e Hardening Gitea</title><link>https://blog.carrubanet.duckdns.org/wiki/cybersecurity-incident_report_mitigazione_bot_hardening_gitea/</link><pubDate>Fri, 20 Mar 2026 17:20:58 +0000</pubDate><guid>https://blog.carrubanet.duckdns.org/wiki/cybersecurity-incident_report_mitigazione_bot_hardening_gitea/</guid><description>&lt;h1 id="incident-report-mitigazione-bot-e-hardening-gitea"&gt;Incident Report: Mitigazione Bot e Hardening Gitea
&lt;/h1&gt;&lt;p&gt;Questo documento analizza il problema della saturazione delle risorse (CPU e Banda) causata da crawler automatizzati (Bot) su un&amp;rsquo;istanza self-hosted di Gitea e fornisce una guida passo-passo per la messa in sicurezza.&lt;/p&gt;
&lt;h2 id="1-analisi-del-problema"&gt;1. Analisi del Problema
&lt;/h2&gt;&lt;p&gt;Nel caso specifico, il server Gitea ha subito un picco di carico (CPU &amp;gt; 95%) e traffico in uscita costante (~1MB/s).&lt;/p&gt;
&lt;h3 id="la-causa-gptbot-openai"&gt;La Causa: GPTBot (OpenAI)
&lt;/h3&gt;&lt;p&gt;L&amp;rsquo;analisi dei log ha rivelato che &lt;strong&gt;GPTBot&lt;/strong&gt; stava effettuando scansioni aggressive sull&amp;rsquo;endpoint &lt;code&gt;/compare/&lt;/code&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Perché è pesante:&lt;/strong&gt; L&amp;rsquo;operazione di &lt;code&gt;compare&lt;/code&gt; 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.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Effetto Sinergico:&lt;/strong&gt; Molteplici richieste simultanee saturano i worker di Gitea, rendendo il servizio non disponibile.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="2-come-individuare-il-problema"&gt;2. Come Individuare il Problema
&lt;/h2&gt;&lt;p&gt;Per identificare se il tuo server è sotto stress da bot, segui questi passaggi:&lt;/p&gt;
&lt;h3 id="a-monitoraggio-risorse-hostlxc"&gt;A. Monitoraggio Risorse (Host/LXC)
&lt;/h3&gt;&lt;p&gt;Usa &lt;code&gt;htop&lt;/code&gt; o &lt;code&gt;top&lt;/code&gt; nel container Gitea. Se vedi molti processi chiamati &lt;code&gt;git&lt;/code&gt; o &lt;code&gt;gitea&lt;/code&gt; con alta percentuale di CPU, il problema è a livello applicativo.&lt;/p&gt;
&lt;h3 id="b-analisi-log-reverse-proxy-nginx-proxy-manager"&gt;B. Analisi Log Reverse Proxy (Nginx Proxy Manager)
&lt;/h3&gt;&lt;p&gt;Cerca pattern sospetti nei log di accesso:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Sostituisci con l&amp;#39;ID del tuo container&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker exec -it npm-app-1 grep -i &lt;span style="color:#e6db74"&gt;&amp;#34;GPTBot&amp;#34;&lt;/span&gt; /data/logs/proxy-host-2_access.log
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="c-identificazione-dello-user-agent"&gt;C. Identificazione dello User-Agent
&lt;/h3&gt;&lt;p&gt;Nei log, osserva la stringa finale. Se vedi nomi come &lt;code&gt;GPTBot&lt;/code&gt;, &lt;code&gt;CCBot&lt;/code&gt;, &lt;code&gt;Bytespider&lt;/code&gt; o &lt;code&gt;YandexBot&lt;/code&gt;, si tratta di crawler automatizzati.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="3-soluzioni-immediate-quick-fix"&gt;3. Soluzioni Immediate (Quick Fix)
&lt;/h2&gt;&lt;h3 id="blocco-tramite-nginx-proxy-manager-npm"&gt;Blocco tramite Nginx Proxy Manager (NPM)
&lt;/h3&gt;&lt;p&gt;Accedi alla dashboard di NPM, vai nell&amp;rsquo;host specifico, scheda &lt;strong&gt;Advanced&lt;/strong&gt; e inserisci:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Blocco per User-Agent (Copre i bot più aggressivi)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#e6db74"&gt;(&lt;/span&gt;$http_user_agent ~&lt;span style="color:#e6db74"&gt;*&lt;/span&gt; &lt;span style="color:#e6db74"&gt;(GPTBot|ChatGPT-User|CCBot|Bytespider|YandexBot|Amazonbot))&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;403&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Blocco IP specifico (Se il bot insiste da un unico IP)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;deny&lt;/span&gt; 74.7.243.204;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="4-messa-in-sicurezza-hardening-di-gitea"&gt;4. Messa in Sicurezza (Hardening) di Gitea
&lt;/h2&gt;&lt;h3 id="a-rendere-gitea-privato-altamente-consigliato"&gt;A. Rendere Gitea Privato (Altamente Consigliato)
&lt;/h3&gt;&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Modifica &lt;code&gt;app.ini&lt;/code&gt; (solitamente in &lt;code&gt;/var/lib/gitea/custom/conf/app.ini&lt;/code&gt;):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;[service]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;REQUIRE_SIGNIN_VIEW&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="b-configurare-il-file-robotstxt"&gt;B. Configurare il file &lt;code&gt;robots.txt&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;Indica ai bot &amp;ldquo;educati&amp;rdquo; quali aree non devono scansionare. Crea il file in &lt;code&gt;custom/public/robots.txt&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;User-agent: *
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Disallow: /*/compare/*
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Disallow: /*/commits/*
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Disallow: /*/archive/*
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Disallow: /api/*
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="c-limitare-le-risorse-di-git"&gt;C. Limitare le risorse di Git
&lt;/h3&gt;&lt;p&gt;Impedisci che una singola richiesta &amp;ldquo;uccida&amp;rdquo; il server impostando dei timeout:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;[git]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;TIMEOUT.DEFAULT&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;60&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;[repository]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;MAX_REVISION_LIMIT&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;100&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="5-protezione-generale-per-altri-servizi"&gt;5. Protezione Generale per altri Servizi
&lt;/h2&gt;&lt;p&gt;Queste regole valgono per qualsiasi servizio esponi (Nextcloud, Home Assistant, ecc.):&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Rate Limiting:&lt;/strong&gt; Configura NPM per limitare il numero di richieste al secondo per IP.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CrowdSec o Fail2Ban:&lt;/strong&gt; Installa un sistema di prevenzione intrusioni che blocca automaticamente gli IP che mostrano comportamenti malevoli.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cloudflare (Opzionale):&lt;/strong&gt; Usa Cloudflare come DNS/Proxy. Offre una &amp;ldquo;Bot Fight Mode&amp;rdquo; gratuita che filtra gran parte di questo traffico prima ancora che raggiunga il tuo server Proxmox.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;Nota di Sicurezza:&lt;/strong&gt; Ricorda sempre di riavviare il servizio Gitea (&lt;code&gt;systemctl restart gitea&lt;/code&gt;) dopo ogni modifica al file &lt;code&gt;app.ini&lt;/code&gt; per rendere effettive le impostazioni.&lt;/p&gt;

 &lt;/blockquote&gt;</description></item></channel></rss>