Collega le funzionalità di sicurezza

Questo documento illustra le misure di sicurezza integrate in Connect.

Un'efficace piattaforma ibrida e multi-cloud offre gestione centralizzata, osservabilità e accesso ai servizi in più ambienti. GKE Enterprise fornisce un'esperienza uniforme e completa in tutte queste funzionalità, a prescindere dal provider Kubernetes che utilizzi. Connect è un agente leggero che fornisce quanto segue nelle economie di scala e tra provider:

  • Gestione multi-cluster e visibilità dei cluster
  • Deployment dei servizi delle applicazioni e gestione del ciclo di vita

Questo documento tratta i seguenti argomenti:

  • In che modo la progettazione di Connect mette la sicurezza al primo posto
  • Best practice per il deployment dell'agente Connect
  • Come migliorare la strategia di sicurezza del deployment Kubernetes

Architettura di Connect

Connect consente agli utenti finali e ai servizi Google Cloud di accedere a server API Kubernetes che non sono sulla rete internet pubblica. L'agente Connect viene eseguito nel cluster Kubernetes (un agente per cluster) e si connette a un proxy Connect. I servizi Google Cloud che devono interagire con il cluster Kubernetes si connettono al proxy, che inoltra le richieste all'agente. L'agente, a sua volta, li inoltra al server API Kubernetes, come illustrato nel diagramma seguente.

Architettura di come gli utenti accedono ai server API Kubernetes che non sono su internet (fai clic per ingrandire)
Architettura del modo in cui gli utenti accedono ai server API Kubernetes che non sono su internet (fai clic per ingrandire)

Quando viene eseguito il deployment, l'agente stabilisce una connessione TLS 1.2 o superiore permanente a Google Cloud per attendere le richieste. Se abilitati dagli amministratori, i servizi Google Cloud possono generare richieste per i tuoi cluster Kubernetes. Queste richieste possono anche provenire dall'interazione diretta dell'utente con la console Google Cloud, Connect Gateway o altri servizi Google.

Il servizio Google Cloud invia la richiesta al proxy. Il proxy inoltra la richiesta all'agente di cui è stato eseguito il deployment responsabile di un cluster e, infine, inoltra la richiesta al server API Kubernetes. Il server API Kubernetes applica i criteri di autenticazione, autorizzazione e audit logging di Kubernetes e restituisce una risposta. La risposta viene trasmessa tramite l'agente e il proxy al servizio Google Cloud. In ogni passaggio del processo, i componenti eseguono l'autenticazione e l'autorizzazione per connessione e per richiesta.

Il server API Kubernetes applica gli stessi criteri di autenticazione, autorizzazione e audit logging a tutte le richieste, incluse quelle tramite Connect. Questo processo garantisce di avere sempre il controllo dell'accesso al cluster.

Connessione e difesa in profondità

La difesa in profondità è intrinseca di tutto ciò che fa Google Cloud all'interno della sua infrastruttura e delle sue pratiche di sicurezza. Adottiamo un approccio a più livelli per proteggere la nostra organizzazione e i nostri clienti, proteggendo dati, informazioni e utenti importanti. Questo è lo stesso principio con cui abbiamo progettato Connect.

Oltre alla strategia e al design di difesa in profondità di Google, dovresti valutare i contenuti qui forniti, nonché il tuo livello e i tuoi standard di sicurezza. Questa sezione descrive le misure aggiuntive che puoi adottare a complemento delle best practice per la protezione avanzata di Kubernetes.

Sicurezza da componente a componente

Ogni componente di una richiesta di connessione autentica i propri peer e condivide i dati solo con peer autenticati e autorizzati per questi dati, come illustrato nel diagramma seguente.

Architettura dell'autenticazione dei componenti di Connect (fai clic per ingrandire)
Architettura delle modalità di autenticazione dei componenti di Connect (fai clic per ingrandire)

Ogni componente di una richiesta di connessione utilizza quanto segue per autenticarsi a vicenda:

Ogni componente di una richiesta di connessione utilizza quanto segue per autorizzarsi a vicenda:

  • Identity and Access Management (IAM)
  • Liste consentite

Ogni connessione tra il cluster Kubernetes e Google Cloud è crittografata e almeno un peer di ogni connessione utilizza l'autenticazione basata su certificati. Questo processo garantisce che tutte le credenziali dei token siano criptate in transito e ricevute solo da peer autenticati e autorizzati.

Autenticazione degli utenti in Google Cloud

