Sicurezza del servizio

Questo documento fornisce una panoramica della sicurezza dei servizi con Cloud Service Mesh. È rivolto agli utenti di Cloud Service Mesh che vogliono aggiungere autenticazione, crittografia e autorizzazione ai propri deployment. Questo documento presuppone che tu abbia familiarità con la panoramica di Cloud Service Mesh e con le applicazioni gRPC senza proxy.

Cloud Service Mesh ti consente di proteggere le comunicazioni da servizio a servizio nel tuo mesh. Nel mesh, ogni servizio ha un'identità. Le seguenti funzionalità contribuiscono a supportare le comunicazioni sicure:

  • Autenticazione e crittografia che utilizzano TLS (Transport Layer Security) e mTLS (Mutual TLS) sia per Cloud Service Mesh con Envoy sia per Cloud Service Mesh con applicazioni gRPC senza proxy. I criteri TLS client e i criteri TLS server controllano se i servizi devono dimostrare le proprie identità l'uno all'altro e se devono utilizzare canali di comunicazione criptati.
  • Autorizzazione, in base alle caratteristiche del client e della richiesta. I criteri di autorizzazione controllano se un servizio è autorizzato ad accedere a un altro servizio e quali azioni sono consentite.

L'utilizzo di certificati e chiavi forniti da un'autorità di certificazione (CA) privata, come Certificate Authority Service di Google, ti consente di mantenere più facilmente la sicurezza del servizio. Il servizio CA fornisce certificati mesh GKE. La funzionalità dei certificati del mesh GKE e Cloud Service Mesh ti consentono di eseguire automaticamente il deployment di questi certificati e di utilizzarli per i workload. Modifica i pod per consentire ai carichi di lavoro di ricevere e utilizzare le credenziali mTLS. La sicurezza del servizio Cloud Service Mesh è attualmente disponibile solo per i carichi di lavoro basati su GKE.

Nelle architetture moderne basate su microservizi, servizi più piccoli e mirati sostituiscono le grandi applicazioni monolitiche. Le chiamate di servizio comunicano tra loro tramite la rete. Queste chiamate, che erano chiamate in-process nelle applicazioni monolithic, presentano problemi di sicurezza, quindi è meglio autenticarle, criptarle e autorizzarle. Questi passaggi supportano il principio di Zero Trust, in cui si presume che tutto il traffico di rete sia a rischio, indipendentemente dal fatto che provenga dall'interno o dall'esterno della rete.

Il pattern di progettazione del mesh di servizi separa qualsiasi complessità relativa alle comunicazioni tra servizi dalla logica di business. È il piano di dati a gestire questa complessità. Oltre a ridurre la complessità dell'applicazione, il pattern di progettazione del mesh di servizi consente modelli di sicurezza che altrimenti potrebbero essere difficili da implementare e gestire.

In questo modello, i sidecar gRPC o Envoy senza proxy autenticano e criptano in modo sicuro le comunicazioni ottenendo informazioni di configurazione da Cloud Service Mesh e i certificati da un pool di servizi CA.

Queste funzionalità di sicurezza semplificano la procedura di deployment di Cloud Service Mesh fornendo quanto segue:

  • Provisioning automatico di chiavi e certificati per tutti i servizi nel tuo mesh.
  • Rotazione automatica di chiavi e certificati per una maggiore sicurezza.
  • Integrazione con Google Kubernetes Engine (GKE) per utilizzare tutte le sue funzionalità, come descrittori e etichette di deployment.
  • Disponibilità elevata dei servizi gestiti da Google, tra cui Cloud Service Mesh e i pool di autorità di certificazione private gestiti da CA Service.
  • Sicurezza legata a Identity and Access Management (IAM) di Google: autorizzazione del servizio basata su account di servizio Google autorizzati.
  • Interoperabilità perfetta con i carichi di lavoro basati su Envoy e senza proxy. Ad esempio, un servizio può trovarsi dietro un proxy Envoy, ma il client utilizza la sicurezza del mesh di servizi gRPC senza proxy. Al contrario, un servizio può essere protetto dalla sicurezza del mesh di servizi gRPC senza proxy, ma il client utilizza un proxy Envoy.

