BeyondProd

Questi contenuti sono stati aggiornati a maggio 2024 e rappresentano lo status quo al momento della loro stesura. Le norme e i sistemi di sicurezza di Google possono variare in futuro, grazie al costante miglioramento della protezione per i nostri clienti.

Questo documento descrive in che modo Google implementa la sicurezza nella nostra infrastruttura utilizzando un'architettura cloud-native chiamata BeyondProd. BeyondProd si riferisce ai servizi e ai controlli della nostra infrastruttura che lavorano insieme per proteggere i carichi di lavoro. I carichi di lavoro sono le attività uniche completate da un'applicazione. BeyondProd contribuisce a proteggere i microservizi in esecuzione nel nostro ambiente, comprese le modalità di modifica del codice e di accesso ai dati utente.

Questo documento fa parte di una serie di articoli tecnici che descrivono le tecnologie, ad esempio Chrome Enterprise Premium, che abbiamo sviluppato per contribuire a difendere le piattaforme Google da minacce sofisticate. Chrome Enterprise Premium implementa un'architettura Zero Trust progettata per fornire un accesso sicuro alle piattaforme Google e ai servizi in esecuzione. Come Chrome Enterprise Premium, BeyondProd non si basa su protezioni perimetrali tradizionali come i firewall. BeyondProd aiuta invece a creare la fiducia tra i microservizi utilizzando caratteristiche come la provenienza del codice, le identità dei servizi e l'hardware affidabile. Questa fiducia si estende al software eseguito in Google Cloud e a quello di cui i clienti Google Cloud eseguono il deployment e vi accedono.

Questo documento descrive i vantaggi di BeyondProd, i suoi servizi e i suoi processi e come abbiamo eseguito la migrazione a questa architettura. Per una panoramica della sicurezza dell'infrastruttura, consulta la panoramica sulla progettazione della sicurezza dell'infrastruttura Google.

Introduzione

Le moderne architetture di sicurezza si sono allontanate da un modello di sicurezza tradizionale basato sul perimetro, in cui un firewall protegge il perimetro e tutti gli utenti o i servizi al suo interno sono considerati attendibili.

Oggi gli utenti sono mobili e operano comunemente al di fuori del perimetro di sicurezza tradizionale di un'organizzazione, ad esempio da casa, da un bar o da un aereo. Con Chrome Enterprise Premium, concediamo l'accesso alle risorse aziendali utilizzando più fattori, tra cui l'identità dell'utente, l'identità del dispositivo utilizzato per accedere alla risorsa, l'integrità del dispositivo, indicatori di attendibilità come il comportamento degli utenti e gli elenchi di controllo dell'accesso dell'accesso.

BeyondProd risolve le stesse preoccupazioni per i servizi di produzione di Chrome Enterprise Premium per gli utenti. In un'architettura cloud-native non possiamo semplicemente fare affidamento su un firewall per proteggere la rete di produzione. I microservizi si spostano e vengono distribuiti in diversi ambienti, su host eterogenei e operano a vari livelli di attendibilità e sensibilità. Mentre Chrome Enterprise Premium afferma che la fiducia degli utenti deve dipendere da caratteristiche come lo stato sensibile al contesto dei dispositivi e non la capacità di connettersi alla rete aziendale, BeyondProd afferma che l'attendibilità del servizio deve dipendere da caratteristiche come provenienza del codice, hardware attendibile e identità del servizio, anziché dalla posizione nella rete di produzione, come l'indirizzo IP o il nome host.

Infrastruttura containerizzata

La nostra infrastruttura esegue il deployment dei carichi di lavoro come microservizi in container. I microservizi separano le singole attività che un'applicazione deve eseguire in servizi diversi. Ogni servizio può essere sviluppato e gestito in modo indipendente con API, implementazione, scalabilità e gestione delle quote proprie. I microservizi sono indipendenti, modulari, dinamici e temporanei. Possono essere distribuiti su diversi host, cluster o anche cloud. In un'architettura di microservizi, un carico di lavoro può essere costituito da uno o più microservizi.

