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:
- 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 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.
-
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
- Sigue las instrucciones a fin de autorizar a
gcloud
para que use tu cuenta de Google Cloud. - Crea una configuración nueva o selecciona una existente.
- Elige un proyecto de Google Cloud.
- 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
- Asegúrate de que comprendes cómo usar el control de acceso basado en funciones en GKE.
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
- Obtén más información sobre el control de acceso basado en funciones.
- Obtén información sobre cómo proteger tu clúster con la administración de identidades y accesos.
- Obtén información sobre los Pods de la zona de pruebas.