Comunicazioni tra servizi sicure

Cloud Service Mesh fornisce l'autorizzazione e la sicurezza da servizio a servizio con crittografia e autenticazione che utilizzano TLS. I criteri TLS del client e i criteri TLS del server consentono ai servizi di:

  • Affermare e convalidare le loro identità.
  • Cripta le sessioni di comunicazione utilizzando TLS o mTLS.

In un mesh di servizi, il piano dati gestisce questo tipo di sicurezza in modo che le applicazioni non debbano adottare misure speciali per essere sicure.

I criteri di autorizzazione ti consentono di negare o consentire l'accesso in base alle regole che definisci.

Utilizzare TLS per la crittografia

Quando un servizio chiama un altro servizio utilizzando il protocollo HTTP, HTTP/2 o gRPC, il traffico che transita nella rete è in testo normale. Questo traffico potrebbe essere soggetto a attacchi man-in-the-middle, in cui un malintenzionato intercetta il traffico e ne ispeziona o manipola i contenuti.

Per ridurre questo potenziale problema, puoi utilizzare HTTP, HTTP/2 o gRPC tramite TLS con Cloud Service Mesh. Quando utilizzi questi protocolli su TLS, il traffico tra il client e il server viene criptato utilizzando TLS in base al certificato del server. Il traffico non è più in testo normale, il che riduce la probabilità che un malintenzionato possa intercettare e ispezionare o manipolare i relativi contenuti.

Utilizzare TLS per l'autenticazione

Quando un servizio chiama un altro servizio, poniti le seguenti domande:

  • In che modo un client sa di ricevere una risposta dal server corretto anziché da un impostore? Ad esempio, in una tipica interazione richiesta-risposta basata su HTTP, il client non verifica l'identità del server.

  • Che cosa succede se un malintenzionato intercetta questo traffico? Ad esempio, il traffico HTTP non è criptato, quindi chiunque lo riceva può ispezionarne i contenuti. Questo tipo di attacco è noto come attacco man in the middle.

Per ridurre al minimo questi problemi, puoi utilizzare HTTP, HTTP/2 e gRPC su TLS. In questi scambi tra un client e un server, il server deve utilizzare un certificato per dimostrare la propria identità al client. Le richieste e le risposte vengono quindi criptate utilizzando TLS.

Autenticazione TLS reciproca

Quando Cloud Service Mesh configura la rete di applicazioni sia per il client sia per il server, ad esempio configurando un proxy Envoy sul lato client e un altro proxy Envoy sul lato server, puoi sfruttare modelli di autenticazione avanzati come l'autenticazione reciproca.

In un tipico scambio HTTP over TLS, che non si basa sull'autenticazione reciproca, il server ha un certificato che utilizza per criptare le comunicazioni tra il client e il server. Il client può verificare l'identità del server controllando la firma che il server invia durante l'handshake TLS. Tuttavia, il server non verifica l'identità del client.

Quando l'autenticazione reciproca è abilitata, il client dispone anche di un certificato. Il client verifica l'identità del server, come descritto nel paragrafo precedente, e il server può anche verificare l'identità del client. I certificati sia del client sia del server vengono utilizzati per criptare il canale di comunicazione. In questo modo, il server può anche autorizzare i client in base all'identità verificata.

Autenticazione TLS reciproca (mTLS) in una rete mesh di servizi.
Autenticazione TLS reciproca (mTLS) in un mesh di servizi (fai clic per ingrandire)

Autorizza le chiamate di servizio

Puoi scegliere di consentire o negare l'accesso ai servizi utilizzando i criteri di autorizzazione. Con Cloud Service Mesh, puoi definire regole di autorizzazione e di rifiuto per autorizzare l'accesso in base ai parametri di richiesta. Puoi basare queste regole su parametri di livello 3 e 7, tra cui l'ID client, che viene dedotto da client-cert in una connessione mTLS, l'indirizzo IP di origine, la corrispondenza dell'host, la corrispondenza del metodo e la corrispondenza dell'intestazione. Il seguente diagramma mostra l'autorizzazione con i proxy Envoy. La procedura è simile a quella dei client gRPC.

