Data della scadenza: 06/04/2021

Il 6 aprile 2021 un certificato wildcard TLS è scaduto inaspettatamente. È imbarazzante quando un certificato scade, ma abbiamo pensato che fosse importante condividere qui la nostra storia. Speriamo che altri possano apprendere da questa esperienza e migliorare i propri sistemi. Se tu o la tua organizzazione utilizzate dei sistemi di monitoraggio dei certificati, potrebbe essere un buon promemoria per controllare che non ci siano falle.

Il certificato scaduto era utilizzato per molti servizi interni di Epic. Troppi, a dire la verità. Nonostante i nostri sforzi nel controllare la scadenza dei certificati, non siamo riusciti a coprire del tutto ogni area che li utilizzava. Dopo la scadenza e il rinnovo del certificato, si sono presentati una serie di eventi inaspettati che hanno esteso l'interruzione. In questo articolo potrai trovare più dettagli a riguardo.

Ne hanno risentito alcuni componenti fondamentali come quelli dei nostri sistemi di identificazione e autenticazione che, a loro volta, toccano molti altri servizi del nostro intero ecosistema. Sono stati osservati e riportati i seguenti effetti:

  • Non è stato possibile accedere agli account Epic per qualsiasi prodotto che utilizzava questa forma di autenticazione come, per esempio, Fortnite, Rocket League, Houseparty, gli Epic Online Services o l'Epic Games Store.
  • Disconnessioni dai giochi o dai servizi live su tutte le piattaforme.
  • Non è stato possibile acquistare articoli dal launcher di Epic Games.
  • Comportamenti inaspettati nel launcher di Epic Games, come contenuti che non si caricavano o modalità offline che non funzionava.
  • I siti web dei prodotti e di marketing di Epic Games, compresi i siti di Unreal Engine, non erano disponibili o erano stati degradati.
  • Una serie di problemi con gli strumenti interni che hanno influito sulla capacità degli addetti Epic di risolvere o gestire i problemi.

Questo articolo ha l'obiettivo di fornire degli approfondimenti dettagliati su ciò che è successo, cosa abbiamo imparato e cosa abbiamo intenzione di fare in futuro.


Cos'è successo?


Si sono verificate tre principali sequenze di eventi:

  1. Un certificato scaduto ha causato l'interruzione di una grande quantità di comunicazioni back-end da servizio a servizio e di strumenti di gestione interni.
  2. Un aumento significativo e inaspettato del traffico sul launcher di Epic Games ha causato l'interruzione del servizio per il launcher di Epic Games e le funzionalità di distribuzione dei contenuti.
  3. Come parte di un ridimensionamento automatico è stata impiegata una versione errata del sito web dell'Epic Games Store che ha fatto riferimento ad artefatti e risorse non valide, risultando in un peggioramento nell'esperienza dell'Epic Games Store.

 

1) Il certificato è scaduto

Alle 12:00 UTC del 6 aprile un certificato TLS è scaduto. Questo certificato era utilizzato per una grande quantità di comunicazioni interne nella piattaforma back-end di Epic. Utilizziamo il criptaggio TLS tra i nostri servizi di back-end per chiamate API cross-service e strumenti di gestione interni. Questo certificato serve una zona DNS interna che non è rivolta al pubblico. 

Alle 12:00 UTC il traffico si è effettivamente interrotto tra i sistemi di back-end. Sei minuti dopo, alle 12:06 UTC, l'incidente è stato riportato e abbiamo iniziato a occuparcene. Anche se erano già scattati diversi allarmi, incoraggiamo sempre i nostri collaboratori interni a riportare qualsiasi problema che può avere un impatto su larga scala. Ogni incidente è esaminato dalla squadra per le operazioni in tempo reale che dà il via al processo di gestione dell'incidente. All'arrivo del primo rapporto interno, i nostri strumenti e processi di gestione degli incidenti hanno automaticamente creato un canale Slack e hanno invitato o chiamato le parti interessate.

Alle 12:12 UTC abbiamo confermato che un certificato era scaduto, abbiamo ritenuto che fosse quella la fonte dei problemi e abbiamo dato il via al processo per il rinnovo. Alle 12:37 UTC il certificato è stato riemesso e la versione aggiornata ha iniziato ad attivarsi sui servizi di back-end. Dai cinque ai 15 minuti dopo, i bilanciatori di carico hanno iniziato a impiegare automaticamente il nuovo certificato negli endpoint interni, quindi le chiamate HTTPS da servizio a servizio hanno ricominciato a funzionare insieme alle interfacce di gestione.

