Utilizzo dei criteri di sicurezza pod con Kubernetes Engine (OKE)

Scopri come utilizzare i criteri di sicurezza dei pod con i cluster Kubernetes creati utilizzando Kubernetes Engine (OKE).

Nota

I criteri di sicurezza dei pod non più validi del progetto Kubernetes a monte in Kubernetes versione 1.21 e hanno rimosso la funzione in Kubernetes versione 1.25. Di conseguenza, Kubernetes Engine non supporta i criteri di sicurezza dei pod e il controller di ammissione PodSecurityPolicy nei cluster su cui è in esecuzione Kubernetes versione 1.25 e successive.

Se hai bisogno di funzionalità simili, prendi in considerazione l'utilizzo degli standard di sicurezza dei pod Kubernetes e del controller di ammissione PodSecurity (insieme ai criteri Privileged, Baseline e Restricted). Per impostazione predefinita, Kubernetes Engine abilita il controller di ammissione PodSecurity nei cluster su cui è in esecuzione Kubernetes versione 1.23 e successive, al fine di supportare gli standard di sicurezza dei pod. Per ulteriori informazioni sugli standard di sicurezza dei pod Kubernetes e sul controller di ammissione PodSecurity, vedere Pod Security Standards nella documentazione di Kubernetes.

In alternativa, prendi in considerazione l'utilizzo di altre alternative in fase di sviluppo nell'ecosistema Kubernetes per applicare i criteri.

Se si decide di passare dall'utilizzo dei criteri di sicurezza dei pod e del controller di ammissione PodSecurityPolicy all'utilizzo degli standard di sicurezza dei pod e del controller di ammissione PodSecurity, vedere Eseguire la migrazione da PodSecurityPolicy al controller di ammissione PodSecurity integrato nella documentazione Kubernetes. Tenere presente che è importante completare la migrazione prima di creare un nuovo cluster su cui è in esecuzione Kubernetes versione 1.25 o prima di eseguire l'upgrade di un cluster Kubernetes versione 1.24 esistente per eseguire Kubernetes versione 1.25. Tenere inoltre presente che la console fornisce un modo conveniente per disabilitare l'uso del controller di ammissione PodSecurityPolicy nei cluster Kubernetes esistenti creati e gestiti da Kubernetes Engine (vedere Uso della console per disabilitare il controller di ammissione PodSecurityPolicy).

Puoi controllare le operazioni che i pod possono eseguire su un cluster creato con Kubernetes Engine impostando i criteri di sicurezza dei pod per il cluster. I criteri di sicurezza dei pod sono un modo per garantire che i pod soddisfino le condizioni relative alla sicurezza prima che possano essere accettati da un cluster. Ad esempio, è possibile utilizzare i criteri di sicurezza pod per:

  • limitare le scelte di storage disponibili per i pod
  • limitare la rete dell'host e le porte a cui i pod possono accedere
  • impedire l'esecuzione dei pod come utente root
  • impedire l'esecuzione dei pod in modalità privilegiata

Puoi anche utilizzare i criteri di sicurezza pod per fornire i valori predefiniti per i pod, 'mutando' il pod.

Dopo aver definito un criterio di sicurezza pod per un cluster, è necessario autorizzare l'account di servizio dell'utente richiedente o del pod di destinazione a utilizzare il criterio. Per eseguire questa operazione, creare un ruolo (o clusterrole) per accedere al criterio di sicurezza pod, quindi creare un'associazione di ruoli (o clusterrolebinding) tra il ruolo (o clusterrole) e l'account di servizio dell'utente o del pod di destinazione richiedente. Per ulteriori informazioni su ruoli, clusterroles e associazioni, vedere Informazioni sul controllo dell'accesso e su Kubernetes Engine (OKE).

È possibile specificare se un cluster applica i criteri di sicurezza pod definiti per esso abilitando il controller di ammissione PodSecurityPolicy del cluster. Il controller di ammissione PodSecurityPolicy agisce sulla creazione e la modifica di un pod e determina se il pod deve essere ammesso al cluster in base al contesto di sicurezza richiesto nella specifica pod e nei criteri di sicurezza pod del cluster. Se esistono più criteri di sicurezza pod, il controller di ammissione PodSecurityPolicy confronta innanzitutto il pod con i criteri di non mutazione in ordine alfabetico e utilizza il primo criterio che convalida correttamente il pod. Se nessun pod non mutante convalida il pod, il controller di ammissione PodSecurityPolicy confronta il pod con i criteri mutanti in ordine alfabetico e utilizza il primo criterio che convalida correttamente il pod.