Autorizzazione in un mesh di servizi.
Autorizzazione in una rete mesh di servizi che utilizza Envoy (fai clic per ingrandire)

Limitare l'accesso tramite l'autorizzazione

Una best practice all'interno di un mesh di servizi è rispettare il principio del privilegio minimo. Puoi rispettare questo principio limitando l'accesso al servizio solo ai chiamanti che dipendono dal servizio. Quando un chiamante tenta di accedere a un servizio per il quale non è autorizzato, il tentativo viene rifiutato.

Con Cloud Service Mesh, puoi configurare criteri di autorizzazione che consentano al tuo piano dati di consentire o negare l'accesso ai servizi in base alle regole che definisci. Questi criteri sono costituiti da due componenti:

  • Un'azione: consentire o negare
  • Un elenco di regole

Quando viene inviata una richiesta o un'RPC, il client Cloud Service Mesh nel servizio chiamato determina se esiste una corrispondenza con una regola. Se viene trovata una corrispondenza, la richiesta o l'RPC viene consentita o negata. Puoi definire una regola per la corrispondenza in base ad attributi come:

  • Quando viene utilizzato mTLS, l'account di servizio Kubernetes del servizio chiamante
  • L'indirizzo IP (o l'intervallo di indirizzi) del servizio chiamante
  • Le porte del servizio di destinazione
  • Gli attributi HTTP della richiesta, inclusi i nomi host, i metodi e le intestazioni HTTP definite dall'utente.

Nomi sicuri

Come ulteriore meccanismo di sicurezza, puoi configurare la denominazione sicura con Cloud Service Mesh. In questo modo puoi definire un elenco di nomi consentiti o di identità SPIFFE (Secure Production Identity Framework for Everyone) per un determinato servizio a cui un client sta tentando di connettersi. Durante lo scambio TLS, il backend del servizio restituisce un certificato X.509 al client. Il client poi esamina il certificato per verificare che corrisponda a uno dei nomi o delle identità SPIFFE. Per saperne di più sulle identità SPIFFE, consulta Secure Production Identity Framework for Everyone.

Proteggi il traffico in un gateway

Per configurare i gateway, puoi utilizzare Cloud Service Mesh. Un gateway è un proxy Envoy autonomo che in genere agisce come uno dei seguenti elementi:

  • Un gateway in entrata che gestisce il traffico in entrata in un mesh o in un altro dominio
  • Un gateway in uscita che gestisce il traffico in uscita da un mesh o da un altro dominio
  • Un proxy inverso o un proxy intermedio che distribuisce il traffico in entrata tra uno o più servizi

I client che vogliono inviare traffico all'interno o all'esterno della mesh inviano il traffico al gateway. Il gateway gestisce quindi le richieste in base alle regole che hai configurato con Cloud Service Mesh. Ad esempio, puoi imporre che il traffico che entra nel tuo mesh (anche tramite il gateway di ingresso) debba essere criptato utilizzando TLS.

Componenti di sicurezza

La sicurezza del servizio Cloud Service Mesh supporta i criteri TLS del client, i criteri TLS del server e i criteri di autorizzazione. Creando questi criteri, Cloud Service Mesh può configurare il piano dati e attivare le funzionalità di sicurezza. Per creare o aggiornare queste norme, non è necessario apportare modifiche alle applicazioni.

Crittografia e modalità di autenticazione supportate

Quando un servizio chiama un altro servizio, il primo passaggio per stabilire comunicazioni sicure è che ogni servizio provi la propria identità all'altro servizio. Il grado in cui un servizio deve dimostrare la propria identità si basa sulla modalità TLS configurata.

Puoi configurare i seguenti livelli di sicurezza:

  • Non criptato/non autenticato
  • TLS
  • TLS reciproco (mTLS)
  • Permissivo: mTLS o non criptata/non autenticata, a seconda di come il client avvia la connessione

