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

  1. ¿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.

  1. 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:

kubectl apply -f restricted-psp.yaml

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:

kubectl apply -f psp-role.yaml

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:

kubectl apply -f privileged-pod.yaml

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

  1. Crea una PSP que permita solo volúmenes de tipo configMap.
  2. Crea un Role y un RoleBinding para usar esta PSP.
  3. Verifica que los pods que no usan volúmenes de tipo configMap sean rechazados.

Solución

  1. 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'
  1. 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
  1. 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:

kubectl apply -f invalid-pod.yaml

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

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

Módulo 8: Seguridad en Kubernetes

Módulo 9: Escalado y Rendimiento

Módulo 10: Ecosistema y Herramientas de Kubernetes

Módulo 11: Estudios de Caso y Aplicaciones del Mundo Real

Módulo 12: Preparación para la Certificación de Kubernetes

© Copyright 2024. Todos los derechos reservados