La squadra per le operazioni in tempo reale, che aveva inizialmente esaminato l'incidente, lo stava gestendo anche a questo punto, comunicando con i dipendenti e coinvolgendo le persone giuste, e alle 12:38 UTC è stata effettuata una chiamata su Zoom per coordinare coloro che stavano collaborando su Slack. Anche se Slack è un buon strumento per la comunicazione, nelle situazioni urgenti niente batte le comunicazioni audio o video in tempo reale. Per tenere tutti aggiornati, agli stakeholder interni sono stati inviati regolarmente degli aggiornamenti sull'incidente attraverso i nostri sistemi. A questo punto, più di 25 persone stavano affrontando il problema e molti altri osservavano: addetti all'assistenza giocatori, alla community, all'ingegneria e alla produzione per molti dei nostri diversi prodotti e delle varie squadre.

Grafico delle richieste al minuto a un singolo microservizio, con un calo a causa dell'interruzione dovuta alla scadenza del certificato e un aumento al momento del pieno recupero.

 

Fattori che hanno contribuito


Le zone DNS per questa comunicazione da servizio a servizio non erano attivamente controllate dai nostri servizi di monitoraggio dei certificati. È stata una svista da parte nostra. I nostri servizi di monitoraggio dei certificati si basano su interi spazi dei nomi DNS, non su endpoint o certificati individuali, e la configurazione per questa zona interna era mancante. Dopo questo episodio, abbiamo spostato questa zona alla nostra ultima soluzione di monitoraggio che si occupa di questa falla. Prima dell'incidente avevamo anche avviato un progetto per attivare e configurare globalmente AWS Config su tutti i nostri account. Grazie a questa configurazione globale possiamo aggiungere facilmente una regola ad AWS Config che attivi strumenti di difesa in profondità per la scadenza dei certificati

I rinnovi automatici non erano attivati per questo certificato interno e, quando il problema era stato identificato all'inizio di quest'anno, non era stata data priorità al lavoro necessario per attivarli. Utilizziamo sistemi e servizi appropriati per facilitare i rinnovi automatici, ma la migrazione all'implementazione di queste funzionalità non era stata completata prima dell'incidente. Eravamo convinti che i servizi di monitoraggio esistenti ci proteggessero dai pericoli della scadenza dei certificati più di quanto non lo facessero in realtà. Lavoreremo per fare in modo che questo e altri certificati si rinnovino automaticamente. Nel frattempo, abbiamo completato una verifica manuale di tutti i nostri certificati.

Il certificato wildcard da servizio a servizio utilizzato era installato su centinaia di diversi servizi di produzione, ed è per questo che l'impatto è stato così ampio. Utilizziamo ACM (AWS Certificate Manager) di AWS per la gestione di questo certificato e questo ci ha consentito di effettuare rapidamente il rinnovo e di applicare il certificato a centinaia di servizi di produzione nel giro di pochi minuti. Il problema relativo alla scadenza non era legato ad ACM, bensì al modo in cui gestivamo il nostro certificato. Lavoreremo per separare il raggio di azione dei nostri certificati e ciò richiederà l'aggiornamento dei nostri processi per l'utilizzo dei certificati con ACM.

 

2) Notevoli incrementi di traffico relativo al servizio del launcher di Epic Games

Mentre la maggior parte dei servizi ha ripreso immediatamente a funzionare dopo il rinnovo del certificato, i servizi del launcher di Epic Games non erano ancora disponibili.

Alle 12:46 UTC, in seguito all'emissione del certificato, un notevole aumento di richieste ha sovraccaricato il servizio di back-end del launcher di Epic Games, servizio fondamentale per il corretto funzionamento dei client del launcher di Epic Games. L'aumento della quantità di richieste è stato causato da un'imprevista logica di ripetizione dei tentativi dei client, che si verifica solo in situazioni di malfunzionamento. Nonostante il grande lavoro svolto negli anni sulla resilienza del launcher di Epic Games, questa situazione di aumento esponenziale di richieste è risultata imprevista. I limiti di tracciamento delle connessioni dei nostri host sono stati raggiunti e c'è stata una perdita di pacchetti, il che ha reso il ripristino più complicato anche dopo l'aumento al 250% del nostro insieme di applicazioni di back-end. I servizi del launcher di Epic Games hanno subito quindi malfunzionamenti a cascata e una completa interruzione, e il ripristino ha richiesto di limitare il traffico al back-end per poi aumentarlo di nuovo gradualmente innalzando simultaneamente i limiti di tracciamento delle connessioni.

