Applica criteri di sicurezza predefiniti a livello di pod utilizzando PodSecurity


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 permissivi restrittive.

Puoi applicare i seguenti standard di sicurezza dei pod a GKE cluster:

  • Con privilegi: un criterio senza limitazioni che offre il livello più ampio di autorizzazioni aggiuntive. Consente l'escalation dei privilegi noti.
  • Base di riferimento: un criterio minimamente restrittivo che consente il valore predefinito, minimamente specificata. Impedisce le escalation note dei privilegi.
  • Limitato: un criterio altamente restrittivo che segue al meglio la protezione dei pod pratiche.

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 del 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.
  • Avviso: le violazioni delle norme attivano un avviso rivolto agli utenti. La creazione del pod è consentito.

Il controller di ammissione PodSecurity incorpora questi criteri in Kubernetes API.

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 attività:

  • Attiva l'API Google Kubernetes Engine.
  • Abilita l'API Google Kubernetes Engine .
  • Se vuoi utilizzare Google Cloud CLI per questa attività, install e poi initialize con gcloud CLI. Se hai già installato gcloud CLI, scarica la versione più recente eseguendo gcloud components update.

Requisiti

Il controller di ammissione PodSecurity è disponibile e abilitato per impostazione predefinita su che eseguono le seguenti versioni GKE:

  • Versione 1.25 o successive: stabile
  • Versione 1.23 e versione 1.24: Beta

Per verificare se è disponibile una versione GKE e che è quella predefinita per il tuo canale di rilascio, fai riferimento Programma 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 imparerai a:

  • Crea due nuovi spazi dei nomi
  • Applica criteri di sicurezza a ogni spazio dei nomi
  • Testa i criteri configurati

Nelle seguenti versioni di GKE, GKE ignora i criteri 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 in 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 permissivi
  • restricted-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 a baseline-ns in modalità warn
  • restricted: applica a restricted-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 criterio baseline sono consentiti e il client visualizza un messaggio di avviso.
  • Carichi di lavoro nello spazio dei nomi restricted-ns che violano restricted 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, esegui il deployment un carico di lavoro che viola i criteri baseline e restricted per entrambi spazi dei nomi. Il manifest di esempio seguente esegue il deployment di un container nginx che consente l'escalation dei privilegi.

  1. 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
    
  2. 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.

  3. Verifica che il deployment del pod sia andato a buon fine:

    kubectl get pods --namespace=baseline-ns -l=app=nginx
    
  4. 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 delle norme nelle modalità audit e enforce vengono registrate nel controllo log per il tuo cluster. Puoi visualizzare questi log utilizzando Esplora log nel nella console Google Cloud.

  1. Vai alla pagina Esplora log nella console Google Cloud.

    Vai a Esplora log

  2. Nel campo Query, specifica quanto segue per recuperare gli audit log in modalità audit e enforce:

    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")
    
  3. Fai clic su Esegui query.

  4. 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"
    }
    
  5. 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 Kubernetes integrato per applicare gli standard di sicurezza dei pod, puoi anche utilizzare Gatekeeper, un basato sull'Open Policy Agent (OPA), per creare e applicare Controlli di sicurezza a livello di pod.

Passaggi successivi