
Le chiavi API sono il lasciapassare della tua infrastruttura digitale. Se finiscono in mano sbagliata, chi le possiede accede ai tuoi provider AI, svuota i crediti, ruba dati. Il 21 ottobre 2026 il mondo della automazioni AI ha visto due incidenti che ripetono la stessa lezione: LiteLLM (la libreria Python per orchestrare modelli AI) è stata compromessa con una versione malevola che spiava le variabili d'ambiente, e Railway (piattaforma di hosting popolare tra developer) ha subito un accesso ai dati ambientali degli utenti. In entrambi i casi, le chiavi API finivano in chiaro in log e processi accessibili.
Se usi LiteLLM, Railway, oppure semplicemente gestisci chiavi API in progetti di automazioni o agenti AI, questo articolo è per te. Non è una questione di "se", ma di "quando" e di "come prima".
In breve: le chiavi API non vanno mai committa su git, non vanno scritte in file di config in plain text, e non vanno lasciate nei log. Usa un vault per i segreti (Doppler, HashiCorp Vault, il secrets manager del tuo provider), ruota le chiavi periodicamente, monitora l'uso con rate limiting, e segmenta le autorizzazioni: una chiave per un servizio, non una master key per tutto.
Il 21 ottobre è stata rilasciata una versione corrotta di LiteLLM (la 1.107.0) che conteneva del codice malevolo. Questo codice non faceva niente di vistoso nel tuo Python script: non rubava i tuoi dati direttamente. Ma catturava le variabili d'ambiente (environment variables) e le spediva su un server esterno, non autorizzato. In un progetto che usa LiteLLM, le variabili d'ambiente contengono le chiavi API per OpenAI, Claude, Gemini, Stripe, e tutto il resto.
Nello stesso periodo, Railway (che ospita app e progetti) ha avuto un accesso non autorizzato al database interno che memorizza le variabili d'ambiente degli utenti. In altre parole, il suo vault dei segreti è stato esposto. Chi aveva un progetto su Railway con chiavi API dentro le env var (e praticamente tutti le mettono lì) ha rischiato di vederle copiate.
Sono due attacchi diversi sul piano tecnico, ma identici sul piano strategico: entrambi sfruttano il fatto che sviluppatori e aziende mettono le chiavi API dove le variabili d'ambiente finiscono, e poi non le proteggono abbastanza.
Le chiavi API vanno memorizzate da qualche parte. Il posto più comodo è una variabile d'ambiente: la scrivi una volta, il tuo codice la legge, e sembra fatto. Ma le variabili d'ambiente:
ps aux se qualcuno accede al server.Un attacco come quello di LiteLLM sfrutta esattamente questo: il fatto che il codice che gira sul tuo server ha accesso alle variabili d'ambiente, e niente lo impedisce di leggerle e trasmetterle.
La soluzione vera è non mettere mai le chiavi API nelle variabili d'ambiente come plain text, o almeno non lasciarle lì disponibili in chiaro a qualunque cosa gira sul tuo server.
Usi un vault: un servizio (separato dal tuo server di produzione, con accesso controllato e auditato) che memorizza i segreti in forma crittografata e li rilascia solo a chi ha prove di identità valide.
I servizi più comuni sono:
Il flusso è: il tuo codice si autentica verso il vault (con un token o una credenziale specifica per quel servizio), il vault controlla se quello script ha diritto di leggere quella chiave, e se sì la rilascia. Il vault traccia chi ha richiesto cosa e quando. La chiave non finisce mai in una variabile d'ambiente leggibile in chiaro nel tuo processo.
Dopo l'incidente di LiteLLM e Railway, la prima cosa che hanno dovuto fare i developer è stata rigenerare tutte le chiavi API. Perché anche se la chiave è stata rubata il 21 ottobre, tu potrai scoprirlo il 31 ottobre. Nel frattempo, il malintenzionato la usa tutti i giorni.
La rotazione non è una cosa che fai una volta all'anno per compliance. È un'abitudine operativa:
Molti developer non lo fanno perché è noioso: cambiare una chiave vuol dire andare nel dashboard del provider, generare una nuova, aggiornarla nel vault, rideploy dell'app, e verificare che nulla sia rotto. Automatizza il flusso se puoi.
Spesso accade di creare un'unica chiave API "generale" che dà accesso a tutto: OpenAI, Stripe, il database, il file storage. Così è facile da gestire. Ma è anche il peggior errore strategico: se quella chiave viene rubata, il malintenzionato ha il passpartout di tutto il tuo sistema.
Fai il contrario:
Se una chiave viene compromessa, il danno è circoscritto. Inoltre, il malintenzionato non sa quante altre chiavi ci sono o dove le usi.
Proteggi le chiavi, ma anche monitora il loro uso. Se una chiave API riceve 100 richieste al minuto mentre il tuo codice ne fa una al secondo, c'è un problema.
Imposta alert su:
Molti provider (OpenAI, Stripe, Anthropic) offrono questi alert nativamente nel loro dashboard. Leggili.
Se fai vibe coding (usi agenti AI e MCP per automatizzare compiti), il rischio di chiavi esposte è più alto perché l'agente AI ha accesso a molti servizi. Segui ancora più rigorosamente:
L'attacco a LiteLLM è stato un attacco alla supply chain: il codice malevolo non era nel tuo repo, era nel pacchetto npm/pip che importi. Non potevi vederlo nel tuo codice. Solo chi controllava LiteLLM sapeva che stava succedendo.
La lezione: aggiornare le dipendenze non basta. Quando aggiorni, sappi che stai aggiornando; non è automatico. Usa un servizio come Dependabot (Github) o Snyk che ti avvisa quando una dipendenza ha una vulnerabilità nota, e quando la tiri in una versione che non conosci ancora, la quarantena in uno stage environment prima di metterla in produzione.
Se usi un agente AI per gestire il tuo progetto (per esempio un MCP che deploya codice), assicurati che:
.env, config.js, secrets.py e tutto quello che contiene una chiave. Muovi in vault, aggiorna il codice per leggerle dal vault.pip list o npm list e controlla che nessuno dei tuoi pacchetti sia in una versione nota come compromessa. Snyk.io offre un servizio gratuito di scansione.production. Solo il servizio api-server la legge. La rotoliamo il primo lunedì di ogni trimestre.".gitignore per escludere .env e file simili.// API_KEY=sk-12345 come nota. Ripulisci il git history con git filter-branch se è successo.pino o winston con un redactor. In Python, scrivi un logger custom che maschera i token.Doppler parte da gratuito (fino a 50 segreti per un team piccolo), poi 7 $/utente/mese. HashiCorp Vault self-hosted è gratis, ma devi hostarla tu (costo del server). HashiCorp Cloud Platform costa 0.20 $/mille richieste.
Sì, se il tuo progetto è tutto su AWS. Se hai servizi su AWS, Heroku e Vercel, AWS Secrets Manager non reach tutti. Doppler raggiunge ovunque. Valuta in base alla tua architettura.
Sì, se il vault supporta la lettura della versione più recente di una chiave. Aggiorna la chiave nel vault, il tuo codice legge la nuova versione, nessun downtime. Verifica prima in staging.
Se il vault non raggiunge per 30 secondi, il tuo servizio di produzione non può leggere le chiavi e fallisce. Per questo molti usano un cache locale (il vault fornisce la chiave, la app la cachea per 5-10 minuti) oppure un fallback a una chiave backup (meno ideale, ma migliore di un crash).
Se è pubblicata online, servizi come GitGuardian o TruffleHog la trovano e ti avvisano. Se è stata rubata privatamente (come in LiteLLM), lo scopri dal monitoring: spike di richieste, costi anomali. Per questo gli alert sono critici.
Sì, un agente AI (MCP o un custom tool) può autentica al vault e leggere le chiavi che gli servono. L'importante è usare le stesse best practice: segmentazione (chiave limitata per quell'agente), monitoring, audit.
Le chiavi API sono il perimetro di sicurezza della tua infrastruttura. Se sono rubate, il malintenzionato entro in casa tua. Gli incidenti di LiteLLM e Railway il 21 ottobre insegnano una cosa sola: metti un vault fra le chiavi e il mondo, segmenta i permessi, ruota regolarmente, monitora sempre.
Inizia da qui: oggi rigenera le chiavi critiche (OpenAI, Stripe, database). Domani, metti un vault. La settimana prossima, imposta gli alert. Non è una cosa che fai una volta. È un'abitudine che protegge il tuo business ogni giorno.
