Usa PodSecurityPolicies

beta

En esta página, se explica cómo usar PodSecurityPolicies en Google Kubernetes Engine.

Descripción general

PodSecurityPolicy es un recurso del controlador de admisión que puedes crear y que valida las solicitudes a fin de crear y actualizar los pods del clúster. PodSecurityPolicy define un conjunto de condiciones que los pods deben cumplir a fin de que el clúster los acepte. Cuando una solicitud para crear o actualizar un pod no cumple con las condiciones de PodSecurityPolicy, se rechaza y se muestra un error.

Para usar PodSecurityPolicy, primero debes crear y definir las políticas que deben cumplir los pods nuevos y actualizados. Luego, debes habilitar el controlador de admisión de PodSecurityPolicy, que valida las solicitudes para crear y actualizar pods en función de las políticas definidas.

Cuando hay varias PodSecurityPolicies disponibles, el controlador de admisión usa la primera política que se valide de forma correcta. Estas se ordenan de forma alfabética y el controlador prefiere políticas que no sean cambiantes (las que no modifican el pod) por sobre las cambiantes.

PodSecurityPolicy está disponible en clústeres de GKE que ejecutan Kubernetes la versión 1.8.6 o una versión posterior.

Antes de comenzar

Antes de comenzar, asegúrate de haber realizado las siguientes tareas:

Establece la configuración predeterminada de gcloud mediante uno de los siguientes métodos:

  • Usa gcloud init si quieres ver una introducción sobre cómo configurar parámetros predeterminados.
  • Usa gcloud config para establecer de forma individual el ID, la zona y la región del proyecto.

Usa gcloud init

  1. Ejecuta gcloud init y sigue las instrucciones:

    gcloud init

    Si usas SSH en un servidor remoto, usa la marca --console-only para evitar que el comando inicie un navegador:

    gcloud init --console-only
  2. Sigue las instrucciones a fin de autorizar a gcloud para que use tu cuenta de Google Cloud.
  3. Crea una configuración nueva o selecciona una existente.
  4. Elige un proyecto de Google Cloud.
  5. Elige una zona predeterminada de Compute Engine.

Usa la configuración de gcloud

  • Establece tu ID del proyecto predeterminado:
    gcloud config set project project-id
  • Si trabajas con clústeres zonales, establece tu zona de procesamiento predeterminada:
    gcloud config set compute/zone compute-zone
  • Si trabajas con clústeres regionales, establece tu región de procesamiento predeterminada:
    gcloud config set compute/region compute-region
  • Actualiza gcloud a la versión más reciente:
    gcloud components update

Define PodSecurityPolicies

Debes definir los recursos de PodSecurityPolicy en el clúster para que el controlador de PodSecurityPolicy pueda validar y aceptar los pods en el clúster.

PodSecurityPolicies especifica una lista de restricciones, requisitos y configuraciones predeterminadas para los pods que se creen según esta política. Los ejemplos incluyen la restricción del uso de contenedores con privilegios, volúmenes de hostPath y redes de host o la asignación de la configuración predeterminada a todos los contenedores para ejecutarlos con un perfil de seccomp. El controlador de admisión de PodSecurityPolicy valida las solicitudes con las PodSecurityPolicies disponibles.

En el ejemplo siguiente, PodSecurityPolicy, my-psp.yaml, previene la creación de pods con privilegios. La política también afecta a varios otros aspectos de control, como el permiso de acceso a todos los volúmenes disponibles:

apiVersion: extensions/v1beta1
    kind: PodSecurityPolicy
    metadata:
      name: my-psp
    spec:
      privileged: false  # Prevents creation of privileged Pods
      seLinux:
        rule: RunAsAny
      supplementalGroups:
        rule: RunAsAny
      runAsUser:
        rule: RunAsAny
      fsGroup:
        rule: RunAsAny
      volumes:
      - '*'
    

La especificación de PodSecurityPolicy puede proteger varios aspectos de control. Los aspectos de control que se especifican en este ejemplo (seLinux, supplementalGroups, runAsUser y fsGroup) están configurados en RunAsAny, lo que indica que, con esta política, se puede usar cualquier valor aceptable en estos campos.

