Utilizza i vincoli dei criteri di sicurezza di Cloud Service Mesh

Policy Controller include una libreria predefinita di modelli di vincolo che possono essere utilizzati con il pacchetto di sicurezza Cloud Service Mesh per verificare la conformità delle vulnerabilità e delle best practice per la sicurezza del mesh.

Questa pagina contiene le istruzioni per applicare manualmente un bundle di norme. In alternativa, puoi applicare direttamente i bundle di norme.

Questo pacchetto di vincoli affronta e applica le norme nei seguenti domini:

  • Cloud Service Mesh applica il traffico mTLS
  • Best practice per AuthorizationPolicy di Cloud Service Mesh
  • Applicazione della sicurezza dei carichi di lavoro di Cloud Service Mesh

Vincoli del bundle di criteri Cloud Service Mesh

Nome vincolo Descrizione del vincolo ID controllo
asm-policy-v0.0.1-asm-ingressgateway-label Applica l'utilizzo dell'etichetta istio ingressgateway solo ai pod ingressgateway 1.1.1
asm-policy-v0.0.1-asm-sidecar-injection Forza l'iniezione del file collaterale del proxy Istio nei pod del workload 1.1.2
asm-policy-v0.0.1-asm-authz-policy-mesh-default-deny Applica AuthorizationPolicy default deny a livello di mesh 1.2.1
asm-policy-v0.0.1-asm-authz-policy-normalization Applica la normalizzazione di AuthorizationPolicy 1.2.2
asm-policy-v0.0.1-asm-authz-policy-safe-pattern Applica i pattern sicuri di AuthorizationPolicy 1.2.3
asm-policy-v0.0.1-asm-peer-authn-mesh-strict-mtls Applica l'autenticazione peer strict mtls a livello di mesh 1.3.1
asm-policy-v0.0.1-asm-peer-authn-strict-mtls Imponi che tutte le PeerAuthentications non possano sovrascrivere strict mtls 1.3.2
asm-policy-v0.0.1-asm-request-authn-prohibited-output-headers Forza l'outputPayloadToHeader di jwtRules a non contenere intestazioni di richieste HTTP note 1.4.1

Profili bundle

Nel bundle di criteri di sicurezza di Cloud Service Mesh, puoi utilizzare due profili in base al livello di rigore. Il livello di rigore basso prevede meno vincoli applicati, il che offre maggiore flessibilità. Il livello di rigore elevato prevede più vincoli applicati, il che garantisce un controllo più sicuro delle policy.

Livello di rigore basso

Il profilo con livello di rigore basso presenta i seguenti vincoli dei criteri:

  • L'etichetta istio:ingressgateway può essere utilizzata solo dai pod del gateway in entrata Istio.

  • In AuthorizationPolicy, i campi hosts o notHosts possono essere utilizzati solo selezionando il gateway di ingresso Istio con l'etichetta istio:ingressgateway.

  • In AuthorizationPolicy, quando vengono utilizzati i campi methods o notMethods, i valori devono essere in lettere maiuscole.

  • In AuthorizationPolicy, quando viene utilizzato il campo request.headers, i valori non possono contenere spazi.

  • In AuthorizationPolicy, quando vengono utilizzati i campi paths o notPaths, i valori devono essere normalizzati.

Livello di severità elevato

Il livello di rigore elevato include tutti i vincoli del livello di rigore basso, nonché i seguenti vincoli:

  • Per tutti i pod del carico di lavoro, l'annotazione sidecar.istio.io/inject: false non può essere applicata per bypassare l'inserimento del proxy.

  • Viene applicato un livello mesh AuthorizationPolicy che definisce una regola di negazione predefinita.

  • AuthorizationPolicy deve seguire ALLOW-with-positive-matching o DENY-with-negative-match.

  • In AuthorizationPolicy, quando vengono utilizzati i campi hosts o notHosts, i valori devono essere coppie di <host-name> e <host-name>:*.

  • Viene applicato un livello di mesh PeerAuthentication che definisce la crittografia mTLS restrittiva.

  • Per tutti i PeerAuthentication nel mesh, la modalità mTLS può essere solo UNSET o STRICT, per seguire mTLS in modalità restrittiva.

Impostazioni bundle

KPT setter Descrizione
livello-di-rigore Profilo del livello di rigore del bundle Cloud Service Mesh, le opzioni sono "Low" (Basso) o "High" (Alto, predefinito)