Quando utilizzano la console Google Cloud, gli utenti vengono sottoposti al flusso di accesso standard di Google. Google Cloud fornisce un certificato TLS che il browser dell'utente autentica e l'utente accede a un account Google Cloud o Google Workspace per eseguire l'autenticazione in Google Cloud.

L'accesso a un progetto tramite la console Google Cloud o altre API è controllato dalle autorizzazioni IAM.

Autenticazione da servizio a servizio di Google Cloud

Google Cloud utilizza ALTS per l'autenticazione interna da servizio a servizio. ALTS consente ai servizi Google Cloud, ad esempio il proxy, di creare una connessione autenticata e protetta dall'integrità.

I servizi Google Cloud devono essere autorizzati internamente all'utilizzo del proxy per la connessione a un'istanza Connect remota perché il proxy utilizza una lista consentita di identità di servizio per limitare l'accesso.

Autenticazione Google Cloud

L'agente utilizza TLS per autenticare e criptare ogni connessione. L'agente autentica i certificati TLS di Google Cloud utilizzando un set di certificati radice integrati nel file binario, per evitare di considerare attendibili inavvertitamente i certificati aggiunti al container dell'agente. L'agente esegue solo chiamate API con endpoint autenticati correttamente. Questo processo aiuta a garantire che i certificati degli account di servizio e le richieste API di Kubernetes vengano inviati da Google Cloud e che le risposte vengano inviate solo a Google Cloud.

Per l'elenco dei domini con cui l'agente comunica durante il normale funzionamento, vedi Assicurare la connettività di rete.

Puoi configurare l'agente in modo che si connetta a Google Cloud tramite un proxy HTTP. In questa configurazione, l'agente utilizza HTTP/1.1 CONNECT sul proxy HTTP e stabilisce una connessione TLS a Google Cloud. Il proxy HTTP vede solo il traffico criptato tra l'agente e Google Cloud. L'integrità e la sicurezza end-to-end della connessione tra l'agente e Google Cloud non sono interessate.

Autenticazione dell'agente

L'agente esegue l'autenticazione in Google Cloud utilizzando un account di servizio Google Cloud creato da te. Quando l'amministratore del cluster esegue il deployment dell'agente, fornisce una chiave privata per questo account di servizio e si assume la responsabilità della privacy della chiave. Quando l'agente si connette a Google Cloud, esegue l'autenticazione con questo account di servizio e chiede di ricevere le richieste per il suo progetto configurato.

Google Cloud autentica le credenziali dell'account di servizio e verifica inoltre che l'account di servizio Google Cloud disponga dell'autorizzazione IAM gkehub.endpoints.connect nel progetto. In genere questa autorizzazione viene concessa tramite il ruolo gkehub.connect. Senza questa autorizzazione, la richiesta dell'agente viene rifiutata e l'agente non può ricevere richieste da Google Cloud.

Server API Kubernetes

L'agente utilizza la libreria client Kubernetes per creare una connessione TLS al server API Kubernetes. Il runtime Kubernetes fornisce al container dell'agente un certificato dell'autorità di certificazione TLS (CA) che l'agente utilizza per autenticare il server API.

Il server API autentica ogni richiesta separatamente, come descritto nella sezione successiva.

Richiedi sicurezza

Ogni richiesta inviata da Google Cloud tramite Connect include le credenziali che identificano il mittente della richiesta: sia il servizio Google Cloud che ha generato la richiesta e, se applicabile, l'utente finale per cui viene inviata la richiesta. Queste credenziali consentono al server API Kubernetes di fornire controlli di autorizzazione e controllo per ogni richiesta.

Autenticazione service-to-agent

Ogni richiesta inviata all'agente include un token di breve durata che identifica il servizio Google Cloud che ha inviato la richiesta, come illustrato nel seguente schema.

Architettura delle richieste con un token che identifica i servizi Google Cloud (fai clic per ingrandire)
Architettura delle richieste con un token che identifica i servizi Google Cloud (fai clic per ingrandire)

Il token è firmato da un account di servizio Google Cloud associato esclusivamente al servizio Google Cloud. L'agente recupera le chiavi pubbliche dell'account di servizio per convalidare il token. Questo token non viene inoltrato al server API.

L'agente convalida i certificati Google Cloud utilizzando le radici CA incorporate nel programma binario. Questo processo aiuta a garantire che riceva richieste autentiche e inalterate da Google Cloud.

Autenticazione dell'utente finale