In un'infrastruttura containerizzata, il deployment di ogni microservizio viene eseguito come proprio set di container mobili e programmabili. Per gestire questi container internamente, abbiamo sviluppato un sistema di orchestrazione dei container denominato Borg, che esegue il deployment di diversi miliardi di container a settimana. Borg è il sistema unificato di gestione dei container di Google, punto di riferimento per Kubernetes.

I container rendono i carichi di lavoro più semplici ed efficienti da pianificare su più macchine. La pacchettizzazione dei microservizi in container consente di suddividere i carichi di lavoro in unità più piccole e più gestibili per la manutenzione e il rilevamento. Questa architettura scala i carichi di lavoro secondo necessità: se la domanda per un determinato carico di lavoro è elevata, più macchine potrebbero eseguire copie dello stesso container per gestire la scalabilità richiesta del carico di lavoro.

La sicurezza svolge un ruolo fondamentale in ogni evoluzione della nostra architettura. L'obiettivo di questa architettura di microservizi e del processo di sviluppo è affrontare i problemi di sicurezza il prima possibile nel ciclo di vita di sviluppo e deployment (quando la risoluzione dei problemi è meno costosa) in modo standard e coerente. Il risultato finale consente agli sviluppatori di dedicare meno tempo alla sicurezza, ottenendo al contempo risultati più sicuri.

Vantaggi di BeyondProd

BeyondProd offre numerosi vantaggi in termini di automazione e sicurezza all'infrastruttura di Google. I vantaggi includono:

  • Protezione perimetrale della rete: i carichi di lavoro sono isolati dagli attacchi di rete e dal traffico internet non autorizzato. Sebbene l'approccio perimetrale non sia un concetto nuovo, rimane una best practice di sicurezza per le architetture cloud. L'approccio perimetrale consente di proteggere quanta l'infrastruttura possibile dal traffico non autorizzato e da potenziali attacchi da internet, come gli attacchi DoS basati sul volume.
  • Nessuna attendibilità reciproca intrinseca tra i servizi:solo i chiamanti o i servizi autenticati, attendibili e specificamente autorizzati possono accedere a qualsiasi altro servizio. In questo modo i malintenzionati non possono utilizzare codice non attendibile per accedere a un servizio. Se un servizio viene compromesso, questo vantaggio aiuta a impedire all'aggressore di eseguire azioni che gli consentono di espandere la propria copertura. Questa sfiducia reciproca, combinata con controllo dell'accesso granulare, contribuisce a limitare la portata dell'attacco di una compromissione.
  • Macchine attendibili che eseguono codice di provenienza nota: le identità di servizio sono limitate per utilizzare solo codice e configurazioni autorizzati e vengono eseguite solo in ambienti verificati e autorizzati.
  • Applicazione coerente dei criteri tra i vari servizi: un'applicazione coerente dei criteri contribuisce a garantire che le decisioni sull'accesso siano affidabili tra i vari servizi. Ad esempio, puoi creare un'applicazione dei criteri che verifichi le richieste di accesso ai dati utente. Per accedere al servizio, un utente finale autorizzato deve presentare una richiesta convalidata e un amministratore deve fornire una giustificazione aziendale.
  • Implementazione semplice, automatica e standardizzata delle modifiche: le modifiche all'infrastruttura possono essere facilmente esaminate per verificare il loro impatto sulla sicurezza, mentre le patch di sicurezza possono essere implementate con un impatto minimo sulla produzione.
  • Isolamento tra carichi di lavoro che condividono un sistema operativo: la compromissione di un servizio non può influire sulla sicurezza di un altro carico di lavoro in esecuzione sullo stesso host. Questo isolamento aiuta a limitare la portata dell'attacco di una compromissione.
  • Hardware e attestazione attendibili: una radice di attendibilità hardware garantisce che solo il codice noto e autorizzato (dalla modalità firmware alla modalità utente) sia in esecuzione sull'host prima che sia pianificata l'esecuzione di qualsiasi carico di lavoro.