Prima di iniziare

  1. Installa e inizializza Google Cloud CLI, che fornisce i comandi gcloud e kubectl utilizzati in queste istruzioni. Se utilizzi Cloud Shell, Google Cloud CLI è preinstallato.
  2. Installa Policy Controller v.1.11.2 o successive sul cluster con la libreria predefinita di modelli di vincolo. Devi anche attivare il supporto per i vincoli referenziali, in quanto questo bundle contiene vincoli referenziali.
  3. Assicurati che Cloud Service Mesh sia installato sul cluster.

Configura Policy Controller per i vincoli referenziali

  1. Salva il seguente manifest YAML come policycontroller-config.yaml:

    apiVersion: config.gatekeeper.sh/v1alpha1
    kind: Config
    metadata:
      name: config
      namespace: "gatekeeper-system"
    spec:
      sync:
        syncOnly:
          - group: ""
            version: "v1"
            kind: "Namespace"
          - group: "security.istio.io"
            version: "v1beta1"
            kind: "AuthorizationPolicy"
          - group: "security.istio.io"
            version: "v1beta1"
            kind: "PeerAuthentication"
    

    Questo manifest configura Policy Controller per monitorare tipi specifici di oggetti.

  2. Applica il manifest policycontroller-config.yaml:

    kubectl apply -f policycontroller-config.yaml
    

Audit del bundle di policy Cloud Service Mesh

Policy Controller consente di applicare criteri per il cluster Kubernetes. Per aiutarti a testare i tuoi workload e la loro conformità alle norme di sicurezza di Cloud Service Mesh descritte nella tabella precedente, puoi implementare questi vincoli in modalità "audit" per rivelare le violazioni e, cosa più importante, darti la possibilità di correggerle prima di applicarle al tuo cluster Kubernetes.

Puoi applicare questi criteri con spec.enforcementAction impostato su dryrun utilizzando kubectl, kpt, o Config Sync.

kubectl

  1. (Facoltativo) Visualizza l'anteprima dei vincoli dei criteri con kubectl:

    kubectl kustomize https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/asm-policy-v0.0.1
    
  2. Applica i vincoli dei criteri con kubectl:

    kubectl apply -k https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/asm-policy-v0.0.1
    

    L'output è il seguente:

    asmauthzpolicydefaultdeny.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-authz-policy-mesh-default-deny created
    asmauthzpolicynormalization.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-authz-policy-normalization created
    asmauthzpolicysafepattern.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-authz-policy-safe-pattern created
    asmingressgatewaylabel.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-ingressgateway-label created
    asmpeerauthnmeshstrictmtls.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-peer-authn-mesh-strict-mtls created
    asmpeerauthnstrictmtls.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-peer-authn-strict-mtls created
    asmrequestauthnprohibitedoutputheaders.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-request-authn-prohibited-output-headers created
    asmsidecarinjection.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-sidecar-injection created
    
  3. Verifica che i vincoli dei criteri siano stati installati e controlla se esistono violazioni nel cluster:

    kubectl get -k https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/asm-policy-v0.0.1
    

    L'output è simile al seguente:

    NAME                                                                                                       ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    asmauthzpolicydefaultdeny.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-authz-policy-mesh-default-deny   dryrun               0
    
    NAME                                                                                                     ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    asmauthzpolicynormalization.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-authz-policy-normalization   dryrun               0
    
    NAME                                                                                                  ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    asmauthzpolicysafepattern.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-authz-policy-safe-pattern   dryrun               0
    
    NAME                                                                                          ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    asmingressgatewaylabel.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-ingressgateway-label   dryrun               0
    
    NAME                                                                                                     ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    asmpeerauthnmeshstrictmtls.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-peer-authn-mesh-strict-mtls   dryrun               0
    
    NAME                                                                                            ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    asmpeerauthnstrictmtls.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-peer-authn-strict-mtls   dryrun               0
    
    NAME                                                                                                                             ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    asmrequestauthnprohibitedoutputheaders.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-request-authn-prohibited-output-headers   dryrun               0
    
    NAME                                                                                    ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    asmsidecarinjection.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-sidecar-injection   dryrun               0
    