Certificati e autorità di certificazione

I certificati e un'autorità di certificazione (CA) attendibile costituiscono la base per la fiducia in un sistema distribuito come un mesh di servizi. Utilizzando i certificati, i servizi possono dimostrare la propria identità e verificare le identità che vengono loro presentate nei seguenti modi:

  • Un servizio che vuole dimostrare la propria identità a un altro servizio presenta il suo certificato all'altro servizio. Una CA attendibile per entrambi i servizi firma e emette questo certificato in modo crittografico.
  • Il servizio che riceve questo certificato può verificare che provenga da un'autorità di certificazione considerata attendibile.

Cloud Service Mesh non è un'autorità di certificazione. Per abilitare le comunicazioni sicure, devi configurare un meccanismo che:

  • Esegue il provisioning di identità e certificati
  • Rende disponibili i certificati per i client Cloud Service Mesh, come i proxy Envoy, configurati da Cloud Service Mesh

Cloud Service Mesh supporta il servizio CA di Google. Le guide alla configurazione per Envoy e gRPC proxyless includono istruzioni per la configurazione (per maggiori dettagli, consulta Passaggi successivi).

Architettura e risorse

Cloud Service Mesh include lo spazio dei nomi dell'API Network Security, costituito da tre risorse API Google Cloud che ti consentono di specificare i criteri di sicurezza da applicare al piano dati.

Due risorse dell'API Google Cloud supportano l'autenticazione nel mesh: le policy TLS client e le policy TLS server. Un'altra risorsa, il criterio di autorizzazione, supporta l'autorizzazione.

Lo spazio dei nomi dell'API Network Services include la risorsa dei criteri endpoint, che consente a Cloud Service Mesh di fornire la configurazione (TLS del server, TLS del client e criteri di autorizzazione) agli endpoint. Gli endpoint sono i client Cloud Service Mesh che terminano una comunicazione in entrata da un altro client Cloud Service Mesh.

Criterio TLS del client

Un criterio TLS client ti consente di specificare la modalità TLS lato client e le informazioni del fornitore di certificati da applicare al piano dati. I criteri TLS client supportano l'autenticazione TLS e mTLS. Le norme TLS del client devono essere collegate a una risorsa di servizio di backend globale.

Quando configuri TLS, devi fornire un meccanismo tramite il quale il client convalida il certificato che riceve dal server durante lo scambio TLS utilizzando il campo API serverValidationCa. Il client utilizza queste informazioni per ottenere un certificato di convalida che può utilizzare per convalidare il certificato del server.

Quando configuri mTLS, devi anche fornire un meccanismo tramite il quale il client ottiene il proprio certificato e la propria chiave privata utilizzando il campo API clientCertificate. Il client utilizza queste informazioni per presentare un certificato al server durante l'handshake TLS.

In questa release, Cloud Service Mesh supporta un'autorità di certificazione gestita, CA Service. La configurazione è semplice: specifica il nome del plug-in google_cloud_private_spiffe quando configuri il provider di certificati. Di conseguenza, i client xDS caricano i certificati e le chiavi da una posizione statica. Come prerequisiti, devi configurare i pool di servizi CA e abilitare i certificati mesh sul tuo cluster GKE.

Criterio TLS del server

Un criterio TLS del server (risorsa ServerTlsPolicy) consente di specificare la modalità TLS lato server e le informazioni del provider di certificati da applicare al piano dati. I criteri TLS del server supportano TLS, mTLS e, solo con Envoy, Open_or_mTLS l'autenticazione. Collega i criteri TLS del server a una risorsa di criteri endpoint.

Nomi alternativi dell'oggetto

Quando configuri il campo securitySettings di un servizio di backend globale, puoi fornire un elenco di nomi alternativi dell'oggetto nel campo subjectAltNames. Quando un client avvia un handshake TLS con uno dei backend del servizio, il server presenta il proprio certificato X.509. Il client ispeziona il camposubjectAltName del certificato. Se il campo contiene uno dei valori specificati, la comunicazione continua. Questo meccanismo è descritto in precedenza in Nomi sicuri.