Grazie a questi vantaggi, è possibile eseguire il deployment dei container e dei microservizi in esecuzione all'interno della nostra architettura cloud, comunicare tra loro ed eseguire l'uno accanto all'altro senza compromettere la sicurezza dell'infrastruttura. Inoltre, i singoli sviluppatori di microservizi non sono gravati dai dettagli di sicurezza e implementazione dell'infrastruttura sottostante.

Servizi di sicurezza BeyondProd

Abbiamo progettato e sviluppato diversi servizi di sicurezza BeyondProd per creare i vantaggi descritti in Vantaggi di BeyondProd. Le sezioni seguenti descrivono questi servizi di sicurezza.

Google Front End (GFE) per la protezione perimetrale della rete

Google Front End (GFE) fornisce protezione perimetrale della rete. GFE termina la connessione dall'utente finale e fornisce un punto centrale per l'applicazione delle best practice TLS.

Anche se non ci concentriamo più sulla sicurezza perimetrale, GFE rimane comunque una parte importante della nostra strategia di protezione dei servizi interni dagli attacchi DoS. GFE è il primo punto di accesso per un utente che si connette all'infrastruttura di Google. Dopo che un utente si connette alla nostra infrastruttura, GFE è anche responsabile del bilanciamento del carico e del reindirizzamento del traffico tra le regioni, se necessario. GFE è il proxy perimetrale che instrada il traffico al microservizio corretto.

Le VM dei clienti su Google Cloud non vengono registrate in GFE. Si registrano invece con Cloud Front End, una configurazione speciale di GFE che utilizza lo stack di networking di Compute Engine. Cloud Front End consente alle VM dei clienti di accedere direttamente a un servizio Google utilizzando il proprio indirizzo IP pubblico o privato. Gli indirizzi IP privati sono disponibili solo quando è abilitato l'accesso privato Google.

Application Layer Transport Security per attendibilità tra i servizi

Application Layer Transport Security (ALTS) aiuta a garantire che non esista un'attendibilità reciproca intrinseca tra i servizi. MongoDB viene utilizzato per l'autenticazione delle chiamata di procedura remota (RPC), l'integrità, la crittografia del traffico e le identità dei servizi. ALTS è un sistema di autenticazione reciproca e crittografia di trasporto per i servizi nell'infrastruttura di Google. In generale, le identità sono associate ai servizi invece che a un nome server o a un host specifico. Questa associazione consente una replica perfetta dei microservizi, il bilanciamento del carico e la ripianificazione tra host.

Ogni macchina ha una credenziale ALTS che viene sottoposta a provisioning mediante il sistema di integrità dell'host e può essere decriptata solo se il sistema di integrità dell'host ha verificato che l'avvio protetto è riuscito. La maggior parte dei servizi Google viene eseguita come microservizi su Borg e ognuno di questi microservizi ha la propria identità ALTS. Borg Prime, il controller centralizzato di Borg, concede queste credenziali dei microservizi ALTS ai carichi di lavoro in base all'identità del microservizio. Le credenziali ALTS a livello di macchina costituiscono il canale sicuro per il provisioning delle credenziali dei microservizi, in modo che solo le macchine che hanno superato l'avvio verificato dell'integrità dell'host possano ospitare carichi di lavoro dei microservizi. Per ulteriori informazioni sulle credenziali ALTS, consulta la pagina relativa ai certificati per il carico di lavoro.

Autorizzazione binaria per Borg per la provenienza del codice

Autorizzazione binaria per Borg (BAB) fornisce la verifica della provenienza del codice. BAB è un controllo di applicazione forzata in fase di deployment che aiuta a garantire che il codice soddisfi i requisiti di sicurezza interni prima del deployment del codice. Ad esempio, il controllo di applicazione di BAB include l'assicurazione che le modifiche vengano esaminate da un secondo tecnico prima che il codice venga inviato al nostro repository di codice sorgente e che i file binari siano creati in modo verificabile sull'infrastruttura dedicata. Nella nostra infrastruttura, BAB limita il deployment di microservizi non autorizzati.