kpt

  1. Installa e configura kpt. kpt viene utilizzato in queste istruzioni per personalizzare ed eseguire il deployment delle risorse Kubernetes.

  2. Scarica il bundle dei criteri di sicurezza di Cloud Service Mesh da GitHub utilizzando kpt:

    kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/asm-policy-v0.0.1
    
  3. Esegui la funzione kpt set-enforcement-action per impostare l'azione di applicazione delle policy su dryrun:

    kpt fn eval asm-policy-v0.0.1 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 \
      -- enforcementAction=dryrun
    
  4. Esegui la funzione setter di kpt per impostare i campi specifici dei criteri di sicurezza di Cloud Service Mesh:

    kpt fn eval asm-policy-v0.0.1 --image gcr.io/kpt-fn/apply-setters:v0.2.0 -- \
    strictness-level="Low"
    
  5. Inizializza la directory di lavoro con kpt, che crea una risorsa per monitorare le modifiche:

    cd asm-policy-v0.0.1
    kpt live init
    
  6. Applica i vincoli dei criteri con kpt:

    kpt live apply
    

    L'output è il seguente:

    asmauthzpolicydefaultdeny.constraints.gatekeeper.sh/asm-authz-policy-mesh-default-deny created
    asmauthzpolicynormalization.constraints.gatekeeper.sh/asm-authz-policy-normalization created
    asmauthzpolicysafepattern.constraints.gatekeeper.sh/asm-authz-policy-safe-pattern created
    asmingressgatewaylabel.constraints.gatekeeper.sh/asm-ingressgateway-label created
    asmpeerauthnmeshstrictmtls.constraints.gatekeeper.sh/asm-peer-authn-mesh-strict-mtls created
    asmpeerauthnstrictmtls.constraints.gatekeeper.sh/asm-peer-authn-strict-mtls created
    asmsidecarinjection.constraints.gatekeeper.sh/asm-sidecar-injection created
    7 resource(s) applied. 7 created, 0 unchanged, 0 configured, 0 failed
    
  7. Verifica che i vincoli dei criteri siano stati installati e controlla se esistono violazioni nel cluster:

    kpt live status --output table --poll-until current
    

    Lo stato CURRENT conferma l'installazione riuscita dei vincoli.

Config Sync

  1. Installa e configura kpt. kpt viene utilizzato in queste istruzioni per personalizzare ed eseguire il deployment delle risorse Kubernetes.

Gli operatori che utilizzano Config Sync per eseguire il deployment dei criteri nei propri cluster possono utilizzare le seguenti istruzioni:

  1. Passa alla directory di sincronizzazione per Config Sync:

    cd SYNC_ROOT_DIR
    

    Per creare o aggiungere .gitignore con resourcegroup.yaml:

    echo resourcegroup.yaml >> .gitignore
    

  2. Crea una directory policies dedicata:

    mkdir -p policies
    
  3. Scarica il bundle dei criteri di sicurezza di Cloud Service Mesh da GitHub utilizzando kpt:

    kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/asm-policy-v0.0.1 policies/asm-policy-v0.0.1
    
  4. Esegui la funzione kpt set-enforcement-action per impostare l'azione di applicazione delle policy su dryrun:

    kpt fn eval policies/asm-policy-v0.0.1 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=dryrun
    
  5. Esegui la funzione setter di kpt per impostare i campi specifici dei criteri di sicurezza di Cloud Service Mesh:

    kpt fn eval policies/asm-policy-v0.0.1 --image gcr.io/kpt-fn/apply-setters:v0.2.0 -- \
    strictness-level="Low"
    
  6. (Facoltativo) Visualizza l'anteprima dei vincoli delle norme da creare:

    kpt live init policies/asm-policy-v0.0.1
    kpt live apply --dry-run policies/asm-policy-v0.0.1
    

    L'output è il seguente:

    Dry-run strategy: client
    inventory update started
    inventory update finished
    apply phase started
    asmauthzpolicydefaultdeny.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-authz-policy-mesh-default-deny apply successful
    asmauthzpolicynormalization.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-authz-policy-normalization apply successful
    asmauthzpolicysafepattern.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-authz-policy-safe-pattern apply successful
    asmingressgatewaylabel.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-ingressgateway-label apply successful
    asmpeerauthnmeshstrictmtls.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-peer-authn-mesh-strict-mtls apply successful
    asmpeerauthnstrictmtls.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-peer-authn-strict-mtls apply successful
    asmrequestauthnprohibitedoutputheaders.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-request-authn-prohibited-output-headers apply successful
    asmsidecarinjection.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-sidecar-injection apply successful
    apply phase finished
    inventory update started
    inventory update finished
    apply result: 8 attempted, 8 successful, 0 skipped, 0 failed
    
  7. Se la directory di sincronizzazione per Config Sync utilizza Kustomize, aggiungi policies/asm-policy-v0.0.1 alla radice kustomization.yaml. In caso contrario, rimuovi il file policies/asm-policy-v0.0.1/kustomization.yaml:

    rm SYNC_ROOT_DIR/policies/asm-policy-v0.0.1/kustomization.yaml
    
  8. Esegui il push delle modifiche nel repository Config Sync:

    git add SYNC_ROOT_DIR/policies/asm-policy-v0.0.1
    git commit -m 'Adding ASM security policy audit enforcement'
    git push
    
  9. Verifica lo stato dell'installazione:

    watch gcloud beta container fleet config-management status --project PROJECT_ID
    

    Lo stato SYNCED conferma l'installazione dei criteri.

