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 campihosts
onotHosts
possono essere utilizzati solo selezionando il gateway di ingresso Istio con l'etichettaistio:ingressgateway
.In
AuthorizationPolicy
, quando vengono utilizzati i campimethods
onotMethods
, i valori devono essere in lettere maiuscole.In
AuthorizationPolicy
, quando viene utilizzato il camporequest.headers
, i valori non possono contenere spazi.In
AuthorizationPolicy
, quando vengono utilizzati i campipaths
onotPaths
, 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 campihosts
onotHosts
, 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 soloUNSET
oSTRICT
, 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
- Installa e inizializza
Google Cloud CLI,
che fornisce i comandi
gcloud
ekubectl
utilizzati in queste istruzioni. Se utilizzi Cloud Shell, Google Cloud CLI è preinstallato. - 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.
- Assicurati che Cloud Service Mesh sia installato sul cluster.
Configura Policy Controller per i vincoli referenziali
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.
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
(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
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
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
Installa e configura kpt. kpt viene utilizzato in queste istruzioni per personalizzare ed eseguire il deployment delle risorse Kubernetes.
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
Esegui la funzione kpt
set-enforcement-action
per impostare l'azione di applicazione delle policy sudryrun
:kpt fn eval asm-policy-v0.0.1 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 \ -- enforcementAction=dryrun
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"
Inizializza la directory di lavoro con kpt, che crea una risorsa per monitorare le modifiche:
cd asm-policy-v0.0.1 kpt live init
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
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
- 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:
Passa alla directory di sincronizzazione per Config Sync:
cd SYNC_ROOT_DIR
Per creare o aggiungere
.gitignore
conresourcegroup.yaml
:echo resourcegroup.yaml >> .gitignore
Crea una directory
policies
dedicata:mkdir -p policies
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
Esegui la funzione kpt
set-enforcement-action
per impostare l'azione di applicazione delle policy sudryrun
:kpt fn eval policies/asm-policy-v0.0.1 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=dryrun
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"
(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
Se la directory di sincronizzazione per Config Sync utilizza Kustomize, aggiungi
policies/asm-policy-v0.0.1
alla radicekustomization.yaml
. In caso contrario, rimuovi il filepolicies/asm-policy-v0.0.1/kustomization.yaml
:rm SYNC_ROOT_DIR/policies/asm-policy-v0.0.1/kustomization.yaml
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
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
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"}]'
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
Esegui la funzione kpt
set-enforcement-action
per impostare l'azione di applicazione delle policy suwarn
:kpt fn eval -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=warn
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:
Passa alla directory di sincronizzazione per Config Sync:
cd SYNC_ROOT_DIR
Esegui la funzione kpt
set-enforcement-action
per impostare l'azione di applicazione delle policy suwarn
:kpt fn eval policies/asm-policy-v0.0.1 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=warn
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
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:
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
Verifica lo stato:
nomos status
Il cluster dovrebbe mostrare lo stato
SYNCED
con le risorse rimosse.