Usa PodSecurityPolicies

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

Descripción general

PodSecurityPolicy es un recurso de controlador de admisión que creas y que valida las solicitudes a fin de crear y actualizar los pods de tu clúster. PodSecurityPolicy define un conjunto de condiciones que los pods deben cumplir para 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 valida correctamente. Estas se ordenan alfabéticamente y el controlador prefiere políticas no cambiantes (las que no modifican el pod) por sobre las cambiantes.

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

Antes de comenzar

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

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

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

Usa gcloud init

Si recibes el error One of [--zone, --region] must be supplied: Please specify location, completa esta sección.

  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 abra 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 gcloud config

  • 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

Definir PodSecurityPolicies

Debes definir los recursos de PodSecurityPolicy en tu 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 con esta política. Los ejemplos incluyen restringir el uso de contenedores privilegiados, volúmenes hostPath y redes de host o asignar la configuración predeterminada a todos los contenedores para ejecutarlos con un perfil seccomp. El controlador de admisión PodSecurityPolicy valida las solicitudes con las PodSecurityPolicies disponibles.

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

apiVersion: policy/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 válido 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 de 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 cluster-admin pueden usar el control de acceso basado en funciones para crear un Role o ClusterRole que otorga a las cuentas de servicio deseadas acceso a PodSecurityPolicies. 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 PodSecurityPolicy, como lo indica verb: use:

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

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

kubectl apply -f my-clusterrole.yaml

Tras crear una función (o ClusterRole), debes asociarla con la cuenta 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

Esta RoleBinding tiene las siguientes características:

  • 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 Usar la autorización RBAC.

Habilitar el controlador de PodSecurityPolicy

Si deseas usar el controlador de admisión PodSecurityPolicy, debes crear un clúster nuevo o actualizar un clúster 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

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

Trabajar con NetworkPolicy

Si usas una NetworkPolicy y tienes un Pod que depende de una PodSecurityPolicy, debes crear 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 la sección sobre cómo autorizar políticas.

Pasos siguientes