Integrità dell'host per l'attendibilità delle macchine

Integrità dell'host verifica l'integrità del software del sistema host tramite un processo di avvio protetto ed è supportato da un chip di sicurezza radice di attendibilità hardware (chiamato Titan), ove supportato. I controlli di integrità dell'host includono la verifica delle firme digitali sul BIOS, sul controller di gestione baseboard (BMC), sul bootloadere sul kernel del sistema operativo. Se supportati, i controlli dell'integrità dell'host possono includere il codice in modalità utente e il firmware delle periferiche (come le NIC). Oltre alla verifica della firma digitale, l'integrità dell'host aiuta a garantire che ogni host stia eseguendo la versione prevista di questi componenti software.

Gestione dell'accesso ai servizi e ticket contestuali per l'utente finale per l'applicazione dei criteri

Gestione dell'accesso ai servizi e ticket contestuali per gli utenti finali contribuiscono a fornire un'applicazione coerente dei criteri in tutti i servizi.

La gestione dell'accesso ai servizi limita la modalità di accesso ai dati tra i servizi. Quando una RPC viene inviata da un servizio all'altro, la gestione dell'accesso ai servizi definisce i criteri di autorizzazione e controllo necessari ai servizi per accedere ai dati del servizio ricevente. Ciò limita la modalità di accesso ai dati, garantisce il livello minimo di accesso necessario e specifica come è possibile controllare questo accesso. Nell'infrastruttura di Google, la gestione dell'accesso ai servizi limita l'accesso di un microservizio ai dati di un altro microservizio e consente analisi globali dei controlli dell'accesso.

I ticket di contesto dell'utente finale vengono emessi da un servizio di autenticazione dell'utente finale e forniscono ai servizi un'identità utente separata dalla loro identità di servizio. Questi ticket sono credenziali protette dall'integrità, emesse centralmente e inoltrabili che attestano l'identità dell'utente finale che ha richiesto il servizio. Questi ticket riducono la necessità di attendibilità tra i servizi, poiché le identità peer che utilizzano ALTS possono essere insufficienti per concedere l'accesso, quando queste decisioni di accesso in genere si basano anche sull'identità dell'utente finale.

Strumenti Borg per l'implementazione automatica delle modifiche e la scalabilità

Gli strumenti di Borg per i deployment blu/verde offrono un'implementazione semplice, automatica e standardizzata delle modifiche. Un deployment blu/verde è un modo per implementare una modifica a un carico di lavoro senza influire sul traffico in entrata, in modo che gli utenti finali non riscontrino alcun tempo di inattività durante l'accesso all'applicazione.

Un job Borg è una singola istanza di un microservizio che esegue una parte di un'applicazione. I job vengono scalati per gestire il carico, con il deployment di nuovi job quando il carico aumenta e i job esistenti terminati quando il carico diminuisce.

Gli strumenti Borg sono responsabili della migrazione dei carichi di lavoro in esecuzione quando eseguiamo le attività di manutenzione. Quando viene eseguito il deployment di un nuovo job Borg, un bilanciatore del carico trasferisce gradualmente il traffico da un job esistente a quello nuovo. Ciò consente di aggiornare un microservizio senza tempi di inattività e senza che l'utente se ne accorga.

Utilizziamo questo strumento anche per applicare upgrade dei servizi quando aggiungiamo nuove funzionalità e per applicare aggiornamenti critici della sicurezza senza tempi di inattività. Per le modifiche che interessano la nostra infrastruttura, utilizziamo la migrazione live delle VM dei clienti per garantire che non ci siano conseguenze sui carichi di lavoro.

Per ulteriori informazioni, vedi Autorizzazione binaria per Borg.

