Puoi migliorare la sicurezza del piano di controllo di Google Kubernetes Engine (GKE) disabilitando gli indirizzi IP esterni delle istanze di macchine virtuali (VM) del piano di controllo. Questo documento mostra agli ingegneri della sicurezza come controllare il traffico in uscita dal server API Kubernetes e come evitare potenziali interruzioni dei webhook di ammissione.
Dovresti già avere familiarità con quanto segue:
Livelli di limitazione
Puoi specificare uno dei seguenti livelli di limitazione quando crei o aggiorni un cluster:
- Nessun traffico (
NONE): disabilita l'indirizzo IP esterno di ogni istanza VM del piano di controllo e indirizza tutto il traffico in uscita del server API a un black hole. Questo livello di limitazione ha i seguenti effetti:- GKE blocca il traffico in uscita diretto dal server API a server webhook di ammissione che vengono eseguiti al di fuori del cluster. Sono interessati tutti i webhook di ammissione che utilizzano un URL o un indirizzo IP per contattare il server webhook.
- GKE blocca qualsiasi traffico in uscita diretto dal server API ai servizi esterni, inclusi internet e Google Cloud servizi. Il traffico per l'autenticazione GKE e per i componenti di sistema come il server di metadati non è interessato.
- Non sono interessati altri tipi di traffico in uscita, come il traffico di sistema critico o il traffico dai nodi.
- GKE utilizza un ValidatingAdmissionPolicy per rifiutare la creazione o gli aggiornamenti di ValidatingWebhookConfigurations o MutatingWebhookConfigurations che utilizzano il campo
clientConfig.url.
- Tutto il traffico (
VIA_CONTROL_PLANE): mantieni l'indirizzo IP esterno di ogni istanza del piano di controllo e consenti al server API di utilizzare l'indirizzo IP per il traffico in uscita. Questa opzione è quella predefinita in GKE.
Limitazioni
Se disabiliti il traffico in uscita impostando il livello di limitazione su NONE, il cluster non può utilizzare indirizzi IP pubblici utilizzati privatamente (PUPI).
Prima di iniziare
Prima di iniziare, assicurati di aver eseguito le seguenti attività:
- Abilita l'API Google Kubernetes Engine. Abilita l'API Google Kubernetes Engine
- Se vuoi utilizzare Google Cloud CLI per questa attività,
installala e poi
inizializza gcloud CLI. Se hai già installato gcloud CLI, scarica l'ultima
versione eseguendo il
gcloud components updatecomando. Le versioni precedenti di gcloud CLI potrebbero non supportare l'esecuzione dei comandi in questo documento.
- Assicurati di avere un cluster GKE Autopilot o Standard che esegue la versione 1.35.1-gke.1396000 o successive. Puoi anche creare un cluster Autopilot.
- Se hai server webhook esterni, verifica di utilizzare un riferimento al servizio per contattarli. Quando disabiliti il traffico in uscita dal server API, tutti i webhook che utilizzano un URL per contattare il server webhook non funzionano. I webhook gestiti da GKE non sono interessati.
Personalizzare il traffico in uscita dal server API
Puoi personalizzare il livello di limitazione per il traffico in uscita dal server API quando crei o aggiorni un cluster. Per aggiornare un cluster esistente, utilizza il flag --control-plane-egress:
gcloud container clusters update CLUSTER_NAME \
--location=CONTROL_PLANE_LOCATION \
--control-plane-egress=CONTROL_PLANE_EGRESS_MODE
Sostituisci quanto segue:
CLUSTER_NAME: il nome del tuo cluster.CONTROL_PLANE_LOCATION: la regione o la zona del piano di controllo del tuo cluster, ad esempious-central1ous-central1-a.CONTROL_PLANE_EGRESS_MODE: il livello di limitazione per il traffico in uscita dal server API. Utilizza uno dei seguenti valori:NONE: disabilita l'indirizzo IP esterno delle istanze VM del piano di controllo e blocca tutto il traffico in uscita non critico dal server API. GKE impedisce la creazione di nuove configurazioni webhook che utilizzano il campoclientConfig.url.VIA_CONTROL_PLANE: mantieni l'indirizzo IP esterno delle istanze VM del piano di controllo e consenti il traffico in uscita dal server API. Questo è il valore predefinito.
Verificare la limitazione del traffico in uscita
Per verificare se GKE blocca il traffico in uscita dal server API, utilizza uno dei seguenti metodi:
Controlla la configurazione del cluster:
gcloud container clusters describe CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION \ --format='value(controlPlaneEgress)'L'output è uno dei seguenti:
NONE: il traffico in uscita è limitato.VIA_CONTROL_PLANE: il traffico in uscita non è limitato.
Per verificare l'effetto delle modifiche sui nuovi webhook, prova a creare una configurazione webhook che utilizzi il campo
clientConfig.url:cat <<EOF | kubectl apply -f - apiVersion: admissionregistration.k8s.io/v1 kind: MutatingWebhookConfiguration metadata: name: test-webhook-config webhooks: - name: my-webhook.example.com clientConfig: url: "https://my-webhook.example.com:9443/my-webhook-path"L'output è simile al seguente:
ValidatingAdmissionPolicy 'gke-restrict-webhook-url' denied request: Egress traffic from the API server through the control plane is disabled. As a result, direct API server calls to external webhook servers are blocked. To connect to external webhooks, update any webhook configurations that use clientConfig.url to use clientConfig.service instead.Questo output indica che un ValidatingAdmissionPolicy di GKE impedisce di creare o aggiornare le configurazioni webhook con il campo
clientConfig.url. Se elimini il ValidatingAdmissionPolicy, puoi creare o aggiornare la configurazione, ma le richieste di ammissione non raggiungeranno il server webhook.Per verificare l'effetto delle modifiche sui webhook esistenti nel cluster, prova a inviare una richiesta diretta a un indirizzo IP al di fuori del cluster:
- Abilita
API_SERVERlog per il cluster. Elimina il ValidatingAdmissionPolicy
gke-restrict-webhook-url:kubectl delete validatingadmissionpolicy gke-restrict-webhook-urlQuando elimini il ValidatingAdmissionPolicy, puoi creare o aggiornare le configurazioni webhook con il campo
clientConfig.url. Il cluster ricrea automaticamente il ValidatingAdmissionPolicy, quindi questo bypass è temporaneo.Nel campo
clientConfig.urldi un ValidatingWebhookConfiguration o MutatingWebhookConfiguration, specifica un indirizzo IP o un URL a cui inviare le richieste. Puoi utilizzare un valore di esempio, ad esempiohttp://example.como203.0.113.100.Controlla i log del server API per un messaggio di errore simile al seguente:
Error from server (InternalError): error when creating "STDIN": Internal error occurred: failed calling webhook WEBHOOK_NAME": failed to call webhook: Post "WEBHOOK_URL": proxyconnect tcp: dial tcp: lookup master-internet-access-unavailable.localhost on 169.254.169.254:53: no such hostQuesto output indica che, anche se il ValidatingAdmissionPolicy è stato eliminato, le richieste di ammissione non possono raggiungere un server webhook utilizzando l'indirizzo IP o l'URL del server.
- Abilita
Dopo aver disabilitato gli indirizzi IP esterni delle istanze VM del piano di controllo, GKE blocca il traffico verso tutti i webhook che utilizzano un URL per contattare i server webhook esterni. Devi utilizzare il campo clientConfig.service nella configurazione webhook per configurare un percorso alternativo da utilizzare per il server API.
Per ulteriori informazioni, consulta la sezione
Configurazione webhook esterni.