I servizi Google Cloud che accedono ai cluster per conto di un utente richiedono le credenziali dell'utente per eseguire l'autenticazione sul server API, come illustrato nel diagramma seguente.

Architettura dei servizi Google Cloud che autenticano le credenziali di un utente (fai clic per ingrandire)
Architettura dei servizi Google Cloud che autenticano le credenziali di un utente (fai clic per ingrandire)

Questo criterio consente di assicurare che all'utente venga applicato lo stesso insieme di autorizzazioni quando accede tramite Connect. Alcuni servizi Google Cloud si autenticano al server API per conto di un utente. Ad esempio, un utente può accedere alla console Google Cloud per visualizzare i carichi di lavoro nei cluster registrati nel parco risorse. Quando un utente accede a questi servizi, fornisce le credenziali riconosciute dal server API Kubernetes: qualsiasi token supportato dal server API Kubernetes.

La console Google Cloud archivia queste credenziali come parte del profilo di un utente. Queste credenziali vengono criptate at-rest, sono accessibili solo con le credenziali Google Cloud o Google Workspace dell'utente e vengono utilizzate solo per le connessioni tramite Connect. Non è possibile scaricare di nuovo queste credenziali. Le credenziali vengono eliminate quando l'utente si disconnette dal cluster, quando la registrazione del cluster viene eliminata in Google Cloud, quando il progetto viene eliminato o quando l'account utente viene eliminato. Per ulteriori informazioni, consulta Eliminazione dei dati su Google Cloud.

Quando un utente interagisce con la console Google Cloud, vengono generate richieste per il server API Kubernetes. Il servizio invia le credenziali dell'utente insieme alla richiesta tramite Connect. L'agente presenta poi la richiesta e le credenziali al server API Kubernetes.

Il server API Kubernetes autentica le credenziali dell'utente, esegue l'autorizzazione sull'identità dell'utente, produce un evento di controllo per l'azione (se configurato) e restituisce il risultato. Poiché le credenziali fornite dall'utente vengono utilizzate per autenticare la richiesta, il server API Kubernetes applica per le richieste Connect lo stesso criterio di autorizzazione e controllo utilizzato per le altre richieste.

Autenticazione Service-to-Kubernetes

I servizi Google Cloud che accedono al server API Kubernetes all'esterno del contesto di un utente utilizzano la rappresentazione di Kubernetes per eseguire l'autenticazione con il server API Kubernetes. Questo metodo consente al server API Kubernetes di fornire controlli di autorizzazione e audit logging in base al servizio, come illustrato nel diagramma seguente.

Architettura dei controlli di autorizzazione per servizio (fai clic per ingrandire)
Architettura dei controlli di autorizzazione per servizio (fai clic per ingrandire)

I servizi di Google Cloud possono usare Connect al di fuori del contesto dell'utente. Ad esempio, un servizio Ingress multi-cluster può sincronizzare automaticamente le risorse in entrata nei cluster. Questi servizi non dispongono di credenziali che il server API Kubernetes può autenticare: la maggior parte dei server API non è configurata per autenticare le credenziali del servizio Google Cloud. Tuttavia, un server API può delegare privilegi di autenticazione limitati a un altro servizio tramite il furto d'identità e l'agente può autenticare i servizi Google Cloud inviando richieste tramite Connect. Insieme, questi consentono alle richieste tramite l'agente di autenticarsi come account di servizio Google Cloud.

Quando un servizio Google Cloud invia una richiesta per proprio conto (anziché nel contesto di un utente), l'agente aggiunge alla richiesta le credenziali Kubernetes e le intestazioni di rappresentazione Kubernetes che identificano il servizio Google Cloud. Le intestazioni di rappresentazione rivendicano un nome utente dell'account di servizio Google Cloud autenticato dall'agente.

Il server API Kubernetes autentica le credenziali dell'agente e verifica anche che l'agente possa rubare l'account di servizio Google Cloud. La capacità di impersonare è in genere controllata dalle regole di controllo dell'accesso basato sui ruoli (RBAC) e può essere limitata a identità specifiche, ad esempio gli account di servizio Google Cloud.

Se l'agente è autorizzato a impersonare l'identità richiesta, il server API esegue i controlli di autorizzazione per l'account di servizio Google Cloud e gestisce la richiesta. Il log di controllo della richiesta include sia l'identità dell'agente sia l'account di servizio Google Cloud impersonato.

Sicurezza nel cluster

L'agente invia infine le richieste API Kubernetes al server API Kubernetes, come illustrato nel diagramma seguente.