Kernel gVisor per l'isolamento dei carichi di lavoro

Il kernel gVisor consente l'isolamento tra i carichi di lavoro che condividono un sistema operativo. gVisor utilizza un kernel dello spazio utente per intercettare e gestire le chiamate di sistema, riducendo l'interazione con l'host e la potenziale superficie di attacco. Questo kernel fornisce la maggior parte delle funzionalità necessarie per eseguire un'applicazione e limita la superficie del kernel dell'host accessibile all'applicazione. gVisor è uno dei diversi strumenti che utilizziamo per isolare i carichi di lavoro interni e i carichi di lavoro dei clienti Google Cloud eseguiti sullo stesso host. Per ulteriori informazioni su altri strumenti di sandbox, consulta la pagina Limitazione tramite sandbox del codice.

Protezione dei dati utente con BeyondProd

Questa sezione descrive come i servizi BeyondProd interagiscono per contribuire a proteggere i dati utente nella nostra infrastruttura. Le sezioni seguenti descrivono due esempi:

  • Accesso alle richieste di dati degli utenti dalla loro creazione alla consegna a destinazione.
  • Una modifica del codice dallo sviluppo alla produzione.

Non tutte le tecnologie elencate vengono utilizzate in tutte le parti della nostra infrastruttura; ciò dipende dai servizi e dai carichi di lavoro.

Accesso ai dati utente

Il diagramma seguente mostra la procedura utilizzata dalla nostra infrastruttura per verificare che un utente sia autorizzato ad accedere ai dati utente.

Controlli di sicurezza cloud-native di Google che accedono ai dati utente.

Per accedere agli account utente:

  1. Un utente invia una richiesta a GFE.
  2. Il GFE termina la connessione TLS e inoltra la richiesta al frontend del servizio appropriato utilizzando ALTS.
  3. Il frontend dell'applicazione autentica la richiesta dell'utente utilizzando un servizio di autenticazione centrale dell'utente finale (EUA) e, in caso di esito positivo, riceve un ticket di contesto crittografico di breve durata dell'utente finale.
  4. Il frontend dell'applicazione invia una RPC tramite ALTS a un servizio di backend di archiviazione, inoltrando il ticket nella richiesta di backend.
  5. Il servizio di backend utilizza la gestione dell'accesso ai servizi per garantire che i seguenti criteri siano soddisfatti:
    • Il frontend viene autenticato utilizzando un certificato valido e non revocato. Questo controllo implica che è in esecuzione su un host attendibile e i controlli BAB sono andati a buon fine.
    • L'identità ALTS del servizio frontend è autorizzata a inviare richieste al servizio di backend e a presentare un ticket EUC.
    • Il ticket contestuale dell'utente finale è valido.
    • L'utente nel ticket EUC è autorizzato ad accedere ai dati richiesti.

Se uno di questi controlli ha esito negativo, la richiesta viene rifiutata.

Se questi controlli vengono superati, i dati vengono restituiti al frontend dell'applicazione autorizzata e forniti all'utente autorizzato.

In molti casi, esiste una catena di chiamate di backend e ogni servizio intermedio esegue un controllo di accesso al servizio sulle RPC in entrata e il ticket viene inoltrato sulle RPC in uscita.

Per ulteriori informazioni su come viene instradato il traffico all'interno della nostra infrastruttura, vedi In che modo viene instradato il traffico.

Esecuzione di una modifica al codice

Il diagramma seguente mostra come viene eseguito il deployment di una modifica al codice.

Come vengono apportate le modifiche al codice.

