Introducción
Las Políticas de Seguridad de Pods (PSP) son una característica de Kubernetes que permite a los administradores controlar la seguridad de los pods en un clúster. Las PSP definen un conjunto de condiciones que un pod debe cumplir para ser admitido en el clúster. Estas políticas ayudan a garantizar que los pods se ejecuten de manera segura y cumplan con las políticas de seguridad de la organización.
Conceptos Clave
- ¿Qué es una Política de Seguridad de Pods?
Una PSP es un recurso de Kubernetes que define un conjunto de condiciones y restricciones que los pods deben cumplir para ser admitidos en el clúster. Estas condiciones pueden incluir restricciones sobre el uso de privilegios, el acceso a volúmenes, la configuración de redes, entre otros.
- Componentes de una PSP
- Privilegios de Usuario: Controla si un pod puede ejecutarse como un usuario privilegiado.
- Capacidades de Linux: Define las capacidades de Linux que un pod puede tener.
- Volúmenes: Restringe los tipos de volúmenes que un pod puede usar.
- Redes: Controla las configuraciones de red, como el uso de hostNetwork.
- SELinux: Define las políticas de SELinux que un pod debe cumplir.
- AppArmor: Especifica los perfiles de AppArmor que un pod debe usar.
Ejemplo de una PSP
A continuación, se muestra un ejemplo de una PSP que restringe los pods para que no se ejecuten como usuarios privilegiados y solo permite el uso de volúmenes de tipo emptyDir
:
apiVersion: policy/v1beta1 kind: PodSecurityPolicy metadata: name: restricted-psp spec: privileged: false volumes: - 'emptyDir' runAsUser: rule: 'MustRunAsNonRoot' seLinux: rule: 'RunAsAny' supplementalGroups: rule: 'RunAsAny' fsGroup: rule: 'RunAsAny'
Explicación del Ejemplo
- privileged: false: No permite que los pods se ejecuten como usuarios privilegiados.
- volumes: ['emptyDir']: Solo permite el uso de volúmenes de tipo
emptyDir
. - runAsUser.rule: 'MustRunAsNonRoot': Obliga a que los pods se ejecuten como un usuario no root.
- seLinux.rule: 'RunAsAny': No impone restricciones específicas de SELinux.
- supplementalGroups.rule: 'RunAsAny': No impone restricciones en los grupos suplementarios.
- fsGroup.rule: 'RunAsAny': No impone restricciones en los grupos de archivos.
Implementación de PSP en un Clúster
Paso 1: Crear la PSP
Guarda el ejemplo anterior en un archivo llamado restricted-psp.yaml
y aplícalo al clúster:
Paso 2: Crear un Role y RoleBinding
Para que la PSP sea efectiva, debes crear un Role y un RoleBinding que otorgue permisos para usar la PSP:
apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: psp-user namespace: default rules: - apiGroups: ['policy'] resources: ['podsecuritypolicies'] verbs: ['use'] resourceNames: ['restricted-psp'] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: psp-user-binding namespace: default roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: psp-user subjects: - kind: User name: 'system:serviceaccount:default:default' apiGroup: rbac.authorization.k8s.io
Aplica estos recursos al clúster:
Paso 3: Verificar la PSP
Intenta crear un pod que no cumpla con las restricciones de la PSP para verificar que la política está funcionando:
apiVersion: v1 kind: Pod metadata: name: privileged-pod spec: containers: - name: nginx image: nginx securityContext: privileged: true
Guarda este manifiesto en un archivo llamado privileged-pod.yaml
y aplícalo al clúster:
Deberías ver un error indicando que el pod no cumple con las políticas de seguridad.
Ejercicio Práctico
Ejercicio 1: Crear una PSP que Permita Solo Volúmenes ConfigMap
- Crea una PSP que permita solo volúmenes de tipo
configMap
. - Crea un Role y un RoleBinding para usar esta PSP.
- Verifica que los pods que no usan volúmenes de tipo
configMap
sean rechazados.
Solución
- PSP:
apiVersion: policy/v1beta1 kind: PodSecurityPolicy metadata: name: configmap-psp spec: privileged: false volumes: - 'configMap' runAsUser: rule: 'MustRunAsNonRoot' seLinux: rule: 'RunAsAny' supplementalGroups: rule: 'RunAsAny' fsGroup: rule: 'RunAsAny'
- Role y RoleBinding:
apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: configmap-psp-user namespace: default rules: - apiGroups: ['policy'] resources: ['podsecuritypolicies'] verbs: ['use'] resourceNames: ['configmap-psp'] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: configmap-psp-user-binding namespace: default roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: configmap-psp-user subjects: - kind: User name: 'system:serviceaccount:default:default' apiGroup: rbac.authorization.k8s.io
- Verificación:
Intenta crear un pod con un volumen de tipo emptyDir
y verifica que sea rechazado.
apiVersion: v1 kind: Pod metadata: name: invalid-pod spec: containers: - name: nginx image: nginx volumeMounts: - mountPath: /data name: data-volume volumes: - name: data-volume emptyDir: {}
Guarda este manifiesto en un archivo llamado invalid-pod.yaml
y aplícalo al clúster:
Deberías ver un error indicando que el pod no cumple con las políticas de seguridad.
Conclusión
Las Políticas de Seguridad de Pods son una herramienta poderosa para garantizar que los pods en un clúster de Kubernetes se ejecuten de manera segura y cumplan con las políticas de seguridad de la organización. Al definir y aplicar PSPs, los administradores pueden controlar aspectos críticos de la seguridad de los pods, como el uso de privilegios, el acceso a volúmenes y la configuración de redes.
Curso de Kubernetes
Módulo 1: Introducción a Kubernetes
- ¿Qué es Kubernetes?
- Arquitectura de Kubernetes
- Conceptos y Terminología Clave
- Configuración de un Clúster de Kubernetes
- CLI de Kubernetes (kubectl)
Módulo 2: Componentes Principales de Kubernetes
Módulo 3: Gestión de Configuración y Secretos
Módulo 4: Redes en Kubernetes
Módulo 5: Almacenamiento en Kubernetes
Módulo 6: Conceptos Avanzados de Kubernetes
Módulo 7: Monitoreo y Registro
- Monitoreo con Prometheus
- Registro con Elasticsearch, Fluentd y Kibana (EFK)
- Verificaciones de Salud y Sondas
- Servidor de Métricas
Módulo 8: Seguridad en Kubernetes
- Control de Acceso Basado en Roles (RBAC)
- Políticas de Seguridad de Pods
- Seguridad de Red
- Seguridad de Imágenes
Módulo 9: Escalado y Rendimiento
- Autoescalado Horizontal de Pods
- Autoescalado Vertical de Pods
- Autoescalado de Clúster
- Ajuste de Rendimiento
Módulo 10: Ecosistema y Herramientas de Kubernetes
Módulo 11: Estudios de Caso y Aplicaciones del Mundo Real
- Despliegue de una Aplicación Web
- CI/CD con Kubernetes
- Ejecución de Aplicaciones con Estado
- Gestión Multi-Clúster