Questa pagina mostra come applicare i controlli di sicurezza predefiniti a livello di pod
nei tuoi cluster Google Kubernetes Engine (GKE) utilizzando l'ammissione PodSecurity
un controller di deployment.
Per ulteriori informazioni sul funzionamento di PodSecurity
, consulta
Ingresso sicurezza pod.
Panoramica
PodSecurity
è un controller di ammissione Kubernetes che ti consente di applicare
Standard di sicurezza dei pod
ai pod in esecuzione sui tuoi cluster GKE. Gli standard di sicurezza dei pod
criteri di sicurezza predefiniti che coprono le esigenze di alto livello della sicurezza dei pod
in Kubernetes. Questi criteri variano da altamente permissivi ad altamente
ristrittivi.
Puoi applicare i seguenti standard di sicurezza dei pod ai tuoi cluster GKE:
- Con privilegi: un criterio senza limitazioni che offre il livello più ampio di autorizzazioni aggiuntive. Consente le escalation dei privilegi note.
- Base di riferimento: un criterio minimamente restrittivo che consente il valore predefinito, minimamente specificata. Impedisce le escalation dei privilegi note.
- Con restrizioni: un criterio molto restrittivo che segue le migliori pratiche di hardening dei pod.
Puoi utilizzare il controller di ammissione PodSecurity
per applicare la sicurezza dei pod
Standard nelle seguenti modalità:
- Applica: le violazioni dei criteri rifiutano la creazione dei pod. È stato aggiunto un evento di controllo nel log di controllo.
- Controllo: le violazioni dei criteri attivano l'aggiunta di un evento di controllo al log di controllo. La creazione di pod è consentita.
- Avvisa: le violazioni delle norme attivano un avviso rivolto agli utenti. La creazione del pod è consentito.
Il controller di ammissione PodSecurity
incorpora questi criteri nell'API Kubernetes.
Se vuoi creare e applicare criteri di sicurezza personalizzati a livello di pod, valuta utilizzando Gatekeeper controller di ammissione.
Prima di iniziare
Prima di iniziare, assicurati di aver eseguito le seguenti operazioni:
- Attiva l'API Google Kubernetes Engine. Abilita l'API Google Kubernetes Engine
- Se vuoi utilizzare Google Cloud CLI per questa attività,
installa e poi
inizializza gcloud CLI. Se hai già installato gcloud CLI, ottieni la versione più recente eseguendo
gcloud components update
.
- Assicurati di avere un cluster GKE Autopilot
Cluster standard con versione 1.23 o successive.
- Per i cluster Autopilot, registrati a un canale di rilascio in cui la versione predefinita è 1.23 o successiva.
- Per i cluster standard, registrati a un canale di rilascio o esegui l'upgrade del cluster a una versione specifica.
Requisiti
Il controller di ammissione PodSecurity
è disponibile e abilitato per impostazione predefinita nei cluster che eseguono le seguenti versioni di GKE:
- Versione 1.25 o successive: stabile
- Versione 1.23 e versione 1.24: Beta
Per verificare se una versione di GKE è disponibile ed è la versione predefinita per il tuo canale di rilascio, consulta la programmazione delle release.
Applica gli standard di sicurezza dei pod utilizzando PodSecurity
Per utilizzare il controller di ammissione PodSecurity
, devi applicare standard di sicurezza dei pod specifici
in determinate modalità a spazi dei nomi specifici. Puoi farlo utilizzando le etichette dello spazio dei nomi.
In questo esercizio:
- Crea due nuovi spazi dei nomi
- Applica i criteri di sicurezza a ogni spazio dei nomi
- Testa i criteri configurati
Nelle seguenti versioni di GKE, GKE ignora le norme
che applichi allo spazio dei nomi kube-system
:
- 1.23.6-gke.1900 e versioni successive
- 1.24.0-gke.1200 e versioni successive
Nelle versioni precedenti di GKE, evita di applicare criteri
kube-system
.
Crea nuovi spazi dei nomi
Crea spazi dei nomi nel tuo cluster:
kubectl create ns baseline-ns
kubectl create ns restricted-ns
Questo comando crea i seguenti spazi dei nomi:
baseline-ns
: per carichi di lavoro permissivirestricted-ns
: per carichi di lavoro altamente limitati
Utilizza le etichette per applicare i criteri di sicurezza
Applica i seguenti standard di sicurezza dei pod:
baseline
: applica abaseline-ns
in modalitàwarn
restricted
: applica arestricted-ns
in modalitàenforce
kubectl label --overwrite ns baseline-ns pod-security.kubernetes.io/warn=baseline
kubectl label --overwrite ns restricted-ns pod-security.kubernetes.io/enforce=restricted
Questi comandi ottengono i seguenti risultati:
- Carichi di lavoro nello spazio dei nomi
baseline-ns
che violano il criteriobaseline
sono consentiti e il client visualizza un messaggio di avviso. - Carichi di lavoro nello spazio dei nomi
restricted-ns
che violanorestricted
vengono rifiutati e GKE aggiunge una voce agli audit log.
Verifica che le etichette siano state aggiunte:
kubectl get ns --show-labels
L'output è simile al seguente:
baseline-ns Active 74s kubernetes.io/metadata.name=baseline-ns,pod-security.kubernetes.io/warn=baseline
restricted-ns Active 18s kubernetes.io/metadata.name=restricted-ns,pod-security.kubernetes.io/enforce=restricted
default Active 57m kubernetes.io/metadata.name=default
kube-public Active 57m kubernetes.io/metadata.name=kube-public
kube-system Active 57m kubernetes.io/metadata.name=kube-system
Testa i criteri configurati
Per verificare che il controller di ammissione PodSecurity
funzioni come previsto, distribuisci un carico di lavoro che violi i criteri baseline
e restricted
in entrambi gli spazi dei nomi. Il manifest di esempio seguente esegue il deployment di un container nginx
che consente l'escalation dei privilegi.
Salva il seguente manifest come
psa-workload.yaml
:apiVersion: v1 kind: Pod metadata: name: nginx labels: app: nginx spec: containers: - name: nginx image: nginx securityContext: privileged: true
Applica il manifest allo spazio dei nomi
baseline-ns
:kubectl apply -f psa-workload.yaml --namespace=baseline-ns
L'output è simile al seguente:
Warning: would violate PodSecurity "baseline:latest": privileged (container "nginx" must not set securityContext.privileged=true)
Il criterio
baseline
consente di eseguire il deployment del pod nello spazio dei nomi.Verifica che il deployment del pod sia andato a buon fine:
kubectl get pods --namespace=baseline-ns -l=app=nginx
Applica il manifest allo spazio dei nomi
restricted-ns
:kubectl apply -f psa-workload.yaml --namespace=restricted-ns
L'output è simile al seguente:
Error from server (Forbidden): error when creating "workload.yaml": pods "nginx" is forbidden: violates PodSecurity "restricted:latest": allowPrivilegeEscalation != false (container "nginx" must set securityContext.allowPrivilegeEscalation=false), unrestricted capabilities (container "nginx" must set securityContext.capabilities.drop=["ALL"]), runAsNonRoot != true (pod or container "nginx" must set securityContext.runAsNonRoot=true), seccompProfile (pod or container "nginx" must set securityContext.seccompProfile.type to "RuntimeDefault" or "Localhost")
Il pod non esegue il deployment nello spazio dei nomi. Viene aggiunta una voce di controllo nel log.
Visualizza le violazioni dei criteri negli audit log
Le violazioni dei criteri nelle modalità audit
e enforce
vengono registrate negli audit log per il cluster. Puoi visualizzare questi log utilizzando Esplora log nella console Google Cloud.
Vai alla pagina Esplora log nella console Google Cloud.
Nel campo Query, specifica quanto segue per recuperare i log di controllo in modalità
audit
eenforce
:resource.type="k8s_cluster" protoPayload.resourceName:"/pods/nginx" protoPayload.methodName="io.k8s.core.v1.pods.create" (labels."pod-security.kubernetes.io/audit-violations":"PodSecurity" OR protoPayload.response.reason="Forbidden")
Fai clic su Esegui query.
Nella sezione Risultati delle query, espandi la voce di log
Forbidden
per esaminare i log di rifiuto della modalitàenforce
. I dettagli sono simili ai seguenti:{ ... protoPayload: { @type: "type.googleapis.com/google.cloud.audit.AuditLog" authenticationInfo: {1} authorizationInfo: [1] methodName: "io.k8s.core.v1.pods.create" request: {6} requestMetadata: {2} resourceName: "core/v1/namespaces/restricted-ns/pods/nginx" response: { @type: "core.k8s.io/v1.Status" apiVersion: "v1" code: 403 details: {2} kind: "Status" message: "pods "nginx" is forbidden: violates PodSecurity "restricted:latest": privileged (container "nginx" must not set securityContext.privileged=true), allowPrivilegeEscalation != false (container "nginx" must set securityContext.allowPrivilegeEscalation=false), unrestricted capabilities (container "nginx" must set securityContext.capabilities.drop=["ALL"]), runAsNonRoot != true (pod or container "nginx" must set securityContext.runAsNonRoot=true), seccompProfile (pod or container "nginx" must set securityContext.seccompProfile.type to "RuntimeDefault" or "Localhost")" metadata: {0} reason: "Forbidden" status: "Failure" } serviceName: "k8s.io" status: {2} } receiveTimestamp: "2022-02-01T19:19:25.353235326Z" resource: {2} timestamp: "2022-02-01T19:19:21.469360Z" }
Espandi la voce di log
audit-violations
per esaminare i log della modalitàaudit
. I dettagli sono simili ai seguenti:{ ... labels: { ... pod-security.kubernetes.io/audit-violations: "would violate PodSecurity "baseline:latest": privileged (container "nginx" must not set securityContext.privileged=true)" pod-security.kubernetes.io/enforce-policy: "privileged:latest" } operation: {4} protoPayload: {10} receiveTimestamp: "2023-12-26T05:18:04.533631468Z" resource: {2} timestamp: "2023-12-26T05:17:36.102387Z" }
Esegui la pulizia
Per evitare che al tuo account Google Cloud vengano addebitati costi, elimina gli spazi dei nomi:
kubectl delete ns baseline-ns
kubectl delete ns restricted-ns
Alternative a PodSecurity
Oltre a utilizzare il controller di ammissione PodSecurity
di Kubernetes integrato per applicare gli standard di sicurezza dei pod, puoi anche utilizzare Gatekeeper, un controller di ammissione basato su Open Policy Agent (OPA), per creare e applicare controlli di sicurezza personalizzati a livello di pod.
Passaggi successivi
- Scopri di più sugli standard di sicurezza dei pod.
- Scopri di più sul
PodSecurity
controller di ammissione. - Esegui la migrazione da PodSecurityPolicy al controller di ammissione
PodSecurity
.