Para obtener más información sobre PodSecurityPolicies y sus aspectos de control, consulta ¿Qué es una política de seguridad de pod? y la referencia de políticas en la documentación de Kubernetes.

Puedes crear este recurso con la herramienta de línea de comandos kubectl:

kubectl apply -f my-psp.yaml
    

Para ver más ejemplos sobre la configuración de PodSecurityPolicies, consulta Ejemplo en la página de PodSecurityPolicy de la documentación de Kubernetes.

Autoriza políticas

Las cuentas con la función administrador de clústeres pueden usar el control de acceso basado en funciones para crear una función o ClusterRole que les otorgue acceso a PodSecurityPolicies a las cuentas de servicio del proyecto que desees. ClusterRole otorga permisos de todo el clúster, y una función otorga permisos en el espacio de nombres que definas.

Por ejemplo, el ClusterRole my-clusterrole.yaml otorga acceso a la my-psp de PodSecurityPolicy, como lo indica verb: use:

kind: ClusterRole
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: my-clusterrole
    rules:
    - apiGroups:
      - extensions
      resources:
      - podsecuritypolicies
      resourceNames:
      - my-psp
      verbs:
      - use
    

Para crear una función ClusterRole, ejecuta el comando siguiente:

kubectl apply -f my-clusterrole.yaml
    

Después de crear una función (o ClusterRole), debes asociarla con las cuentas de servicio que desees. Para ello, debes crear un recurso RoleBinding (o ClusterRoleBinding).

El RoleBinding my-rolebinding.yaml vincula la ClusterRole my-clusterrole a las cuentas de servicio en un espacio de nombres específico, my-namespace:

# Bind the ClusterRole to the desired set of service accounts.
    # Policies should typically be bound to service accounts in a namespace.
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: my-rolebinding
      namespace: my-namespace
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: my-clusterrole
    subjects:
    # Example: All service accounts in my-namespace
    - apiGroup: rbac.authorization.k8s.io
      kind: Group
      name: system:serviceaccounts
    # Example: A specific service account in my-namespace
    - kind: ServiceAccount # Omit apiGroup
      name: default
      namespace: my-namespace
    

En esta RoleBinding:

  • El campo subjects especifica a qué cuentas se vincula la función ClusterRole.
  • El primer sujeto es un grupo, system:serviceaccounts, que abarca todas las cuentas de servicio del clúster.
  • El segundo sujeto es una ServiceAccount individual, default, que especifica la cuenta de servicio predeterminada del espacio de nombres.

Para crear una función RoleBinding, ejecuta el comando siguiente:

kubectl apply -f my-rolebinding.yaml
    

Para obtener más información sobre RBAC, consulta Usa la autorización RBAC.

Habilita el controlador de PodSecurityPolicy

Si deseas usar el controlador de admisión de PodSecurityPolicy, debes crear un clúster nuevo o actualizar uno existente con la marca --enable-pod-security-policy.

Para crear un clúster nuevo con PodSecurityPolicy, ejecuta el siguiente comando:

gcloud beta container clusters create [CLUSTER_NAME] --enable-pod-security-policy
    

Para actualizar un clúster existente:

gcloud beta container clusters update [CLUSTER_NAME] --enable-pod-security-policy
    

Inhabilitar el controlador PodSecurityPolicy

Para inhabilitar el controlador PodSecurityPolicy, ejecuta el siguiente comando:

gcloud beta container clusters update [CLUSTER_NAME] --no-enable-pod-security-policy
    

Si inhabilitas el controlador, esto provocará que el clúster deje de validar las políticas o de asignarles la configuración predeterminada, pero no las borra. Las vinculaciones tampoco se borran.

Trabaja con NetworkPolicy

Si usas una NetworkPolicy y tienes un pod que está sujeto a una PodSecurityPolicy, crea una función de RBAC o ClusterRole que tenga permiso para usar la PodSecurityPolicy. Luego, vincula la función o ClusterRole a la cuenta de servicio del pod. En este caso, otorgar permisos a las cuentas de usuarios no es suficiente. Para obtener más información, consulta Políticas de autorización.

Próximos pasos