L'enorme quantità di footprinting dei client del launcher di Epic Games stava generando decine di milioni di connessioni al servizio di back-end del launcher di Epic Games e i relativi componenti dei sistemi stavano diminuendo le prestazioni a causa del carico. È stato necessario ridurre il traffico di back-end per poter effettuare il ripristino. Sebbene attrezzati per la gestione di una capacità di picco per questo servizio, non è stato possibile fare fronte al carico di 28 volte superiore che abbiamo osservato all'inizio del disservizio.

Grafico del numero di richieste al minuto al bilanciatore di carico di back-end del launcher di Epic Games. All'inizio, il traffico è cresciuto di 28 volte con un picco finale 40 volte superiore ai valori normali alle 15:12 UTC.


Nel momento in cui la quantità di richieste è stata 28 volte superiore al normale, il numero di connessioni al servizio di back-end del launcher di Epic Games ha esaurito lo spazio disponibile per il tracciamento delle connessioni, generando la perdita di pacchetti e riducendo sostanzialmente la capacità di connessione dei nodi di back-end. Il carico di connessioni di back-end è aumentato fino a 3.200 volte i valori normali. L'aumento di connessioni TCP era notevolmente superiore alla quantità di richieste.

Grafico del numero di nuove connessioni al minuto al bilanciatore di carico di back-end del launcher di Epic Games  con un aumento di 3.200 volte rispetto a un picco normale.

 

Fattori che hanno contribuito


Il certificato TLS scaduto ha creato un'interruzione che ha innescato un comportamento inaspettato nel client del launcher. Le nostre analisi hanno evidenziato che il nostro client stava utilizzando una logica di ripetizione dei tentativi lineare invece del previsto backoff esponenziale. Un ulteriore bug inaspettato ha causato continui e incessanti tentativi di richiesta da parte di milioni di client del launcher di Epic Games in attesa di ricevere una risposta affermativa. Questi due bug nell'intera base di client hanno generato una situazione indesiderata e imprevista relativa alle chiamate. Abbiamo subito un attacco DDoS dai nostri stessi client e ci siamo messi immediatamente al lavoro per risolvere questi bug con un aggiornamento del launcher di Epic Games. 

Un interessante fattore che ha contribuito a questo aspetto della situazione è stata la durata dell'interruzione iniziale. Un tempo di interruzione più elevato porta a una maggiore probabilità che i client utilizzino la logica di ripetizione dei tentativi errata e cerchino di connettersi continuamente al nostro back-end. Se l'interruzione iniziale fosse stata più breve, forse non avremmo superato il numero di richieste continue di connessione da parte dei client necessario per sovraccaricare il sistema; solo un'interruzione così lunga ha evidenziato il problema. La situazione verrà risolta attraverso cambiamenti al sistema di chiamata.

Il nostro allarme relativo al tracciamento delle connessioni non è stato compreso correttamente. Questo allarme si è innescato durante l'incidente al servizio del launcher di Epic Games e, nonostante diversi team siano a conoscenza del suo significato, la descrizione e le segnalazioni non sono state sufficientemente chiare e non era noto che una situazione come questa potesse causare una perdita di pacchetti alle connessioni realizzate da questi host, inclusa la connessione a un cluster Redis interno. È stato un momento di grande pressione per il team che stava analizzando le cause della diminuzione della connettività al cluster Redis. I nostri meccanismi di cache erano annoverati fra le possibili cause. L'analisi ha evidenziato che il tutto era stato causato dalla perdita di pacchetti dovuta al fatto che la tabella di tracciamento delle connessioni era piena, con centinaia di migliaia di connessioni in uso. Abbiamo successivamente aumentato il limite di tracciamento delle connessioni a oltre un  milione per nodo, ma questi aumenti non sono immediati nella nostra infrastruttura e hanno richiesto un certo tempo. Lavoreremo per rendere più chiari i nostri allarmi, indicando le conseguenti difficoltà di rete fino alla risoluzione del problema. 