Per apportare una modifica al codice, procedi nel seguente modo:

  1. Uno sviluppatore apporta una modifica a un microservizio protetto da BAB. La modifica viene inviata al nostro repository centrale di codice, che applica la revisione del codice. Dopo l'approvazione, la modifica viene inviata al sistema di build centrale affidabile che produce un pacchetto con un certificato del manifest della build verificabile firmato.

  2. Al momento del deployment, BAB verifica che il processo sia stato seguito convalidando il certificato firmato dalla pipeline di build.

  3. Borg gestisce tutti gli aggiornamenti dei carichi di lavoro utilizzando un modello di affidabilità che garantisce interruzioni minime ai servizi, che si tratti di un'implementazione di routine o di una patch di sicurezza di emergenza.

  4. GFE trasferisce il traffico al nuovo deployment utilizzando il bilanciamento del carico per garantire la continuità delle operazioni.

Per ulteriori informazioni su questo processo, vedi Il nostro processo di sviluppo e produzione.

Tutti i carichi di lavoro devono essere isolati. Se il carico di lavoro è meno affidabile perché il codice sorgente proviene dall'esterno di Google, il deployment potrebbe essere eseguito in un ambiente protetto da gVisor oppure utilizzare altri livelli di isolamento. Questo isolamento aiuta a contenere un avversario che riesce a compromettere un'applicazione.

Implicazioni per la sicurezza cloud-native

Le sezioni seguenti forniscono un confronto tra gli aspetti della sicurezza dell'infrastruttura tradizionale e i relativi contrappunti in un'architettura cloud-native.

Architettura dell'applicazione

Un modello di sicurezza più tradizionale, incentrato sulla sicurezza perimetrale, non è in grado di proteggere da solo un'architettura cloud-native. Tradizionalmente, le applicazioni monolitiche utilizzavano un'architettura a tre livelli e dovevano eseguire il deployment in data center aziendali privati, dotati di capacità sufficiente per gestire i picchi di carico per gli eventi critici. Applicazioni con requisiti di rete o hardware specifici sono state implementate specificatamente su macchine specifiche che in genere mantengono indirizzi IP fissi. Le implementazioni erano poco frequenti, grandi e difficili da coordinare, poiché le modifiche risultanti interessavano contemporaneamente molte parti dell'applicazione. Ciò portava a applicazioni dalla durata molto lunga che vengono aggiornate con minore frequenza e dove le patch di sicurezza vengono generalmente applicate con minore frequenza.

Tuttavia, in un modello cloud-native, le applicazioni devono essere portabili tra diversi ambienti, perché possono essere eseguite in cloud pubblici, data center privati o servizi ospitati di terze parti. Di conseguenza, anziché un'applicazione monolitica, un'applicazione containerizzata divisa in microservizi diventa ideale per gli ambienti cloud. I container disaccoppiano i programmi binari necessari per l'applicazione dal sistema operativo host sottostante e rendono le applicazioni più portabili. I nostri container sono immutabili, ovvero non cambiano dopo il deployment. Vengono invece ricreate e distribuite di frequente.

Con i container che vengono riavviati, arrestati o ripianificati spesso, il riutilizzo e la condivisione di hardware e networking sono più frequenti. Grazie a un processo di creazione e distribuzione standardizzato, il processo di sviluppo è più coerente e uniforme tra i team, anche se i team gestiscono lo sviluppo dei microservizi in modo indipendente. Di conseguenza, le considerazioni sulla sicurezza (come le revisioni della sicurezza, la scansione del codice e la gestione delle vulnerabilità) possono essere affrontate nelle prime fasi dei cicli di sviluppo.

Mesh di servizi

Creando un'infrastruttura condivisa e progettata in modo sicuro, utilizzata da tutti gli sviluppatori, l'onere per gli sviluppatori di conoscere e implementare requisiti di sicurezza comuni è ridotto al minimo. La funzionalità di sicurezza dovrebbe richiedere un'integrazione minima o nulla in ogni applicazione e viene invece fornita come un'infrastruttura che avvolge e collega tutti i microservizi. Viene comunemente chiamato mesh di servizi. Ciò significa anche che la sicurezza può essere gestita e implementata separatamente dalle normali attività di sviluppo o deployment.

