Pod Security Admission en Kubernetes
En este laboratorio, los alumnos aprenderán a configurar y utilizar Pod Security Admission en un clúster de Kubernetes. Pod Security Admission es una funcionalidad que permite aplicar políticas de seguridad a los pods, asegurando que cumplan con ciertos estándares de seguridad antes de ser creados o modificados.
Niveles de Seguridad en Pod Security Admission: Privileged, Baseline y Restricted
Pod Security Admission en Kubernetes proporciona tres niveles de seguridad predefinidos: privileged, baseline y restricted. Cada uno de estos niveles tiene diferentes restricciones y políticas de seguridad que se aplican a los pods para asegurar el cumplimiento de las mejores prácticas de seguridad. Aquí se explican las diferencias entre estos niveles:
Privileged:
El nivel privileged es el menos restrictivo de los tres niveles. Permite la ejecución de pods con configuraciones privilegiadas y menos seguras. Este nivel está diseñado para entornos donde se requiere un alto grado de flexibilidad y no se aplican restricciones de seguridad estrictas.
Características:
- Permite el uso de todos los controles de seguridad contextuales.
- Permite el uso de capacidades elevadas (capabilities).
- Permite el uso de volúmenes privilegiados, como hostPath.
- No impone restricciones en la escalación de privilegios (allowPrivilegeEscalation).
Uso: - Entornos de desarrollo y prueba donde la seguridad no es una preocupación principal. - Situaciones donde se requiere acceso total al host.
Baseline
El nivel baseline proporciona un equilibrio entre seguridad y funcionalidad. Aplica restricciones moderadas para mitigar riesgos comunes sin afectar significativamente la funcionalidad de los pods. Está diseñado para aplicaciones que necesitan algunas capacidades avanzadas pero aún requieren un cierto nivel de seguridad.
Características:
- Permite ciertas capacidades elevadas, pero restringe las más peligrosas (NET_RAW).
- Permite el uso de volúmenes no privilegiados.
- Prohíbe la escalación de privilegios (allowPrivilegeEscalation debe estar deshabilitado).
- Prohíbe el uso de hostPath y otros volúmenes privilegiados.
- Requiere que los contenedores se ejecuten como no root (runAsNonRoot).
Uso:
- Aplicaciones de producción que no requieren capacidades privilegiadas pero necesitan cierta flexibilidad.
- Entornos donde se busca un equilibrio entre seguridad y funcionalidad.
Restricted
El nivel restricted es el más seguro de los tres niveles. Aplica las restricciones de seguridad más estrictas, limitando significativamente las capacidades del pod para mitigar riesgos de seguridad. Está diseñado para aplicaciones que necesitan el máximo nivel de seguridad.
Características: - Restringe todas las capacidades elevadas. - Prohíbe el uso de volúmenes privilegiados como hostPath. - Prohíbe la escalación de privilegios (allowPrivilegeEscalation debe estar deshabilitado). - Requiere que los contenedores se ejecuten como no root (runAsNonRoot). - Requiere la definición de un contexto de seguridad (seccompProfile, runAsUser, runAsGroup, etc.).
Uso: - Aplicaciones críticas para la seguridad donde la reducción de la superficie de ataque es primordial. - Entornos de producción que manejan datos sensibles o críticos y necesitan una configuración de seguridad estricta.
Rancher Kubernetes Engine unicamente soporta los niveles de seguridad: privileged y restricted
Guía Paso a Paso: Laboratorio de Pod Security Admission en Kubernetes
En este laboratorio, los alumnos aprenderán a configurar y utilizar Pod Security Admission en un clúster de Kubernetes. Pod Security Admission es una funcionalidad que permite aplicar políticas de seguridad a los pods, asegurando que cumplan con ciertos estándares de seguridad antes de ser creados o modificados.
Requisitos Previos
- Un clúster de Kubernetes desplegado y funcionando.
- kubectl configurado para interactuar con el clúster.
- Acceso a la máquina desde donde se administrará el clúster.
Pasos
-
Habilitar Pod Security Admission Realiza un respaldo del archivo de configuración del cluster: cluster.yml
Editar el Archivo de Configuración del Cluster y agregar la línea pod_security_configuration: privileged:cp -p cluster.yml cluster.yml_bk_$(date +"%m_%d_%Y-%T")vi /home/student/devcluster/cluster.ymlGuardar el archivo editado anteriormenteservices: etcd: snapshot: true kube-api: pod_security_configuration: privileged service_cluster_ip_range: 10.43.0.0/16 -
Ejecura el comando rke up para reconfigurar el cluster
Espera a que finalice y deberias ver una salida como la siguiente:rke upINFO[0046] Finished building Kubernetes cluster successfully - Configurar Políticas de Seguridad de Pods, etiquetemos el namespace secure-ns con el nivel de seguridad restricted:
kubectl create namespace secure-nskubectl label namespace secure-ns pod-security.kubernetes.io/enforce=restricted - Crear un Namespace sin Políticas de Seguridad:
Creamos otro namespace unsecure-ns sin etiquetas de políticas de seguridad:
kubectl create namespace unsecure-ns - Crear un Pod Cumpliendo la Política Restricted:
En el namespace secure-ns, creamos un pod que cumple con la política restricted:
cat <<EOF | kubectl apply -f - apiVersion: v1 kind: Pod metadata: name: compliant-pod namespace: secure-ns spec: containers: - name: nginx image: nginx securityContext: runAsNonRoot: true allowPrivilegeEscalation: false capabilities: drop: - ALL seccompProfile: type: RuntimeDefault EOF - Crear un Pod Violando la Política Restricted:
Intentamos crear un pod en secure-ns que viola la política restricted:
Este pod debería ser rechazado por la política de seguridad restricted y mostrar un mensaje como el siguiente:
cat <<EOF | kubectl apply -f - apiVersion: v1 kind: Pod metadata: name: non-compliant-pod namespace: secure-ns spec: containers: - name: nginx image: nginx securityContext: runAsUser: 0 allowPrivilegeEscalation: true EOFError from server (Forbidden): error when creating "STDIN": pods "non-compliant-pod" 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), runAsUser=0 (container "nginx" must not set runAsUser=0), seccompProfile (pod or container "nginx" must set securityContext.seccompProfile.type to "RuntimeDefault" or "Localhost") -
Creamos un pod similar al non-compliant-pod en el Namespace unsecure-ns, donde no hay políticas de seguridad aplicadas:
Este pod debería ser creado exitosamente porque no hay restricciones aplicadas en unsecure-ns.cat <<EOF | kubectl apply -f - apiVersion: v1 kind: Pod metadata: name: non-compliant-pod namespace: unsecure-ns spec: containers: - name: nginx image: nginx securityContext: runAsUser: 0 allowPrivilegeEscalation: true EOF -
Verificar los Pods en secure-ns:
El pod compliant-pod debería estar en estado CreateContainerConfigError, ya que la imagen ha sido construida para ejecutarse como usuario root, lo cual no esta permitido Es posible verificarlo con el siguiente comando:kubectl get pods -n secure-nsSe deberia de observar el siguiente mensaje:kubectl get events -n secure-nsEl pod non-compliant-pod debería haber sido rechazado.20m Warning Failed pod/compliant-pod Error: container has runAsNonRoot and image will run as root (pod: "compliant-pod_secure-ns(ab632c48-8542-4931-9f90-7df0aba8eba6)", container: nginx) -
Verificar los Pods en unsecure-ns:
El pod non-compliant-pod debería estar en estado Running.kubectl get pods -n unsecure-ns
Limpieza del Ambiente
- Eliminar los Pods y Namespaces Creados:
kubectl delete namespace secure-nskubectl delete namespace unsecure-ns -
Restaurar la Configuración del API Server: Editar el Archivo de Configuración del Cluster:
Y elimina la línea: pod_security_configuration: restrictedvi /home/student/devcluster/cluster.ymlGuardar el archivo editado anteriormenteservices: etcd: snapshot: true kube-api: service_cluster_ip_range: 10.43.0.0/16 -
Ejecura el comando rke up para reconfigurar el cluster
Espera a que finalice y deberias ver una salida como la siguiente:rke upINFO[0046] Finished building Kubernetes cluster successfully