Visualizzare le violazioni delle norme

Una volta installati i vincoli dei criteri in modalità audit, le violazioni nel cluster possono essere visualizzate nell'interfaccia utente utilizzando la dashboard di Policy Controller.

Puoi anche utilizzare kubectl per visualizzare le violazioni nel cluster utilizzando il seguente comando:

kubectl get constraint -l policycontroller.gke.io/bundleName=asm-policy-v0.0.1 -o json | jq -cC '.items[]| [.metadata.name,.status.totalViolations]'

Se sono presenti violazioni, è possibile visualizzare un elenco dei messaggi di violazione per vincolo con:

kubectl get constraint -l policycontroller.gke.io/bundleName=asm-policy-v0.0.1 -o json | jq -C '.items[]| select(.status.totalViolations>0)| [.metadata.name,.status.violations[]?]'

Modificare l'azione di applicazione del bundle di criteri di Cloud Service Mesh

Dopo aver esaminato le violazioni delle norme nel cluster, puoi valutare la possibilità di modificare la modalità di applicazione in modo che il controller di ammissione warn o addirittura deny blocchi l'applicazione al cluster della risorsa non conforme.

kubectl

  1. Utilizza kubectl per impostare l'azione di applicazione delle norme su warn:

    kubectl get constraint -l policycontroller.gke.io/bundleName=asm-policy-v0.0.1 -o name | xargs -I {} kubectl patch {} --type='json' -p='[{"op":"replace","path":"/spec/enforcementAction","value":"warn"}]'
    
  2. Verifica che l'azione di applicazione dei vincoli dei criteri sia stata aggiornata:

    kubectl get constraint -l policycontroller.gke.io/bundleName=asm-policy-v0.0.1
    

kpt

  1. Esegui la funzione kpt set-enforcement-action per impostare l'azione di applicazione delle policy su warn:

    kpt fn eval -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=warn
    
  2. Applica i vincoli dei criteri:

    kpt live apply
    

Config Sync

Gli operatori che utilizzano Config Sync per eseguire il deployment dei criteri nei propri cluster possono utilizzare le seguenti istruzioni:

  1. Passa alla directory di sincronizzazione per Config Sync:

    cd SYNC_ROOT_DIR
    
  2. Esegui la funzione kpt set-enforcement-action per impostare l'azione di applicazione delle policy su warn:

    kpt fn eval policies/asm-policy-v0.0.1 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=warn
    
  3. Esegui il push delle modifiche nel repository Config Sync:

    git add SYNC_ROOT_DIR/policies/asm-policy-v0.0.1
    git commit -m 'Adding ASM security policy bundle warn enforcement'
    git push
    
  4. Verifica lo stato dell'installazione:

    nomos status
    

    Il cluster dovrebbe mostrare lo stato SYNCED con i criteri installati.

Testare l'applicazione delle norme

Crea una risorsa non conforme sul cluster utilizzando il seguente comando:

cat <<EOF | kubectl apply -f -
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: non-compliant-authz-policy
spec:
  action: ALLOW
  rules:
  - to:
    - operation:
        methods: ["get"]
EOF

Il controller di ammissione deve generare un avviso che elenca le violazioni delle norme che questa risorsa viola, come mostrato nell'esempio seguente:

Warning: [asm-policy-v0.0.1-asm-authz-policy-normalization] in rules-to-operation, methods or notMethods must be uppercase
authorizationpolicy.security.istio.io/non-compliant-authz-policy created

Rimuovi il bundle di policy Cloud Service Mesh

Se necessario, il pacchetto di policy Cloud Service Mesh può essere rimosso dal cluster.

kubectl

  • Utilizza kubectl per rimuovere i criteri:

    kubectl delete constraint -l policycontroller.gke.io/bundleName=asm-policy-v0.0.1
    

kpt

  • Rimuovi le policy:

    kpt live destroy
    

Config Sync

Gli operatori che utilizzano Config Sync per eseguire il deployment dei criteri nei propri cluster possono utilizzare le seguenti istruzioni:

  1. Esegui il push delle modifiche nel repository Config Sync:

    git rm -r SYNC_ROOT_DIR/policies/asm-policy-v0.0.1
    git commit -m 'Removing Cloud Service Mesh  policies'
    git push
    
  2. Verifica lo stato:

    nomos status
    

    Il cluster dovrebbe mostrare lo stato SYNCED con le risorse rimosse.