Questo tutorial mostra come migliorare la security posture del cluster e dell'app. Immagina di essere un amministratore della piattaforma la cui organizzazione gestisce le app per il proprio negozio online con Cloud Service Mesh, una suite di strumenti che ti aiuta a monitorare e gestire un mesh di servizi affidabile. È tua responsabilità garantire la sicurezza della tua mesh e delle tue app.
Puoi evitare la configurazione errata e convalidare automaticamente i criteri di Cloud Service Mesh utilizzando Policy Controller e Config Sync. Policy Controller consente l'applicazione di criteri completamente programmabili per i cluster. Policy Controller include anche una libreria predefinita di modelli di vincolo che puoi utilizzare con il pacchetto di sicurezza Cloud Service Mesh per verificare la conformità delle vulnerabilità e delle best practice per la sicurezza del mesh. Config Sync riconcilia continuamente lo stato dei cluster con un set centrale di file di configurazione dichiarativa di Kubernetes. L'utilizzo congiunto di Policy Controller e Config Sync ti consente di applicare continuamente limitazioni alle configurazioni dei criteri di Cloud Service Mesh.
Il seguente diagramma mostra una panoramica di come Cloud Service Mesh, Policy Controller e Config Sync collaborano in questo tutorial per gestire e proteggere un gateway di ingresso e le app di esempio di Online Boutique che utilizzi in questo tutorial:
Obiettivi
- Crea un cluster Google Kubernetes Engine (GKE) e registralo in un parco risorse.
- Installa Policy Controller, Config Sync e Cloud Service Mesh su un cluster.
- Configura Config Sync per sincronizzare più repository
- Applica le best practice per eseguire il deployment di configurazioni, app e risorse Istio con Config Sync.
- Esegui il deployment delle configurazioni del cluster, delle app di esempio Online Boutique e di un gateway di ingresso con Config Sync.
- Utilizza il
pacchetto di criteri Cloud Service Mesh
di Policy Controller per applicare le seguenti best practice per la sicurezza:
- Assicurati che tutti i carichi di lavoro nel mesh abbiano l'iniezione automatica di sidecar.
- Crittografa tutto il traffico nella rete mesh.
- Garantire che tutti i carichi di lavoro nella mesh abbiano controllo dell'accesso granulare.
Costi
In questo documento utilizzi i seguenti componenti fatturabili di Google Cloud:
- GKE.
- GKE Enterprise. The billing for GKE Enterprise includes billing for the Cloud Service Mesh, Config Sync, and Policy Controller.
Per generare una stima dei costi basata sull'utilizzo previsto,
utilizza il Calcolatore prezzi.
Al termine delle attività descritte in questo documento, puoi evitare la fatturazione continua eliminando le risorse che hai creato. Per ulteriori informazioni, consulta la sezione Pulizia.
Prima di iniziare
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
prepara l'ambiente
In questa sezione prepari l'ambiente in modo da poter installare Cloud Service Mesh, Policy Controller e Config Sync:
-
In the Google Cloud console, activate Cloud Shell.
Esegui l'upgrade alla versione più recente di Google Cloud CLI:
gcloud components update
Per archiviare i file che crei in questo tutorial, crea una directory:
mkdir ~/asm-acm-tutorial-dir
Per semplificare il resto del tutorial, crea le seguenti variabili di ambiente:
PROJECT_ID=PROJECT_ID gcloud config set project $PROJECT_ID CLUSTER=asm-acm-tutorial CLUSTER_ZONE=us-east4-a MEMBERSHIP=asm-acm-tutorial PROJECT_NUMBER=$(gcloud projects describe ${PROJECT_ID} --format='get(projectNumber)')
Sostituisci
PROJECT_ID
con l'ID progetto che vuoi utilizzare per questo tutorial.Se ti viene chiesto di autorizzare Cloud Shell, fai clic su Autorizza per completare l'operazione.
Abilita le API necessarie per questo tutorial:
gcloud
gcloud services enable \ mesh.googleapis.com \ anthos.googleapis.com
Config Connector
Questo tutorial include le risorse di Config Connector. Puoi utilizzare queste risorse per completare le stesse attività svolte nella scheda
gcloud
. Per utilizzare queste risorse, installa Config Connector e applicale nel modo più adatto al tuo ambiente.Utilizza il seguente manifest
Services
:apiVersion: serviceusage.cnrm.cloud.google.com/v1beta1 kind: Service metadata: annotations: cnrm.cloud.google.com/deletion-policy: "abandon" cnrm.cloud.google.com/disable-dependent-services: "false" name: mesh.googleapis.com spec: resourceID: mesh.googleapis.com projectRef: external: PROJECT_ID --- apiVersion: serviceusage.cnrm.cloud.google.com/v1beta1 kind: Service metadata: annotations: cnrm.cloud.google.com/deletion-policy: "abandon" cnrm.cloud.google.com/disable-dependent-services: "false" name: anthos.googleapis.com spec: resourceID: anthos.googleapis.com projectRef: external: PROJECT_ID
Il completamento dell'operazione può richiedere più di un minuto.
Configura un cluster GKE
In questa sezione crei un cluster GKE e lo registri in un parco risorse. I parchi risorse sono un concetto di Google Cloud per l'organizzazione logica dei cluster e di altre risorse; ti consentono di utilizzare e gestire le funzionalità multi-cluster e di applicare criteri coerenti in tutti i tuoi sistemi.
Il cluster che crei in questa sezione è quello su cui installi Cloud Service Mesh, Policy Controller e Config Sync. È anche il cluster in cui esegui il deployment delle app di esempio Online Boutique.
Per configurare il cluster, completa i seguenti passaggi:
Crea un cluster GKE:
gcloud
gcloud container clusters create ${CLUSTER} \ --zone ${CLUSTER_ZONE} \ --machine-type=e2-standard-4 \ --num-nodes 4 \ --workload-pool ${PROJECT_ID}.svc.id.goog \ --labels mesh_id=proj-${PROJECT_NUMBER}
Config Connector
Utilizza i seguenti manifest
ContainerCluster
eContainerNodePool
:apiVersion: container.cnrm.cloud.google.com/v1beta1 kind: ContainerNodePool metadata: annotations: cnrm.cloud.google.com/project-id: PROJECT_ID name: asm-acm-tutorial spec: clusterRef: name: asm-acm-tutorial location: us-east4-a nodeConfig: machineType: e2-standard-4 nodeCount: 4 --- apiVersion: container.cnrm.cloud.google.com/v1beta1 kind: ContainerCluster metadata: annotations: cnrm.cloud.google.com/project-id: PROJECT_ID cnrm.cloud.google.com/remove-default-node-pool: "true" labels: mesh_id: proj-PROJECT_NUMBER name: asm-acm-tutorial spec: location: us-east4-a initialNodeCount: 1 workloadIdentityConfig: workloadPool: PROJECT_ID.svc.id.goog
Sostituisci
PROJECT_NUMBER
con il valore della variabile di ambientePROJECT_NUMBER
recuperata in precedenza.Il completamento di questa operazione può richiedere più di cinque minuti.
Per assicurarti che la creazione del cluster GKE sia andata a buon fine, descrivi il suo stato:
gcloud container clusters list \ --zone ${CLUSTER_ZONE} \ --project ${PROJECT_ID}
L'output è simile al seguente:
NAME LOCATION MASTER_VERSION MASTER_IP MACHINE_TYPE NODE_VERSION NUM_NODES STATUS asm-acm-tutorial us-east4-a 1.23.12-gke.100 35.186.179.30 e2-standard-4 1.23.12-gke.100 3 RUNNING
Connettiti al cluster GKE:
gcloud container clusters get-credentials ${CLUSTER} \ --zone ${CLUSTER_ZONE} \ --project ${PROJECT_ID}
Registra il cluster in un parco risorse:
gcloud
gcloud container fleet memberships register ${MEMBERSHIP} \ --project ${PROJECT_ID} \ --gke-cluster ${CLUSTER_ZONE}/${CLUSTER} \ --enable-workload-identity
L'output è simile al seguente:
kubeconfig entry generated for asm-acm-tutorial. Waiting for membership to be created...done. Created a new membership [projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial] for the cluster [asm-acm-tutorial] Generating the Connect Agent manifest... Deploying the Connect Agent on cluster [asm-acm-tutorial] in namespace [gke-connect]... Deployed the Connect Agent on cluster [asm-acm-tutorial] in namespace [gke-connect]. Finished registering the cluster [asm-acm-tutorial] with the Fleet.
Config Connector
Utilizza il seguente manifest
GKEHubMembership
:apiVersion: gkehub.cnrm.cloud.google.com/v1beta1 kind: GKEHubMembership metadata: annotations: cnrm.cloud.google.com/project-id: PROJECT_ID name: asm-acm-tutorial spec: location: global authority: issuer: https://container.googleapis.com/v1/projects/PROJECT_ID/locations/us-east4-a/clusters/asm-acm-tutorial endpoint: gkeCluster: resourceRef: name: asm-acm-tutorial
Per assicurarti che la registrazione del cluster GKE sia andata a buon fine, descriverne lo stato:
gcloud container fleet memberships list
L'output è simile al seguente:
NAME EXTERNAL_ID LOCATION asm-acm-tutorial 0e12258c-8831-4d81-b5c0-5e7099a468cc global
Esplora i repository
Nella seguente sezione di installazione, applichi un
file manifest acm-config.yaml
. Questo manifest configura il cluster per la sincronizzazione dalla cartella asm-acm-tutorial
del repository di esempio. Questa cartella contiene tutti
i file di configurazione necessari per completare il resto del tutorial.
Per semplificare questo tutorial, utilizzerai i comandi sed
per aggiornare il
acm-config.yaml
. Con il file acm-config.yaml
,
Config Sync esegue il deployment dei manifest richiesti per ogni passaggio di questo tutorial.
L'aggiornamento di un singolo file ti consente di concentrarti sui concetti e sul flusso di protezione dei tuoi cluster, mesh e applicazioni senza manipolare ripetutamente i file ed eseguire ripetutamente i comandi git
.
Per utilizzare la capacità di Config Sync di sincronizzare più repository, utilizza le seguenti risorse:
root-sync
, come repositoryRootSync
, contiene tutte le configurazioni del cluster, tra cuiRepoSyncs
,Constraints
,ClusterRole
,RoleBindings
e le risorse incluse in alcuni spazi dei nomi di sistema comeistio-system
.ingress-gateway
, come primoRepoSync
, contiene tutte le risorse necessarie per eseguire il deployment di un gateway di ingresso e per proteggerlo progressivamente durante questo tutorial.online-boutique
, come secondoRepoSync
, contiene tutte le risorse necessarie per implementare le app Boutique online e renderle progressivamente sicure durante questo tutorial.
Installa Policy Controller, Config Sync e Cloud Service Mesh gestito
Ora che hai creato e registrato il cluster, puoi installare Config Sync, Policy Controller e Cloud Service Mesh sul cluster e configurarlo per la sincronizzazione dalle configurazioni del RootSync
predefinito:
Abilita l'operatore
ConfigManagement
, che gestisce Config Sync e Policy Controller:gcloud
gcloud beta container fleet config-management enable
Config Connector
Utilizza il seguente manifest
GKEHubFeature
:apiVersion: gkehub.cnrm.cloud.google.com/v1beta1 kind: GKEHubFeature metadata: name: configmanagement spec: projectRef: external: PROJECT_ID location: global resourceID: configmanagement
Attiva Cloud Service Mesh nel tuo parco risorse.
gcloud
gcloud container fleet mesh enable
Config Connector
Utilizza il seguente manifest
GKEHubFeature
:apiVersion: gkehub.cnrm.cloud.google.com/v1beta1 kind: GKEHubFeature metadata: name: servicemesh spec: projectRef: external: PROJECT_ID location: global resourceID: servicemesh
Attiva la gestione automatica di Cloud Service Mesh per consentire a Google di applicare la configurazione consigliata di Cloud Service Mesh gestito:
gcloud
gcloud container fleet mesh update \ --management automatic \ --memberships ${MEMBERSHIP}
Config Connector
Utilizza il seguente manifest
GKEHubFeatureMembership
:apiVersion: gkehub.cnrm.cloud.google.com/v1beta1 kind: GKEHubFeatureMembership metadata: name: servicemesh-membership spec: projectRef: external: PROJECT_ID location: global membershipRef: name: asm-acm-tutorial featureRef: name: servicemesh mesh: management: MANAGEMENT_AUTOMATIC
Abilita Config Sync e Policy Controller:
gcloud
Salva il seguente manifest come
acm-config.yaml
nella directory~/asm-acm-tutorial-dir
:applySpecVersion: 1 spec: configSync: enabled: true policyDir: asm-acm-tutorial/root-sync/init secretType: none sourceFormat: unstructured syncRepo: https://github.com/GoogleCloudPlatform/anthos-config-management-samples syncBranch: main policyController: enabled: true referentialRulesEnabled: true templateLibraryInstalled: true
Per scoprire di più sui campi di configurazione di Google Cloud CLI, consulta Campi per le specifiche dell'applicazione di gcloud.
Applica il file:
gcloud beta container fleet config-management apply \ --membership ${MEMBERSHIP} \ --config ~/asm-acm-tutorial-dir/acm-config.yaml
Config Connector
Utilizza il seguente manifest
GKEHubFeatureMembership
:apiVersion: gkehub.cnrm.cloud.google.com/v1beta1 kind: GKEHubFeatureMembership metadata: name: configmanagement-membership spec: projectRef: external: PROJECT_ID location: global membershipRef: name: asm-acm-tutorial featureRef: name: configmanagement configmanagement: configSync: sourceFormat: unstructured git: policyDir: asm-acm-tutorial/root-sync/init secretType: none syncBranch: main syncRepo: https://github.com/GoogleCloudPlatform/anthos-config-management-samples policyController: enabled: true referentialRulesEnabled: true templateLibraryInstalled: true
Policy Controller e Config Sync sono installati sul cluster. Successivamente, Config Sync inizia a sincronizzare tutte le configurazioni del
RootSync
predefinito con il tuo cluster. Queste configurazioni installano e configurano i seguenti componenti chiave:Gli oggetti
RepoSync
che configurano le app Online Boutique e il gateway di ingresso vengono sincronizzati:Poiché i ricostruttori
RepoSync
richiedono autorizzazioni aggiuntive per creare risorse Istio, al cluster vengono applicati anche un oggettoClusterRole
e due oggettiRoleBinding
per concedere queste autorizzazioni:
Per assicurarti che l'installazione di Policy Controller e Config Sync sia andata a buon fine, controlla lo stato:
gcloud beta container fleet config-management status
L'output è simile al seguente:
Name: asm-acm-tutorial Status: SYNCED Last_Synced_Token: 4b3384d Sync_Branch: main Last_Synced_Time: 2022-05-04T21:32:58Z Policy_Controller: INSTALLED Hierarchy_Controller: PENDING
Se nelle righe
Status
oPolicy_Controller
viene visualizzatoPENDING
oNOT_INSTALLED
, attendi qualche minuto ed esegui di nuovogcloud beta container fleet config-management status
.Per assicurarti che l'installazione di Cloud Service Mesh sia andata a buon fine, descrivi il relativo stato:
gcloud container fleet mesh describe
L'output è simile al seguente:
createTime: '2022-09-13T23:12:56.477042921Z' membershipSpecs: projects/PROJECT_NUMBER/locations/global/memberships/asm-acm-tutorial: mesh: management: MANAGEMENT_AUTOMATIC membershipStates: projects/PROJECT_NUMBER/locations/global/memberships/asm-acm-tutorial: servicemesh: controlPlaneManagement: details: - code: REVISION_READY details: 'Ready: asm-managed' state: ACTIVE dataPlaneManagement: details: - code: OK details: Service is running. state: ACTIVE state: code: OK description: |- Revision(s) ready for use: asm-managed. All Canonical Services have been reconciled successfully. updateTime: '2022-09-14T00:19:10.571552206Z' name: projects/PROJECT_ID/locations/global/features/servicemesh resourceState: state: ACTIVE spec: {} state: state: {} updateTime: '2022-09-14T00:19:14.135113118Z'
Se vedi
state.code: ERROR
anzichéstate.code: OK
, attendi qualche minuto ed esegui di nuovogcloud container fleet mesh describe
. Prima di continuare con il tutorial, devi assicurarti che il camposervicemesh.controlPlaneManagement.details.code
abbia il valoreREVISION_READY
.
Esegui il deployment di un gateway di ingresso e di un'applicazione di esempio
In questa sezione esegui il deployment dell'applicazione di esempio Online Boutique e di un gateway in entrata per gestire il traffico in entrata.
Esegui il deployment dell'applicazione di esempio Online Boutique e del gateway di ingresso.
Il seguente comando utilizza
sed
per aggiornare il manifestacm-config.yaml
in modo da far sì che Config Sync esegua il deployment delle risorse necessarie per il deployment del gateway di ingresso e dell'app di esempio.sed -i "s,root-sync/init,root-sync/deployments,g" ~/asm-acm-tutorial-dir/acm-config.yaml gcloud beta container fleet config-management apply \ --membership ${MEMBERSHIP} \ --config ~/asm-acm-tutorial-dir/acm-config.yaml
Tieni presente che il completamento di questo passaggio può richiedere alcuni minuti.
Visualizza lo stato di Config Sync per
RootSync
e i dueRepoSyncs
:gcloud alpha anthos config sync repo describe
L'output è simile al seguente:
getting 3 RepoSync and RootSync from projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial [ { "clusters": [ "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial" ], "commit": "95a30c052566357afb9db3d7f6153d9c0f219c03", "errors": [], "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/root-sync/deployments@main", "status": "SYNCED" }, { "clusters": [ "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial" ], "commit": "95a30c052566357afb9db3d7f6153d9c0f219c03", "errors": [], "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/ingress-gateway/deployments@main", "status": "SYNCED" }, { "clusters": [ "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial" ], "commit": "95a30c052566357afb9db3d7f6153d9c0f219c03", "errors": [], "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/online-boutique/deployments@main", "status": "SYNCED" } ]
Se vedi
status: RECONCILING
anzichéstatus: SYNCED
, attendi qualche minuto ed esegui di nuovogcloud alpha anthos config sync repo describe
.Per visualizzare solo le informazioni di un repository, puoi utilizzare i flag
--sync-name
e--sync-namespace
. Per visualizzare le risorse gestite in dettaglio, aggiungi il flag--managed-resources
. Per ulteriori informazioni, consulta Visualizzare lo stato di Config Sync in più cluster.Attendi il provisioning dell'indirizzo IP pubblico del gateway di ingresso:
until kubectl -n asm-ingress get svc asm-ingressgateway -o jsonpath='{.status.loadBalancer}' | grep "ingress"; do : ; done
Ottieni l'indirizzo IP pubblico del gateway di ingresso:
EXTERNAL_IP=$(kubectl get svc asm-ingressgateway -n asm-ingress -o jsonpath="{.status.loadBalancer.ingress[*].ip}")
Visita l'indirizzo IP dal browser per verificare che l'app Online Boutique sia stata implementata correttamente:
echo http://${EXTERNAL_IP}
Applica i criteri per proteggere il tuo mesh
Nelle sezioni seguenti, utilizzerai Policy Controller per applicare i criteri del bundle di criteri Cloud Service Mesh creando vincoli.
Applicare l'inserimento di proxy sidecar
In questa sezione applichi i criteri per assicurarti che per tutti i carichi di lavoro nel mesh sia attivata l'iniezione automatica di sidecar.
Per applicare l'inserimento di proxy sidecar, applica i vincoli.
Il seguente comando utilizza
sed
per aggiornare il manifestacm-config.yaml
in modo che Config Sync esegua il deployment delle risorse associate.sed -i "s,root-sync/deployments,root-sync/enforce-sidecar-injection,g" ~/asm-acm-tutorial-dir/acm-config.yaml gcloud beta container fleet config-management apply \ --membership ${MEMBERSHIP} \ --config ~/asm-acm-tutorial-dir/acm-config.yaml
Il comando precedente esegue il deployment delle seguenti risorse:
Un
K8sRequiredLabels
Constraint
che richiede che qualsiasiNamespace
nel mesh contenga l'etichetta di inserimento del proxy sidecar di Cloud Service Mesh specifica:Un
AsmSidecarInjection
Constraint
che impedisce a qualsiasiPod
nel mesh di bypassare l'iniezione del proxy sidecar Istio:
Visualizza lo stato di Config Sync per il
RootSync
:gcloud alpha anthos config sync repo describe \ --sync-name root-sync \ --sync-namespace config-management-system
L'output è simile al seguente:
getting 1 RepoSync and RootSync from projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial [ { "clusters": [ "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial" ], "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884", "errors": [], "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/root-sync/enforce-sidecar-injection@main", "status": "SYNCED" } ]
Se vedi
status: RECONCILING
anzichéstatus: SYNCED
, attendi qualche minuto ed esegui di nuovogcloud alpha anthos config sync repo describe
.Verifica che i
Constraints
siano stati creati:kubectl get constraints
La valutazione di questi vincoli da parte di Policy Controller può richiedere alcuni minuti. Se non visualizzi valori nella colonna
TOTAL-VIOLATIONS
, attendi e esegui di nuovokubectl get constraints
.L'output è simile al seguente:
NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS podsidecarinjectionannotation.constraints.gatekeeper.sh/pod-sidecar-injection-annotation deny 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8srequiredlabels.constraints.gatekeeper.sh/namespace-sidecar-injection-label deny 0
Poiché abbiamo configurato correttamente
Namespaces
ePods
, sono disponibili0
TOTAL-VIOLATIONS
per questiConstraints
.Per vedere questi
Constraints
in azione, prova a creare unNamespace
nel tuo cluster senza unlabel
né unannotation
:kubectl create namespace test
L'output è simile al seguente errore:
Error from server (Forbidden): admission webhook "validation.gatekeeper.sh" denied the request: [namespace-sidecar-injection-label] you must provide labels: {"istio-injection"}
Applicare la crittografia del traffico
In questa sezione applichi i criteri per garantire che tutto il traffico nel mesh sia criptato.
Per applicare la crittografia del traffico, applica i vincoli.
Il seguente comando utilizza
sed
per aggiornare il manifestacm-config.yaml
in modo che Config Sync esegua il deployment delle risorse associate.sed -i "s,root-sync/enforce-sidecar-injection,root-sync/enforce-strict-mtls,g" ~/asm-acm-tutorial-dir/acm-config.yaml gcloud beta container fleet config-management apply \ --membership ${MEMBERSHIP} \ --config ~/asm-acm-tutorial-dir/acm-config.yaml
Il comando precedente esegue il deployment delle seguenti risorse:
Un
AsmPeerAuthnMeshStrictMtls
Constraint
che applica il protocollo mTLSPeerAuthentication
a livello di mesh nello spazio dei nomiistio-system
:Un vincolo referenziale
Config
nello spazio dei nomigatekeeper-system
. Questo vincolo di riferimento consente alAsmPeerAuthnMeshStrictMtls
Constraint
di fare riferimento a un altro oggetto nella sua definizione (ad esempio, la ricerca di qualsiasiPeerAuthentication
nelistio-system
Namespace
):Un
DestinationRuleTLSEnabled
Constraint
che vieta la disattivazione di TLS per tutti gli host e i sottoinsiemi di host in IstioDestinationRules
:Un
AsmPeerAuthnStrictMtls
Constraint
che impone che tutti iPeerAuthentications
non possano sovrascrivereSTRICT
mTLS:
Visualizza lo stato di Config Sync per il
RootSync
:gcloud alpha anthos config sync repo describe \ --sync-name root-sync \ --sync-namespace config-management-system
L'output è simile al seguente:
getting 1 RepoSync and RootSync from projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial [ { "clusters": [ "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial" ], "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884", "errors": [], "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/root-sync/enforce-strict-mtls@main", "status": "SYNCED" } ]
Se vedi
status: RECONCILING
anzichéstatus: SYNCED
, attendi qualche minuto ed esegui di nuovogcloud alpha anthos config sync repo describe
.Esegui il seguente comando per avere ulteriori informazioni sulla violazione
PeerAuthentication
:kubectl get asmpeerauthnmeshstrictmtls.constraints.gatekeeper.sh/mesh-level-strict-mtls -ojsonpath='{.status.violations}' | jq
L'output è simile al seguente:
[ { "enforcementAction": "deny", "group": "constraints.gatekeeper.sh", "kind": "AsmPeerAuthnMeshStrictMtls", "message": "Root namespace <istio-system> does not have a strict mTLS PeerAuthentication", "name": "mesh-level-strict-mtls", "version": "v1beta1" } ]
Risolvi il problema implementando un
PeerAuthentication
nelistio-system
. Per impedire a tutti i servizi nel mesh di accettare traffico in testo non cifrato, imposta un criterioPeerAuthentication
a livello di mesh con la modalità mTLS impostata suSTRICT
. Quando esegui il deployment del criterio, il piano di controllo esegue automaticamente il provisioning dei certificati TLS per consentire ai carichi di lavoro di autenticarsi tra loro.Il seguente comando utilizza
sed
per aggiornare il manifestacm-config.yaml
in modo che Config Sync esegua il deployment delle risorse associate.sed -i "s,root-sync/enforce-strict-mtls,root-sync/fix-strict-mtls,g" ~/asm-acm-tutorial-dir/acm-config.yaml gcloud beta container fleet config-management apply \ --membership ${MEMBERSHIP} \ --config ~/asm-acm-tutorial-dir/acm-config.yaml
Il comando precedente esegue il deployment del seguente
STRICT
mTLSPeerAuthentication
nello spazio dei nomiistio-system
. In questo modo, mTLSSTRICT
viene applicato all'intero mesh:Visualizza lo stato di Config Sync per il
RootSync
:gcloud alpha anthos config sync repo describe \ --sync-name root-sync \ --sync-namespace config-management-system
L'output è simile al seguente:
getting 1 RepoSync and RootSync from projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial [ { "clusters": [ "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial" ], "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884", "errors": [], "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/root-sync/fix-strict-mtls@main", "status": "SYNCED" } ]
Se vedi
status: RECONCILING
anzichéstatus: SYNCED
, attendi qualche minuto ed esegui di nuovogcloud alpha anthos config sync repo describe
.Verifica che i
Constraints
siano stati creati:kubectl get constraints
Tieni presente che potrebbero essere necessari alcuni minuti per consentire a Policy Controller di valutare questi
Constraints
. Attendi ed esegui di nuovo questo comandokubectl get constraints
finché non ottieni valori nella colonnaTOTAL-VIOLATIONS
per ogni riga.L'output è simile al seguente:
NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8srequiredlabels.constraints.gatekeeper.sh/namespace-sidecar-injection-label deny 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS asmpeerauthnmeshstrictmtls.constraints.gatekeeper.sh/mesh-level-strict-mtls deny 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS destinationruletlsenabled.constraints.gatekeeper.sh/destination-rule-tls-enabled deny 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS asmpeerauthnstrictmtls.constraints.gatekeeper.sh/peerauthentication-strict-mtls deny 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS asmsidecarinjection.constraints.gatekeeper.sh/pod-sidecar-injection-annotation deny 0
Applicare controllo dell'accesso granulare
In questa sezione applichi i criteri per assicurarti che tutti i workload nel mesh abbiano un controllo granulare dell'accesso.
Per applicare controllo dell'accesso granulare, applica i vincoli.
Il seguente comando utilizza
sed
per aggiornare il manifestacm-config.yaml
in modo che Config Sync esegua il deployment delle risorse associate.sed -i "s,root-sync/fix-strict-mtls,root-sync/enforce-authorization-policies,g" ~/asm-acm-tutorial-dir/acm-config.yaml gcloud beta container fleet config-management apply \ --membership ${MEMBERSHIP} \ --config ~/asm-acm-tutorial-dir/acm-config.yaml
Il comando precedente esegue il deployment delle seguenti risorse:
Un
Constraint
AsmAuthzPolicyDefaultDeny
che applica il divieto predefinitoAuthorizationPolicy
a livello di mesh nello spazio dei nomiistio-system
:Un
AsmAuthzPolicyEnforceSourcePrincipals
Constraint
che impone che qualsiasiAuthorizationPolicies
definisca principi di origine granulari (diversi da "*"). Solo il gateway in entrata nello spazio dei nomiasm-ingress
è un'eccezione a questa regola per ricevere il traffico dagli utenti finali e reindirizzarlo all'appfrontend
della boutique online.
Visualizza lo stato di Config Sync per il
RootSync
:gcloud alpha anthos config sync repo describe \ --sync-name root-sync \ --sync-namespace config-management-system
L'output è simile al seguente:
getting 1 RepoSync and RootSync from projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial [ { "clusters": [ "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial" ], "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884", "errors": [], "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/root-sync/enforce-authorization-policies@main", "status": "SYNCED" } ]
Se vedi
status: RECONCILING
anzichéstatus: SYNCED
, attendi qualche minuto ed esegui di nuovogcloud alpha anthos config sync repo describe
.Esegui il seguente comando per avere ulteriori informazioni sulla violazione associata:
kubectl get asmauthzpolicydefaultdeny.constraints.gatekeeper.sh/default-deny-authorization-policies -ojsonpath='{.status.violations}' | jq
L'output è simile al seguente:
[ { "enforcementAction": "deny", "group": "constraints.gatekeeper.sh", "kind": "AsmAuthzPolicyDefaultDeny", "message": "Root namespace <istio-system> does not have a default deny AuthorizationPolicy", "name": "default-deny-authorization-policies", "version": "v1beta1" } ]
Risolvi il problema dispiegando
AuthorizationPolicy
nell'ambitoistio-system
.Il seguente comando utilizza
sed
per aggiornare il manifestacm-config.yaml
in modo che Config Sync esegua il deployment delle risorse associate.sed -i "s,root-sync/enforce-authorization-policies,root-sync/fix-default-deny-authorization-policy,g" ~/asm-acm-tutorial-dir/acm-config.yaml gcloud beta container fleet config-management apply \ --membership ${MEMBERSHIP} \ --config ~/asm-acm-tutorial-dir/acm-config.yaml
Il comando precedente esegue il deployment del seguente
AuthorizationPolicy
di tipo deny-all nello spazio dei nomiistio-system
:Visualizza lo stato di Config Sync per il
RootSync
:gcloud alpha anthos config sync repo describe \ --sync-name root-sync \ --sync-namespace config-management-system
L'output è simile al seguente:
getting 1 RepoSync and RootSync from projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial [ { "clusters": [ "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial" ], "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884", "errors": [], "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/root-sync/fix-default-deny-authorization-policy@main", "status": "SYNCED" } ]
Se vedi
status: RECONCILING
anzichéstatus: SYNCED
, attendi qualche minuto ed esegui di nuovogcloud alpha anthos config sync repo describe
.Verifica che i
Constraints
siano stati creati:kubectl get constraints
Tieni presente che potrebbero essere necessari alcuni minuti per consentire a Policy Controller di valutare questi
Constraints
. Attendi ed esegui di nuovo questo comandokubectl get constraints
finché non ottieni valori nella colonnaTOTAL-VIOLATIONS
per ogni riga.L'output è simile al seguente:
NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS asmsidecarinjection.constraints.gatekeeper.sh/pod-sidecar-injection-annotation deny 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8srequiredlabels.constraints.gatekeeper.sh/namespace-sidecar-injection-label deny 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS asmauthzpolicydefaultdeny.constraints.gatekeeper.sh/default-deny-authorization-policies deny 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS asmpeerauthnmeshstrictmtls.constraints.gatekeeper.sh/mesh-level-strict-mtls deny 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS destinationruletlsenabled.constraints.gatekeeper.sh/destination-rule-tls-enabled deny 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS asmpeerauthnstrictmtls.constraints.gatekeeper.sh/peerauthentication-strict-mtls deny 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS asmauthzpolicyenforcesourceprincipals.constraints.gatekeeper.sh/authz-source-principals-not-all deny 0
Visita l'app Online Boutique dal browser:
echo http://${EXTERNAL_IP}
Dovresti ricevere l'errore:
RBAC: access denied
che conferma che il divieto predefinitoAuthorizationPolicy
è applicato all'intero mesh.Per risolvere il problema, esegui il deployment di
AuthorizationPolicies
più granulare negli spazi dei nomiasm-ingress
eonlineboutique
.Il seguente comando utilizza
sed
per aggiornare il manifestacm-config.yaml
in modo che Config Sync esegua il deployment delle risorse associate.sed -i "s,root-sync/fix-default-deny-authorization-policy,root-sync/deploy-authorization-policies,g" ~/asm-acm-tutorial-dir/acm-config.yaml gcloud beta container fleet config-management apply \ --membership ${MEMBERSHIP} \ --config ~/asm-acm-tutorial-dir/acm-config.yaml
Il comando precedente esegue il deployment delle seguenti risorse:
Un
AuthorizationPolicy
nello spazio dei nomiasm-ingress
:Un
AuthorizationPolicy
per app nello spazio dei nomionlineboutique
. Ecco l'esempio per l'appcartservice
:Un
ServiceAccount
per app negli spazi dei nomiasm-ingress
eonlineboutique
per avere un'identità univoca per app valutata comeprincipal
inAuthorizationPolicies
. Ecco un esempio per l'appcartservice
:
Visualizza lo stato di Config Sync per
RootSync
e i dueRepoSyncs
:gcloud alpha anthos config sync repo describe
L'output è simile al seguente:
getting 3 RepoSync and RootSync from projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial [ { "clusters": [ "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial" ], "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884", "errors": [], "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/root-sync/deploy-authorization-policies@main", "status": "SYNCED" }, { "clusters": [ "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial" ], "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884", "errors": [], "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/ingress-gateway/authorization-policies@main", "status": "SYNCED" }, { "clusters": [ "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial" ], "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884", "errors": [], "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/online-boutique/authorization-policies@main", "status": "SYNCED" } ]
Se vedi
status: RECONCILING
anzichéstatus: SYNCED
, attendi qualche minuto ed esegui di nuovogcloud alpha anthos config sync repo describe
.Per visualizzare solo le informazioni di un repository, puoi utilizzare i flag
--sync-name
e--sync-namespace
. Per visualizzare in dettaglio le risorse gestite, puoi aggiungere il flag--managed-resources
. Per ulteriori informazioni, consulta Visualizzare lo stato di Config Sync in più cluster.Visita di nuovo l'app Online Boutique dal browser:
echo http://${EXTERNAL_IP}
Se attendi qualche minuto, il sito web dovrebbe funzionare di nuovo come previsto.
Visualizza lo stato delle funzionalità di sicurezza di GKE Enterprise
Puoi visualizzare lo stato delle funzionalità di sicurezza di GKE Enterprise, inclusi i criteri di autenticazione e autorizzazione, nella console Google Cloud.
Nella console Google Cloud, vai alla pagina Sicurezza di GKE Enterprise.
Vai a Sicurezza di GKE Enterprise
Il riepilogo dei criteri mostra lo stato della sicurezza delle applicazioni, incluso il controllo dell'accesso ai servizi (
AuthorizationPolicies
) e mTLS.Fai clic su Controllo criteri per visualizzare gli stati dei criteri del workload per il cluster e per entrambi gli spazi dei nomi (
asm-ingress
eonlineboutique
).Le schede Controllo dell'accesso ai servizi e Stato mTLS forniscono una panoramica generale.
L'elenco Workloads mostra il controllo dell'accesso ai servizi e lo stato di mTLS di ciascun carico di lavoro.
Ora hai protetto il tuo cluster e il tuo mesh con Policy Controller e Config Sync.
Esegui la pulizia
Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, elimina il progetto che contiene le risorse oppure mantieni il progetto ed elimina le singole risorse.
Elimina il progetto
Delete a Google Cloud project:
gcloud projects delete PROJECT_ID
Elimina singole risorse
Per eliminare le singole risorse:
Annullare la registrazione del cluster dal parco risorse:
gcloud
gcloud container fleet memberships unregister ${CLUSTER} \ --project=${PROJECT_ID} \ --gke-cluster=${CLUSTER_ZONE}/${CLUSTER}
L'output è simile al seguente:
kubeconfig entry generated for asm-acm-tutorial. Waiting for membership to be deleted...done. Deleting membership CR in the cluster...done. Deleting namespace [gke-connect] in the cluster...done.
Config Connector
kubectl delete -f ~/asm-acm-tutorial-dir/fleet-membership.yaml
Elimina il cluster:
gcloud
gcloud container clusters delete ${CLUSTER} \ --zone ${CLUSTER_ZONE}
Premi
y
quando richiesto. Il completamento di questo comando può richiedere più di cinque minuti.L'output è simile al seguente:
Deleting cluster asm-acm-tutorial...done. Deleted [https://container.googleapis.com/v1/projects/PROJECT_ID/zones/us-east4-a/clusters/asm-acm-tutorial].
Config Connector
kubectl delete -f ~/asm-acm-tutorial-dir/container-cluster.yaml
Elimina i file che hai creato:
rm -r ~/asm-acm-tutorial-dir
Passaggi successivi
- Scopri le best practice per la sicurezza di Cloud Service Mesh.
- Scopri di più sul bundle di criteri Cloud Service Mesh.
- Esplora la libreria di modelli di vincolo di Policy Controller.
- Esplora architetture di riferimento, diagrammi e best practice su Google Cloud. Consulta il nostro Cloud Architecture Center.