Un mesh di servizi è un'infrastruttura condivisa a livello dell'infrastruttura che avvolge e collega tutti i microservizi. Un mesh di servizi consente la comunicazione tra servizi, che può controllare il traffico, applicare criteri e fornire un monitoraggio centralizzato per le chiamate ai servizi.

Sicurezza Zero Trust

In un modello di sicurezza tradizionale che utilizza data center privati, le applicazioni di un'organizzazione dipendono da un firewall per contribuire a proteggere i carichi di lavoro da minacce esterne basate sulla rete.

Con un modello di sicurezza Zero Trust, le decisioni di autorizzazione non dipendono dai firewall. Altri controlli, come l'identità, l'autenticazione e l'autorizzazione dei carichi di lavoro, aiutano a proteggere i microservizi assicurando che le connessioni interne o esterne vengano convalidate prima che possano eseguire transazioni. Eliminando la dipendenza dai firewall o dai controlli basati su rete, puoi implementare la segmentazione a livello di microservizi, senza attendibilità intrinseca tra i servizi. Con la segmentazione a livello di microservizi, il traffico può avere diversi livelli di attendibilità con controlli diversi e non occorre più confrontare solo il traffico interno con quello esterno.

Requisiti di sicurezza condivisi integrati negli stack di servizi

In un modello di sicurezza tradizionale, le singole applicazioni sono responsabili del rispetto dei propri requisiti di sicurezza, indipendentemente dagli altri servizi. Tali requisiti includono la gestione delle identità, la terminazione TLS e la gestione dell'accesso ai dati. Questo può portare a implementazioni incoerenti o a problemi di sicurezza non risolti, poiché questi problemi devono essere risolti in molte posizioni, il che rende più difficile l'applicazione delle correzioni.

In un'architettura cloud-native, i componenti vengono riutilizzati molto più spesso tra i servizi. I punti di passaggio consentono un'applicazione coerente dei criteri in tutti i servizi. È possibile applicare criteri diversi utilizzando servizi di sicurezza diversi. Anziché richiedere che ogni applicazione implementi i servizi di sicurezza critici separatamente, puoi suddividere i vari criteri in microservizi separati. Ad esempio, puoi creare un criterio per garantire l'accesso autorizzato ai dati utente e creare un altro criterio per garantire l'utilizzo di suite di crittografia TLS aggiornate.

Processi standardizzati con implementazioni più frequenti

In un modello di sicurezza tradizionale, i servizi condivisi sono limitati e il codice è spesso duplicato e associato allo sviluppo locale. La condivisione limitata rende più difficile determinare l'impatto di una modifica e il modo in cui la modifica potrebbe influenzare molte parti di un'applicazione. Di conseguenza, le implementazioni sono poco frequenti e difficili da coordinare. Per apportare una modifica, gli sviluppatori potrebbero dover aggiornare direttamente ogni componente (ad esempio, aprendo connessioni SSH a ogni macchina virtuale per aggiornare una configurazione). Nel complesso, questo può portare le applicazioni a lunghissima durata.

Dal punto di vista della sicurezza, poiché il codice viene spesso duplicato, è più difficile da rivedere e ancora più difficile garantire che la correzione di una vulnerabilità venga applicata ovunque.

In un'architettura cloud-native, le implementazioni sono frequenti e standardizzate. Questo processo consente alla sicurezza di spostarsi verso sinistra nel ciclo di vita dello sviluppo del software. Spostarsi verso sinistra significa spostare passaggi più avanti nel ciclo di vita di sviluppo del software, che possono includere passaggi come il codice, la creazione, il test, la convalida e il deployment. Il passaggio a sinistra consente un'applicazione più semplice e coerente della sicurezza, compresa la regolare applicazione delle patch di sicurezza.

Il passaggio a BeyondProd

La transizione di Google a BeyondProd ha richiesto modifiche in due aree principali: nell'infrastruttura e nel processo di sviluppo. Abbiamo affrontato queste modifiche contemporaneamente, ma puoi affrontarle in modo indipendente se vuoi configurare qualcosa di simile nel tuo ambiente.