Attenzione

Attenzione 1:

È molto importante notare che quando si abilita il controller di ammissione PodSecurityPolicy di un cluster, nessun pod applicazione può iniziare nel cluster a meno che non esistano criteri di sicurezza pod appropriati, insieme a ruoli (o clusterroles) e associazioni di ruoli (o clusterrolebindings) per associare i pod ai criteri. Non sarà possibile eseguire pod applicazione su un cluster con un controller di ammissione PodSecurityPolicy abilitato a meno che questi prerequisiti non vengano soddisfatti.

Si consiglia vivamente di utilizzare i controller di ammissione PodSecurityPolicy come segue:

  • Ogni volta che si crea un nuovo cluster, abilitare Pod Security Admission Controller.
  • Subito dopo aver creato un nuovo cluster, creare i criteri di sicurezza pod, insieme a ruoli (o clusterroles) e associazioni di ruoli (o clusterrolebindings).

Attenzione 2:

È necessario creare criteri di sicurezza pod prima di abilitare il controller di ammissione PodSecurityPolicy di un cluster esistente già in produzione (ovvero, un po' di tempo dopo la creazione). Se si decide di abilitare il controller di ammissione PodSecurityPolicy di un cluster esistente, si consiglia di verificare prima i criteri di sicurezza dei pod del cluster in un ambiente di sviluppo o di test. In questo modo, puoi essere sicuro che i criteri di sicurezza dei pod funzionino come previsto e consentire correttamente (o rifiutare) l'avvio dei pod sul cluster.

Quando si abilita il controller di ammissione PodSecurityPolicy di un cluster creato con Kubernetes Engine, viene creato automaticamente un criterio di sicurezza pod per i pod con privilegi di sistema Kubernetes (insieme al clusterrole e al clusterrolebinding associati). Questo criterio di sicurezza pod, nonché clusterrole e clusterrolebinding, consentono l'esecuzione dei pod del sistema Kubernetes. I criteri di sicurezza pod, clusterrole e clusterrolebinding sono definiti nel file kube-system.yaml (vedere kube-system.yaml Reference).

Tenere presente che è possibile creare criteri di sicurezza pod per un cluster prima di abilitare il controller di ammissione PodSecurityPolicy del cluster. È inoltre possibile disabilitare il controller di ammissione PodSecurityPolicy di un cluster abilitato in precedenza. In questo caso, i criteri di sicurezza pod, i ruoli (o i clusterroles) e le associazioni di ruoli (o le associazioni di ruoli cluster) creati in precedenza non vengono eliminati. I criteri di sicurezza pod non vengono semplicemente applicati. Qualsiasi pod dell'applicazione potrà essere eseguito sul cluster.

Per ulteriori informazioni sui criteri di sicurezza dei pod e sul controller di ammissione PodSecurityPolicy, consulta la documentazione di Kubernetes.

Creazione di un criterio di sicurezza pod per i pod applicazione

Per creare un criterio di sicurezza pod per i pod dell'applicazione, creare un ruolo per accedere al criterio di sicurezza pod e creare un'associazione di ruoli per consentire ai pod dell'applicazione di utilizzare il criterio di sicurezza pod:

  1. Creare il criterio di sicurezza pod per i pod applicazione:
    1. Definire e salvare il criterio di sicurezza pod in un file. Ad esempio, in acme-app-psp.yaml).

      Ad esempio, questo criterio (preso dalla documentazione di Kubernetes) impedisce semplicemente la creazione di pod con privilegi:

      
      apiVersion: policy/v1beta1
      kind: PodSecurityPolicy
      metadata:
        name: acme-app-psp
      spec:
        privileged: false  # Don't allow privileged pods!
        # The rest fills in some required fields.
        seLinux:
          rule: RunAsAny
        supplementalGroups:
          rule: RunAsAny
        runAsUser:
          rule: RunAsAny
        fsGroup:
          rule: RunAsAny
        volumes:
        - '*'
    2. Immettere il comando seguente per creare il criterio di sicurezza pod:

      kubectl create -f <filename>.yaml

      Ad esempio:

      kubectl create -f acme-app-psp.yaml
  2. Creare il ruolo (o clusterrole) per accedere al criterio di sicurezza pod:
    1. Definire e salvare un ruolo (o clusterrole) in un file. Ad esempio, in acme-app-psp-crole.yaml.

      Ad esempio:

      # Cluster role which grants access to the app pod security policy
      apiVersion: rbac.authorization.k8s.io/v1
      kind: ClusterRole
      metadata:
        name: acme-app-psp-crole
      rules:
      - apiGroups:
        - policy
        resourceNames:
        - acme-app-psp
        resources:
        - podsecuritypolicies
        verbs:
        - use
      
    2. Immettere il comando seguente per creare il ruolo (o clusterrole):

      kubectl create -f <filename>.yaml

      Ad esempio:

      kubectl create -f acme-app-psp-crole.yaml
  3. Creare l'associazione dei ruoli (o clusterrolebinding) per autorizzare i pod dell'applicazione a utilizzare il criterio di sicurezza pod:
    1. Definire e salvare l'associazione dei ruoli (o clusterrolebinding) in un file. Ad esempio, in acme-app-psp-crole-bind.yaml.

      Ad esempio:

      
      # Role binding which grants access to the app pod security policy
      apiVersion: rbac.authorization.k8s.io/v1
      kind: RoleBinding
      metadata:
        name: acme-app-psp-binding
        namespace: acme-namespace
      roleRef:
        apiGroup: rbac.authorization.k8s.io
        kind: ClusterRole
        name: acme-app-psp-crole
      subjects:
      # For all service accounts in acme-namespace
      - apiGroup: rbac.authorization.k8s.io
        kind: Group
        name: system:serviceaccounts:acme-namespace
    2. Immettere il comando seguente per creare l'associazione ruoli (o clusterrolebinding):

      kubectl create -f <filename>.yaml

      Ad esempio:

      kubectl create -f acme-app-psp-crole-bind.yaml