L'ampliamento ha portato nuovi nodi a raggiungere istantaneamente il limite di tracciamento delle connessioni. Essendo sovraccaricati da connessioni e avendo notevoli perdite di pacchetti, abbiamo dovuto ridurre il traffico complessivo per poi aumentarlo progressivamente. Abbiamo inizialmente tentato con WAF (Web Application Firewall) di AWS di limitare il traffico a un sottoinsieme in ingresso, ma la nostra configurazione non permetteva di limitarlo in maniera sufficiente. Non si è trattato di un problema con WAF di AWS, bensì con il nostro insieme di regole. Abbiamo poi utilizzato i parametri obiettivo del nostro bilanciatore di carico di AWS per ridirigere una parte del traffico e questo, insieme all'aumento dei limiti di tracciamento delle connessioni, ha avuto successo. L'utilizzo di WAF in questa situazione ha ritardato il ripristino dei servizi del launcher di Epic Games, ma non c'è stata responsabilità da parte di AWS. Svilupperemo un processo standard per la riduzione in urgenza del carico in situazioni critiche come questa utilizzando WAF di AWS, parametri obiettivo del bilanciatore di carico e altre tecnologie di AWS.

 

3) Risorse non valide del sito dell'Epic Games Store

Alle 15:12 UTC, dopo il rinnovo del certificato e dopo aver ripristinato i servizi del launcher di Epic Games, abbiamo sbloccato tutti i client che stavano tentando di connettersi all'Epic Games Store. A causa della durata dell'interruzione, il numero di client che stavano richiedendo contenuti all'Epic Games Store era più elevato del normale, con un naturale aumento progressivo. Abbiamo iniziato ad analizzare gli eventuali problemi irrisolti alle 15:30 UTC.

All'inizio tutto sembrava normale, ma poi abbiamo iniziato a ricevere report interni relativi a problemi di layout e a errori nel negozio che siamo riusciti a confermare e riprodurre. Analizzando i dettagli, abbiamo notato che il client web (che consente a un utente su epicgames.com di interagire con il negozio) stava tentando di recuperare un ID risorsa univoco che non era presente nella nostra rete CDN. Abbiamo controllato le versioni dei nostri contenitori distribuiti sulla flotta e confermato che erano tutte uguali. Ma allora, com'era possibile che versioni identiche dell'applicazione restituissero valori statici delle risorse diversi? 

C'era qualcosa che non andava. Era un momento molto confuso poiché essenzialmente molti dei segnali a nostra disposizione (come le versioni distribuite) si erano rivelati falsi. Siamo riusciti a correlare il ridimensionamento del back-end dell'Epic Games Store a un aumento di errori 403 sulla nostra rete CDN, il che ci ha portato ad analizzare i nuovi casi in modo più dettagliato. Dopo aver trasferito tramite cURL il contenuto a livello locale sulle nuove istanze, abbiamo scoperto che il contenuto restituito non era valido. Siamo riusciti a risalire a un push imprevisto del contenitore verso un nuovo flusso di lavoro CI/CD realizzato il giorno prima e, per il resto, del tutto estraneo a ciò che avevamo rilevato fino a quel momento nel corso dell'incidente. Sebbene questa scoperta fosse sorprendente, siamo riusciti a ripristinare rapidamente la versione precedente del contenitore, terminare le istanze non valide e far riprendere il traffico.

Questo problema avrebbe potuto presentarsi durante un qualsiasi forte aumento del flusso di lavoro verificatosi in questo periodo ma, poiché normalmente manteniamo un ampio margine di manovra su tutta la flotta, il problema non è emerso finché non si è verificato un aumento significativo sull'Epic Games Store causato dal traffico del launcher di Epic Games.

 

Fattori che hanno contribuito


L'interruzione causata dal certificato ha generato problemi al launcher di Epic Games che, al momento del ripristino, ha generato una valanga di richieste all'Epic Games Store, provocandone un'espansione dei sistemi. È un comportamento che ci aspettavamo e che è risultato utile.

I segnali e i dati che avevamo ricevuto sullo stato delle versioni del nostro parco applicazioni ci avevano indotto a credere che la distribuzione della nostra flotta fosse uniforme. Abbiamo modificato il nostro schema di controllo delle versioni per evitare di giungere a conclusioni errate in futuro.

Una recente modifica alla pipeline CI/CD per l'Epic Games Store era configurata in modo errato e ha provocato l'aggiornamento imprevisto dell'artefatto dell'applicazione. Questo problema è stato corretto mediante una modifica alla nostra pipeline CI/CD che annulla le modifiche impreviste. La modifica apportata allo schema di controllo delle versioni ci proteggerà se ciò dovesse accadere di nuovo.