Architettura delle richieste API Kubernetes inviate al server API Kubernetes (fai clic per ingrandire)
Architettura delle richieste API Kubernetes inviate al server API Kubernetes (fai clic per ingrandire)

Il server API Kubernetes autentica, autorizza ed esegue l'audit log di queste richieste, proprio come per tutte le altre richieste che gestisce.

Come proxy per queste richieste, l'agente ha accesso a dati sensibili come credenziali, richieste e risposte. Kubernetes e l'ecosistema Kubernetes forniscono una serie di strumenti per impedire ad altri attori di ottenere questo accesso e per contribuire a garantire che l'agente acceda solo a ciò che dovrebbe.

Autenticazione Kubernetes

Il server API Kubernetes autentica il mittente di ogni richiesta in entrata per determinare quali autorizzazioni applicare nella fase di autorizzazione. Come descritto in precedenza, la richiesta include le credenziali di un utente o le intestazioni di rappresentazione e le credenziali Kubernetes dell'agente.

Gli amministratori del cluster mantengono il controllo dei meccanismi di autenticazione riconosciuti dal server API Kubernetes. Gli amministratori potrebbero essere in grado di revocare le credenziali di un utente e di revocare o ridurre i privilegi delle credenziali dell'agente.

Autorizzazione Kubernetes

Il server API Kubernetes verifica che l'identità autenticata possa eseguire l'azione richiesta sulla risorsa richiesta.

L'amministratore del cluster può utilizzare uno qualsiasi dei meccanismi di autorizzazione di Kubernetes per configurare le regole di autorizzazione. Connect non esegue alcun controllo di autorizzazione per conto del cluster.

Sicurezza degli agenti

L'agente ha accesso alle proprie credenziali (Kubernetes e Google Cloud), nonché alle credenziali, alle richieste e alle risposte che le passano. Di conseguenza, l'agente occupa una posizione attendibile in un cluster connesso.

L'agente è stato progettato con i seguenti elementi fondamentali sulla sicurezza:

  • L'agente è scritto in Go, che fornisce la gestione della memoria garbage-collected e impedisce molte operazioni non sicure.
  • Il deployment dell'agente viene eseguito in un'immagine container distroless. L'immagine dell'agente non include una shell, libc o altro codice estraneo al percorso di esecuzione dell'agente.
  • L'immagine dell'agente è creata dall'infrastruttura di build condivisa di Google a partire dal codice registrato. Solo questo sistema di compilazione può eseguire il deployment delle immagini agente in Container Registry. Gli sviluppatori Google Cloud non possono eseguire il deployment di nuove immagini autonomamente. Questo processo consente di garantire che tutte le modifiche apportate alla fonte dell'agente possano essere ricondotte a un autore e a un revisore, in modo che non vengano respinte.

L'agente viene eseguito come deployment standard in un cluster Kubernetes di cui viene eseguito il deployment al momento della registrazione del cluster. Di conseguenza, tutte le opzioni e le best practice disponibili per il monitoraggio e la protezione dei deployment, ReplicaSets e dei pod sono disponibili per l'agente.

Questi meccanismi sono progettati in modo da rendere difficile la compromissione del container dell'agente. Tuttavia, l'accesso con privilegi al nodo dell'agente può comunque compromettere l'ambiente dell'agente; pertanto, è importante che gli amministratori seguano le linee guida di sicurezza standard di Kubernetes per proteggere l'infrastruttura del cluster.

Sicurezza dei dati con i Controlli di servizio VPC

I Controlli di servizio VPC forniscono un ulteriore livello di difesa della sicurezza per i servizi Google Cloud, indipendente da Identity and Access Management (IAM). Sebbene IAM consenta un controllo dell'accesso basato sull'identità granulare, i Controlli di servizio VPC offrono una sicurezza perimetrale basata sul contesto più ampia, tra cui il controllo del traffico in uscita dai dati lungo il perimetro. Ad esempio, puoi specificare che solo determinati progetti possano accedere ai tuoi dati BigQuery. Per saperne di più su come i Controlli di servizio VPC proteggono i tuoi dati, consulta la Panoramica sui Controlli di servizio VPC.

Puoi utilizzare Controlli di servizio VPC con Connect per una maggiore sicurezza dei dati, dopo aver verificato che i servizi necessari per l'utilizzo di Connect siano accessibili dall'interno del perimetro di servizio specificato. Scopri di più nei prerequisiti di Connect.