Usar 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

Sigue estos pasos a fin de prepararte para esta tarea:

  • Asegúrate de que habilitaste la API de Google Kubernetes Engine.
  • Habilitar la API de Google Kubernetes Engine
  • Asegúrate de que instalaste el SDK de Cloud.
  • 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 Herramientas de 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.

La siguiente PodSecurityPolicy de ejemplo, my-psp.yaml, previene la creación de pod privilegiados. La política también afecta varios otros aspectos de control, como permitir el 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 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.

Este recurso se crea con la herramienta de la línea de comandos de 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 administrador de clústeres pueden usar el control de acceso según la función para crear una función o ClusterRole que otorga acceso a las cuentas de servicio del proyecto que desees 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, esta ClusterRole, my-clusterrole.yaml, otorga acceso a la PodSecurityPolicy my-psp, tal como 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 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).

Esta función RoleBinding, my-rolebinding.yaml, vincula la ClusterRole, my-clusterrole, con las cuentas de servicio de 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 Group, system:serviceaccounts, que abarca todas las cuentas de servicio del clúster.
  • El segundo sujeto es ServiceAccount, default, que especifica la cuenta de servicio predeterminada del espacio de nombres.

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

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

Para usar el controlador de admisión 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

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 NetworkPolicy y tienes un Pod que depende de PodSecurityPolicy, crea una función RBAC o ClusterRole que tenga permiso para usar PodSecurityPolicy. Luego, vincula la función o ClusterRole a la cuenta de servicio del Pod. En este caso, otorgar permisos para las cuentas de usuarios no es suficiente. Para obtener más información, consulta Autoriza políticas.

Pasos siguientes

¿Te ha resultado útil esta página? Enviar comentarios:

Enviar comentarios sobre...