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 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 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 haber habilitado la API de Google Kubernetes Engine.
  • Habilitar la API de Google Kubernetes Engine
  • Asegúrate de haber instalado 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

Define 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 a 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.

Puedes crear este recurso con la herramienta de 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 basado en la función para crear una función o ClusterRole que otorgue 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, 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:
  - extensions
  resources:
  - podsecuritypolicies
  resourceNames:
  - my-psp
  verbs:
  - use

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

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 características siguientes:

  • 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 la sección sobre cómo 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.

Trabaja 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

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

Enviar comentarios sobre...

Documentación de Kubernetes Engine