En esta página se explica cómo aplicar controles de seguridad predefinidos a nivel de pod en tus clústeres de Google Kubernetes Engine (GKE) mediante el PodSecurity
controlador de admisión. Aplicar controles de seguridad a tus pods puede ayudarte a cumplir los requisitos de seguridad y cumplimiento. En esta página, obtendrá más información sobre PodSecurity
y cómo aplicarlo a sus pods.
Esta página está dirigida a especialistas en seguridad que quieran aplicar controles de seguridad a sus clústeres de GKE. Para obtener más información sobre los roles habituales y las tareas de ejemplo a las que hacemos referencia en el contenido, consulta Roles y tareas habituales de los usuarios de GKE. Trusted Cloud by S3NS
Antes de leer esta página, asegúrese de que conoce los siguientes conceptos:
- Documentación de Kubernetes sobre el controlador de admisión de seguridad de pods
- Documentación de Kubernetes sobre los estándares de seguridad de pods
Acerca de PodSecurity
PodSecurity
es un controlador de admisión de Kubernetes que te permite aplicar estándares de seguridad de pods a los pods que se ejecutan en tus clústeres de GKE.
Los estándares de seguridad de pods son políticas de seguridad predefinidas que cubren las necesidades de alto nivel de seguridad de los pods en Kubernetes. Estas políticas pueden ser muy permisivas o muy restrictivas.
Puedes aplicar los siguientes estándares de seguridad de pods a tus clústeres de GKE:
- Privilegiada: una política sin restricciones que proporciona el nivel más amplio de permisos. Permite las apropiaciones de privilegios conocidas.
- Configuración básica: una política mínimamente restrictiva que permite la configuración predeterminada y mínimamente especificada de los pods. Evita las apropiaciones de privilegios conocidas.
- Restringido: una política muy restrictiva que sigue las prácticas recomendadas de protección de pods.
Puedes usar el controlador de admisión PodSecurity
para aplicar los estándares de seguridad de pods en los siguientes modos:
- Implementar: las infracciones de las políticas rechazan la creación de pods. Se añade un evento de auditoría al registro de auditoría.
- Auditoría: las infracciones de las políticas activan la adición de un evento de auditoría al registro de auditoría. Se permite la creación de pódcasts.
- Advertir: las infracciones de las políticas activan una advertencia visible para los usuarios. Se permite la creación de pods.
El controlador de admisión PodSecurity
inserta estas políticas en la API de Kubernetes.
Si quieres crear y aplicar políticas de seguridad personalizadas a nivel de pod, te recomendamos que uses el controlador de admisión Gatekeeper.
Antes de empezar
Antes de empezar, asegúrate de que has realizado las siguientes tareas:
- Habilita la API de Google Kubernetes Engine. Habilitar la API de Google Kubernetes Engine
- Si quieres usar Google Cloud CLI para esta tarea, instálala y, a continuación, inicialízala. Si ya has instalado la gcloud CLI, obtén la versión más reciente ejecutando
gcloud components update
.
- Asegúrate de tener un clúster de GKE Autopilot o Standard con la versión 1.23 o una posterior.
- En el caso de los clústeres de Autopilot, regístrate en un canal de lanzamiento en el que la versión predeterminada sea la 1.23 o una posterior.
- En el caso de los clústeres estándar, regístrate en un canal de lanzamiento o actualiza el clúster a una versión específica.
Requisitos
El controlador de admisión PodSecurity
está disponible y habilitado de forma predeterminada en los clústeres que ejecutan las siguientes versiones de GKE:
- Versión 1.25 o posterior: estable
- Versión 1.23 y versión 1.24: beta
Para comprobar si una versión de GKE está disponible y es la versión predeterminada de tu canal de lanzamiento, consulta la programación de lanzamientos.
Aplicar estándares de seguridad de pods mediante PodSecurity
Para usar el controlador de admisión PodSecurity
, debes aplicar estándares de seguridad de pods específicos en modos específicos a espacios de nombres específicos. Para ello, puedes usar etiquetas de espacio de nombres.
En este ejercicio, harás lo siguiente:
- Crear dos espacios de nombres
- Aplicar políticas de seguridad a cada espacio de nombres
- Probar las políticas configuradas
En las siguientes versiones de GKE, GKE ignora las políticas que apliques al espacio de nombres kube-system
:
- 1.23.6-gke.1900 y versiones posteriores
- 1.24.0-gke.1200 y versiones posteriores
En versiones anteriores de GKE, no apliques políticas en kube-system
.
Crear espacios de nombres
Crea espacios de nombres en tu clúster:
kubectl create ns baseline-ns
kubectl create ns restricted-ns
Este comando crea los siguientes espacios de nombres:
baseline-ns
: Para cargas de trabajo permisivasrestricted-ns
: para cargas de trabajo muy restringidas
Usar etiquetas para aplicar políticas de seguridad
Aplica los siguientes estándares de seguridad de pods:
baseline
: aplicar abaseline-ns
en el modowarn
restricted
: aplicar arestricted-ns
en el modoenforce
kubectl label --overwrite ns baseline-ns pod-security.kubernetes.io/warn=baseline
kubectl label --overwrite ns restricted-ns pod-security.kubernetes.io/enforce=restricted
Estos comandos consiguen lo siguiente:
- Se permiten las cargas de trabajo del espacio de nombres
baseline-ns
que infringen la políticabaseline
y el cliente muestra un mensaje de advertencia. - Las cargas de trabajo del espacio de nombres
restricted-ns
que infrinjan la políticarestricted
se rechazarán y GKE añadirá una entrada a los registros de auditoría.
Comprueba que se han añadido las etiquetas:
kubectl get ns --show-labels
El resultado debería ser similar al siguiente:
baseline-ns Active 74s kubernetes.io/metadata.name=baseline-ns,pod-security.kubernetes.io/warn=baseline
restricted-ns Active 18s kubernetes.io/metadata.name=restricted-ns,pod-security.kubernetes.io/enforce=restricted
default Active 57m kubernetes.io/metadata.name=default
kube-public Active 57m kubernetes.io/metadata.name=kube-public
kube-system Active 57m kubernetes.io/metadata.name=kube-system
Probar las políticas configuradas
Para comprobar que el controlador de admisión PodSecurity
funciona correctamente, implementa una carga de trabajo que infrinja las políticas baseline
y restricted
en ambos espacios de nombres. El siguiente ejemplo de archivo de manifiesto implementa un contenedor nginx
que permite la elevación de privilegios.
Guarda el siguiente archivo de manifiesto como
psa-workload.yaml
:apiVersion: v1 kind: Pod metadata: name: nginx labels: app: nginx spec: containers: - name: nginx image: nginx securityContext: privileged: true
Aplica el manifiesto al espacio de nombres
baseline-ns
:kubectl apply -f psa-workload.yaml --namespace=baseline-ns
El resultado debería ser similar al siguiente:
Warning: would violate PodSecurity "baseline:latest": privileged (container "nginx" must not set securityContext.privileged=true)
La política
baseline
permite que el pod se implemente en el espacio de nombres.Verifica que el pod se haya desplegado correctamente:
kubectl get pods --namespace=baseline-ns -l=app=nginx
Aplica el manifiesto al espacio de nombres
restricted-ns
:kubectl apply -f psa-workload.yaml --namespace=restricted-ns
El resultado debería ser similar al siguiente:
Error from server (Forbidden): error when creating "workload.yaml": pods "nginx" is forbidden: violates PodSecurity "restricted:latest": allowPrivilegeEscalation != false (container "nginx" must set securityContext.allowPrivilegeEscalation=false), unrestricted capabilities (container "nginx" must set securityContext.capabilities.drop=["ALL"]), runAsNonRoot != true (pod or container "nginx" must set securityContext.runAsNonRoot=true), seccompProfile (pod or container "nginx" must set securityContext.seccompProfile.type to "RuntimeDefault" or "Localhost")
El pod no se desplegará en el espacio de nombres. Se añade una entrada de auditoría al registro.
Ver las infracciones de las políticas en los registros de auditoría
Las infracciones de las políticas en los modos audit
y enforce
se registran en los registros de auditoría de tu clúster. Puedes ver estos registros con el Explorador de registros de laTrusted Cloud consola.
Ve a la página Explorador de registros de la consola de Trusted Cloud .
En el campo Consulta, especifica lo siguiente para obtener los registros de auditoría de los modos
audit
yenforce
:resource.type="k8s_cluster" protoPayload.resourceName:"/pods/nginx" protoPayload.methodName="io.k8s.core.v1.pods.create" (labels."pod-security.kubernetes.io/audit-violations":"PodSecurity" OR protoPayload.response.reason="Forbidden")
Haz clic en Realizar una consulta.
En la sección Resultados de la consulta, despliega la entrada de registro
Forbidden
para inspeccionar los registros de rechazo del modoenforce
. Los detalles son similares a los siguientes:{ ... protoPayload: { @type: "type.googleapis.com/google.cloud.audit.AuditLog" authenticationInfo: {1} authorizationInfo: [1] methodName: "io.k8s.core.v1.pods.create" request: {6} requestMetadata: {2} resourceName: "core/v1/namespaces/restricted-ns/pods/nginx" response: { @type: "core.k8s.io/v1.Status" apiVersion: "v1" code: 403 details: {2} kind: "Status" message: "pods "nginx" is forbidden: violates PodSecurity "restricted:latest": privileged (container "nginx" must not set securityContext.privileged=true), allowPrivilegeEscalation != false (container "nginx" must set securityContext.allowPrivilegeEscalation=false), unrestricted capabilities (container "nginx" must set securityContext.capabilities.drop=["ALL"]), runAsNonRoot != true (pod or container "nginx" must set securityContext.runAsNonRoot=true), seccompProfile (pod or container "nginx" must set securityContext.seccompProfile.type to "RuntimeDefault" or "Localhost")" metadata: {0} reason: "Forbidden" status: "Failure" } serviceName: "k8s.io" status: {2} } receiveTimestamp: "2022-02-01T19:19:25.353235326Z" resource: {2} timestamp: "2022-02-01T19:19:21.469360Z" }
Despliega la entrada de registro
audit-violations
para inspeccionar los registros del modoaudit
. Los detalles son similares a los siguientes:{ ... labels: { ... pod-security.kubernetes.io/audit-violations: "would violate PodSecurity "baseline:latest": privileged (container "nginx" must not set securityContext.privileged=true)" pod-security.kubernetes.io/enforce-policy: "privileged:latest" } operation: {4} protoPayload: {10} receiveTimestamp: "2023-12-26T05:18:04.533631468Z" resource: {2} timestamp: "2023-12-26T05:17:36.102387Z" }
Limpieza
Para evitar que se apliquen cargos en tu cuenta de Trusted Cloud by S3NS , elimina los espacios de nombres:
kubectl delete ns baseline-ns
kubectl delete ns restricted-ns
Alternativas a PodSecurity
Además de usar el PodSecurity
controlador de admisión de Kubernetes integrado
para aplicar los estándares de seguridad de los pods, también puedes usar Gatekeeper, un controlador de admisión basado en Open Policy Agent (OPA), para crear y aplicar controles de seguridad personalizados a nivel de pod.
Siguientes pasos
- Más información sobre los estándares de seguridad de pods
- Consulta más información sobre el
PodSecurity
controlador de admisión. - Migrar de PodSecurityPolicy al controlador de admisión
PodSecurity
.