Modifica della nostra infrastruttura

Il nostro obiettivo è automatizzare la sicurezza in tutta la nostra infrastruttura, perché riteniamo che la sicurezza debba essere scalata allo stesso modo in cui scalano i servizi. I servizi devono essere sicuri per impostazione predefinita e non sicuri solo dopo che è stata presa una decisione esplicita di accettare i rischi. Gli interventi umani diretti sulla nostra infrastruttura devono essere un'eccezione, non una routine, e gli interventi devono essere verificabili quando vengono effettuati. Possiamo quindi autenticare un servizio in base al codice e alla configurazione di cui è stato eseguito il deployment, anziché in base alle persone che lo hanno eseguito.

Abbiamo iniziato dalla costruzione di solide fondamenta di identificazione, autenticazione e autorizzazione dei servizi. Un microservizio utilizza un'identità di servizio per autenticarsi presso altri servizi in esecuzione nell'infrastruttura. Possedendo una base di identità di servizio affidabili, siamo in grado di implementare funzionalità di sicurezza di livello superiore che dipendono dalla convalida di queste identità di servizio, come la gestione degli accessi ai servizi e i ticket di contesto per l'utente finale. Per semplificare questa transizione per i servizi nuovi ed esistenti, per prima cosa abbiamo fornito ALTS come libreria con un singolo daemon helper. Questo daemon veniva eseguito sull'host chiamato da ogni servizio e, nel tempo, si è evoluto in una libreria che utilizza le credenziali di servizio. La libreria AltS è stata integrata perfettamente nella libreria RPC di base. Questa integrazione ha reso più facile un'ampia adozione, senza oneri significativi sui singoli team di sviluppo. L'implementazione di un protocollo di accesso al servizio è stata un prerequisito per l'implementazione della gestione dell'accesso ai servizi e dei ticket di contesto per gli utenti finali.

Modifica dei nostri processi di sviluppo

Per Google era fondamentale stabilire un processo solido di compilazione e revisione del codice per garantire l'integrità dei servizi in esecuzione. Abbiamo creato un processo di compilazione centrale in cui potevamo iniziare ad applicare requisiti quali la revisione del codice da parte di due persone e i test automatici in fase di creazione e deployment. (Vedi Autorizzazione binaria per Borg per maggiori dettagli sul deployment.)

Una volta definite le basi, abbiamo iniziato a occuparci della necessità di eseguire codice esterno non attendibile nei nostri ambienti. Per raggiungere questo obiettivo, abbiamo avviato la limitazione tramite sandbox, prima con ptrace, poi utilizzando gVisor. Analogamente, i deployment blu/verde hanno fornito vantaggi significativi in termini di sicurezza (ad esempio, applicazione di patch) e affidabilità.

Abbiamo presto scoperto che era più semplice se un servizio cominciava registrando le violazioni delle norme invece di bloccarle. Il vantaggio di questo approccio è stato duplice:

  • Ha dato ai proprietari dei servizi la possibilità di testare la modifica e valutare l'eventuale impatto che il passaggio a un ambiente cloud-native avrebbe sul loro servizio.
  • Ci ha permesso di correggere eventuali bug e identificare eventuali funzionalità aggiuntive di cui potremmo aver bisogno per fornire ai team dell'assistenza.

Ad esempio, durante l'onboarding di un servizio in BAB, i proprietari del servizio abilitano la modalità di solo controllo. Tale modalità consente di identificare codice o carichi di lavoro che non soddisfano i requisiti. Dopo aver risolto i problemi segnalati dalla modalità di solo controllo, i proprietari dei servizi passano alla modalità di applicazione forzata. In gVisor, questa operazione è stata eseguita partendo dalla limitazione tramite sandbox dei carichi di lavoro, anche in presenza di problemi di compatibilità con le funzioni sandbox, procedendo quindi a risolvere sistematicamente questi problemi per migliorare la capacità di limitazione.

Passaggi successivi