Dopo aver definito un criterio di sicurezza pod e aver autorizzato i pod dell'applicazione a utilizzarlo creando un ruolo e un'associazione di ruoli (o un clusterrole e un clusterrolebinding), abilitare il controller di ammissione PodSecurityPolicy del cluster per applicare il criterio di sicurezza pod (se non è già abilitato).

Utilizzo della console per abilitare il controller di ammissione PodSecurityPolicy

Per abilitare il controller di ammissione PodSecurityPolicy durante la creazione di nuovi cluster mediante la console, effettuare le operazioni riportate di seguito.

  1. Eseguire il login a Console.
  2. Seguire le istruzioni per creare un nuovo cluster in Uso della console per creare un cluster con impostazioni definite in modo esplicito nel workflow 'Creazione personalizzata', fare clic su Mostra opzioni avanzate e selezionare l'opzione Criteri di sicurezza pod - Applicati. Questa opzione abilita il controller di ammissione PodSecurityPolicy.

    Nessun pod applicazione verrà accettato nel nuovo cluster a meno che non esistano criteri di sicurezza pod appropriati, insieme a ruoli (o clusterroles) e associazioni di ruoli (o clusterrolebindings) per associare i pod ai criteri.

  3. Seguire le istruzioni per impostare i dettagli del cluster rimanenti e fare clic su Crea cluster per creare il nuovo cluster.
  4. Seguire le istruzioni in Creazione di un criterio di sicurezza pod per i pod applicativi per creare criteri di sicurezza pod per il controller di ammissione PodSecurityPolicy da applicare quando si accettano i pod nel nuovo cluster.