Criteri di autorizzazione

Un criterio di autorizzazione (risorsa AuthorizationPolicy) specifica in che modo un server consente le richieste o le RPC in entrata. Può essere configurato per consentire o negare una richiesta o un'RPC in arrivo in base a vari parametri, come l'identità del client che ha inviato la richiesta, l'host, le intestazioni e altri attributi HTTP. Collega i criteri di autorizzazione a una risorsa di criteri endpoint.

Una regola del criterio di autorizzazione ha i seguenti componenti:

  • from: specifica l'identità del client consentita dalla regola. L'identità può essere ricavata da un certificato client in una connessione TLS reciproca o può essere l'identità dell'ambiente associata alla VM client, ad esempio da un account di servizio o da un tag sicuro.
  • to: specifica le operazioni consentite dalla regola, ad esempio gli URL a cui è possibile accedere o i metodi HTTP consentiti.
  • when: consente di definire vincoli aggiuntivi che devono essere soddisfatti. Puoi utilizzare le espressioni Common Expression Language (CEL) per definire le limitazioni.
  • action: specifica l'azione della regola. Può essere ALLOW, DENY o CUSTOM.

Limitazioni

La sicurezza del servizio Cloud Service Mesh è supportata solo con GKE. Non puoi eseguire il deployment della sicurezza del servizio con Compute Engine.

Quando valuta una richiesta, un criterio di autorizzazione esegue una delle seguenti azioni:

  • ALLOW: concede l'accesso alla risorsa richiesta se la richiesta corrisponde alle regole definite nel criterio di autorizzazione. Il criterio di autorizzazione blocca l'accesso alla risorsa richiesta se la richiesta non corrisponde a nessuna delle regole definite all'interno del criterio di autorizzazione. Una richiesta viene rifiutata se non corrisponde a un criterio ALLOW, anche se altri criteri lo consentono.

  • DENY: blocca l'accesso alla risorsa se una richiesta corrisponde a una delle regole specificate in un criterio DENY. Il criterio di autorizzazione concede l'accesso alla risorsa richiesta se la richiesta non corrisponde a nessuna regola definita all'interno del criterio di autorizzazione. Una richiesta viene rifiutata se corrisponde a un criterio DENY, anche se altri criteri lo consentono.

  • CUSTOM (non supportato in Cloud Service Mesh): consente l'integrazione con sistemi di autorizzazione esterni per decisioni di autorizzazione complesse. Le azioni CUSTOM vengono utilizzate per i criteri che utilizzano le estensioni di servizio per le decisioni di autorizzazione.

Ordine di valutazione dei criteri di autorizzazione

Quando a una singola risorsa sono associati più criteri di autorizzazione, questi vengono valutati nell'ordine seguente per determinare se una richiesta è consentita o negata.

  1. Norme con azioni CUSTOM: se la norma CUSTOM nega la richiesta, quest'ultima viene rifiutata immediatamente. I criteri DENY o ALLOW non vengono valutati, anche se sono configurati.

  2. Norme con azioni DENY: se uno o più criteri DENY corrispondono alla richiesta, la richiesta viene rifiutata. I criteri ALLOW non vengono valutati, anche se sono configurati.

  3. Criteri con azioni ALLOW: se non sono presenti criteri ALLOW o se un criterio ALLOW corrisponde alla richiesta, la richiesta è consentita. Tuttavia, se nessun criterio ALLOW corrisponde alla richiesta, la richiesta viene rifiutata.

Limitazioni con applicazioni gRPC senza proxy

La sicurezza del servizio per i servizi gRPC senza proxy presenta le seguenti limitazioni:

  • Questa release è limitata a Java, Python, C++ e Go.

Quote di AuthzPolicy

  • Non puoi superare un totale di 5 criteri di autorizzazione per gateway.
  • Non puoi superare le 20 risorse AuthzPolicy per progetto.
  • Un singolo criterio AuthzPolicy può puntare a un massimo di 100 gateway.

Passaggi successivi