Cronologia

  • 12:00 UTC - Il certificato interno è scaduto
  • 12:06 UTC - Segnalato l'incidente e avviata la sua gestione
  • 12:15 UTC - Preparato il primo messaggio ai clienti
  • 12:21 UTC - Confermati più errori di servizio su vasta scala da parte di più team
  • 12:25 UTC - Confermato l'avvio del processo di riemissione del certificato
  • 12:37 UTC - Confermata la riemissione del certificato
  • 12:46 UTC - Confermato il ripristino di alcuni servizi
  • 12:54 UTC - Il monitoraggio delle connessioni rileva un problema del servizio del launcher di Epic Games
  • 13:41 UTC - Riavviati i nodi del servizio del launcher di Epic Games
  • 15:05 UTC - Aumentati i limiti di monitoraggio delle connessioni per il servizio del launcher di Epic Games
  • 15:12 UTC - Primi segnali di ripresa del servizio del launcher di Epic Games
  • 15:34 UTC - Aumenta il servizio web dell'Epic Games Store
  • 15:59 UTC - Prime segnalazioni di risorse mancanti sull'Epic Games Store
  • 16:57 UTC - Scoperto un problema di versioni discordanti del servizio web dell'Epic Games Store
  • 17:22 UTC - Corretta la versione del servizio web dell'Epic Games Store
  • 17:35 UTC - Ripristino completo


Cosa accadrà adesso?

Nelle sezioni precedenti abbiamo descritto gli scenari che hanno causato gli imprevisti e, in ultima analisi, l'interruzione del 6 aprile. Abbiamo già menzionato i fattori che hanno contribuito a creare questa situazione e i passi successivi che ci attendono, ma ecco un riassunto. 

Questi problemi non sono stati determinati da una singola causa principale. Una miriade di fattori, sia tecnologici che organizzativi, hanno contribuito agli eventi che si sono verificati. La portata e la durata dell'interruzione ci hanno aiutato a scoprire non solo bug evidenti nei nostri sistemi, che correggeremo, ma anche presupposti precedentemente indiscussi in alcuni dei nostri processi interni, in particolare quelli che regolano la gestione dei certificati. 

Ci siamo immediatamente messi al lavoro per coprire questa area con il nostro nuovo sistema di monitoraggio dei certificati e abbiamo verificato tutti i certificati esistenti. Ciononostante, daremo uno sguardo più approfondito a eventuali ulteriori lacune nel nostro monitoraggio dei certificati e introdurremo ulteriori misure preventive, come l'aggiunta del monitoraggio di AWS Config per tutti i certificati basati su ACM di AWS. Ci occuperemo anche di ridurre il raggio d'azione dei certificati specifici.

Esamineremo più da vicino gli schemi di chiamata dei client del launcher di Epic Games e correggeremo urgentemente alcuni dei bug che abbiamo identificato in questo ambito, oltre a migliorare la nostra capacità di reagire in situazioni di notevole aumento del traffico. Con l'aumento permanente delle tabelle di monitoraggio delle connessioni per questa flotta, dovremmo essere in grado di gestire una quantità di carichi simile senza gravi perdite di pacchetti. Questo evento può servire da promemoria a chi gestisce flotte su larga scala di controllare i limiti della tabelle di monitoraggio delle connessioni e di preoccuparsi se si utilizza la funzionalità di netfilter. È bene anche ricordarsi di controllare la logica di ripetizione dei tentativi dei client e soprattutto come potrebbero comportarsi in modo aggregato dopo una lunga interruzione.

Per quanto riguarda l'Epic Games Store, abbiamo implementato una correzione che dovrebbe impedire la modifica di un oggetto di applicazione attivo e, nel fare ciò, abbiamo scoperto e corretto un bug nella generazione delle risorse.

Ci auguriamo che questo rapporto sull'incidente abbia fornito ulteriori dettagli su ciò che è accaduto il 6 aprile. Ci auguriamo inoltre che queste informazioni abbiano chiarito ciò che abbiamo appreso e migliorato e possano aiutare altri a evitare problemi simili.


Unisciti a noi!

Questo articolo è stato scritto dal nostro team di tecnici sull'affidabilità con l'enorme supporto da parte di molti altri fantastici team tecnici di Epic.

Ti interessano i problemi di questo tipo? Ti appassionano i giochi e i servizi correlati? Epic è sempre alla ricerca di grandi talenti e assume personale a livello globale e in tutte le aree di competenza. Se vuoi scoprire le posizioni aperte, visita le opportunità di carriera di Epic Games.

Questo articolo ti ha aiutato o l'hai trovato interessante? Faccelo sapere scrivendo a [email protected].