Per abilitare il controller di ammissione PodSecurityPolicy nei cluster esistenti utilizzando la console, effettuare le operazioni riportate di seguito.

  1. Seguire le istruzioni in Creazione di un criterio di sicurezza pod per i pod applicativi per creare criteri di sicurezza pod per il controller di ammissione PodSecurityPolicy da applicare quando si accettano i pod nel cluster esistente.

    Si consiglia di verificare prima i criteri di sicurezza pod in un ambiente di sviluppo o di test. In questo modo, puoi essere sicuro che i criteri di sicurezza dei pod funzionino come previsto e consentire correttamente (o rifiutare) l'avvio dei pod sul cluster.

  2. Aprire il menu di navigazione e selezionare Developer Services. In Container e artifact, selezionare Cluster Kubernetes (OKE).
  3. Scegliere un compartimento in cui si dispone dell'autorizzazione per lavorare.
  4. Nella pagina Elenco cluster fare clic sul nome del cluster che si desidera modificare.
  5. Nella scheda Dettagli cluster, fare clic su Non applicato accanto a Criteri di sicurezza pod.
  6. Nella finestra Criteri di sicurezza pod, selezionare Applicato.

    D'ora in poi, nessun nuovo pod applicazione verrà accettato nel cluster a meno che non esistano criteri di sicurezza pod appropriati, insieme a ruoli (o clusterroles) e associazioni di ruoli (o clusterrolebindings) per associare i pod ai criteri. Si noti che tutti i pod attualmente in esecuzione continueranno a essere eseguiti indipendentemente.

  7. Fare clic su Salva modifiche.

Utilizzo della console per disabilitare il controller di ammissione PodSecurityPolicy

Per disabilitare il controller di ammissione PodSecurityPolicy nei cluster in cui era abilitato in precedenza:

  1. Aprire il menu di navigazione e selezionare Developer Services. In Container e artifact, selezionare Cluster Kubernetes (OKE).
  2. Scegliere un compartimento in cui si dispone dell'autorizzazione per lavorare.
  3. Nella pagina Elenco cluster fare clic sul nome del cluster che si desidera modificare.
  4. Nella scheda Dettagli cluster fare clic su Applicato accanto a Criteri di sicurezza pod.
  5. Nella finestra Criteri di sicurezza pod, selezionare Non applicato.

    D'ora in poi, i nuovi pod dell'applicazione verranno accettati nel cluster senza che siano richiesti criteri di sicurezza dei pod, ruoli (o clusterroles) e associazioni di ruoli (o clusterrolebindings). Si noti che tutti i pod attualmente in esecuzione continueranno a essere eseguiti indipendentemente.

  6. Fare clic su Salva modifiche.

kube-system.yaml Riferimento

I criteri di sicurezza pod e il clusterrole e il clusterrolebinding associati per i pod con privilegi di sistema Kubernetes vengono creati automaticamente quando si abilita il controller di ammissione PodSecurityPolicy di un cluster. Questi consentono l'esecuzione di qualsiasi pod nello spazio di nomi kube-system. Vengono creati dalle definizioni nel kube-system.yaml mostrato di seguito:


apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
  annotations:
    # See https://kubernetes.io/docs/concepts/policy/pod-security-policy/#seccomp
    seccomp.security.alpha.kubernetes.io/allowedProfileNames: '*'
  name: oke-privileged
spec:
  allowedCapabilities:
  - '*'
  allowPrivilegeEscalation: true
  fsGroup:
    rule: 'RunAsAny'
  hostIPC: true
  hostNetwork: true
  hostPID: true
  hostPorts:
  - min: 0
    max: 65535
  privileged: true
  readOnlyRootFilesystem: false
  runAsUser:
    rule: 'RunAsAny'
  seLinux:
    rule: 'RunAsAny'
  supplementalGroups:
    rule: 'RunAsAny'
  volumes:
  - '*'
  
---
  
# Cluster role which grants access to the privileged pod security policy
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: oke-privileged-psp
rules:
- apiGroups:
  - policy
  resourceNames:
  - oke-privileged
  resources:
  - podsecuritypolicies
  verbs:
  - use
  
---
  
# Role binding for kube-system - allow kube-system service accounts - should take care of CNI i.e. flannel running in the kube-system namespace
# Assumes access to the kube-system is restricted
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: kube-system-psp
  namespace: kube-system
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: oke-privileged-psp
subjects:
# For all service accounts in the kube-system namespace
- apiGroup: rbac.authorization.k8s.io
  kind: Group
  name: system:serviceaccounts:kube-system