Uso de políticas de seguridad de pod con Container Engine for Kubernetes

Descubra cómo utilizar las políticas de seguridad de pod con los clusters de Kubernetes que ha creado mediante Container Engine for Kubernetes (OKE).

Nota

Las políticas de seguridad de pod en desuso del proyecto ascendente de Kubernetes en la versión 1.21 de Kubernetes y eliminaron la función en la versión 1.25 de Kubernetes. Por lo tanto, Container Engine for Kubernetes no soporta políticas de seguridad de pod y el controlador de admisión PodSecurityPolicy en clusters que ejecutan la versión 1.25 y posteriores de Kubernetes.

Si necesita una funcionalidad similar, considere el uso de estándares de seguridad de pod de Kubernetes y el controlador de admisión PodSecurity en su lugar (junto con las políticas Privileged, Baseline y Restricted). Por defecto, Container Engine for Kubernetes permite el controlador de admisión PodSecurity en clusters que ejecutan la versión 1.23 y posteriores de Kubernetes, para soportar los estándares de seguridad de pod. Para obtener más información sobre los estándares de seguridad de pod de Kubernetes y el controlador de admisión PodSecurity, consulte Estándares de seguridad de pod en la documentación de Kubernetes.

También puede considerar el uso de otras alternativas que se están desarrollando en el ecosistema de Kubernetes para aplicar políticas.

Si decide pasar de utilizar políticas de seguridad de pod y el controlador de admisión PodSecurityPolicy a utilizar estándares de seguridad de pod y el controlador de admisión PodSecurity, consulte Migración de PodSecurityPolicy al controlador de admisión PodSecurity incorporado en la documentación de Kubernetes. Tenga en cuenta que es importante completar la migración antes de crear un nuevo cluster que ejecute la versión 1.25 de Kubernetes o antes de actualizar un cluster de Kubernetes versión 1.24 existente para ejecutar la versión 1.25 de Kubernetes. Tenga en cuenta también que la consola proporciona una forma práctica de desactivar el uso del controlador de admisión PodSecurityPolicy en clusters de Kubernetes existentes creados y gestionados por Container Engine for Kubernetes (consulte Uso de la consola para desactivar el controlador de admisión PodSecurityPolicy).

Puede controlar las operaciones que se permite realizar a los pods en un cluster que haya creado con Container Engine for Kubernetes mediante la configuración de políticas de seguridad de pod para el cluster. Las políticas de seguridad de pod son una forma de garantizar que los pods cumplen las condiciones relacionadas con la seguridad para que se puedan aceptar en un cluster. Por ejemplo, puede utilizar políticas de seguridad de pod para:

  • limitar las opciones de almacenamiento disponibles para pods.
  • restringir la red de hosts y los puertos a los que pueden acceder los pods
  • evitar que los pods se ejecuten como usuario raíz
  • evitar que los pods se ejecuten en modo con privilegios

También puede utilizar políticas de seguridad de pod para proporcionar valores por defecto para los pods mediante la "mutación" del pod.

Al haber definido una política de seguridad de pod para un cluster, debe autorizar al usuario solicitante o a la cuenta de servicio del pod de destino para que utilice la política. Para ello, debe crear un Role (o ClusterRole) para acceder a la política de seguridad de pod y, a continuación, crear un RoleBinding (o ClusterRoleBinding) entre el Role (o ClusterRole) y el usuario solicitante o la cuenta de servicio del pod de destino. Para obtener más información sobre Roles, ClusterRoles y Bindings, consulte Acerca de control de acceso y Container Engine for Kubernetes.

Puede especificar si un cluster aplica las políticas de seguridad de pod definidas para él activando el controlador de admisión PodSecurityPolicy del cluster. El controlador de admisión PodSecurityPolicy actúa en la creación y la modificación de un pod y determina si el pod se debe admitir en el cluster en función del contexto de seguridad solicitado en la especificación del pod y las políticas de seguridad de pod del cluster. Si existen varias políticas de seguridad de pod, el controlador de admisión PodSecurityPolicy primero compara el pod con las políticas no mutantes en orden alfabético y utiliza la primera política que valida correctamente el pod. Si no hay ningún pod no mutante que valide el pod, el controlador de admisión PodSecurityPolicy compara el pod con las políticas mutantes en orden alfabético y utiliza la primera política que valida correctamente el pod.

Atención

Atención 1:

Es muy importante tener en cuenta que cuando activa el controlador de admisión PodSecurityPolicy de un cluster, no se puede iniciar ningún pod de aplicación en el cluster a menos que existan políticas de seguridad de pod adecuadas, junto con Roles (o ClusterRoles) y RoleBindings (o ClusterRoleBindings) para asociar pods a políticas. No podrá ejecutar pods de aplicación en un cluster con un controlador de admisión PodSecurityPolicy activado, a menos que se cumplan estos requisitos.

Se recomienda utilizar controladores de admisión de PodSecurityPolicy de la siguiente manera:

  • Siempre que cree un nuevo cluster, active el controlador de admisión de seguridad de pod.
  • Inmediatamente después de crear un nuevo cluster, cree políticas de seguridad de pod, junto con Roles (o ClusterRoles) y RoleBindings (o ClusterRoleBindings).

Atención 2:

Debe crear políticas de seguridad de pod antes de activar el controlador de admisión PodSecurityPolicy de un cluster existente que ya está en producción (es decir, después de haberlo creado). Si decide activar el controlador de admisión PodSecurityPolicy de un cluster existente, se recomienda verificar primero las políticas de seguridad de pod del cluster en un entorno de desarrollo o prueba. De esa manera, puede estar seguro de que las políticas de seguridad de pod funcionan como espera y permiten (o rechazan) correctamente que los pods comiencen en el cluster.

Al activar el controlador de admisión PodSecurityPolicy de un cluster que ha creado con Container Engine for Kubernetes, se crea automáticamente una política de seguridad de pod para pods con privilegios del sistema Kubernetes (junto con ClusterRole y ClusterRoleBinding asociados). Esta política de seguridad de pod y ClusterRole y ClusterRoleBinding asociados permiten ejecutar los pods del sistema Kubernetes. La política de seguridad de pod, ClusterRole y ClusterRoleBinding se definen en el archivo kube-system.yaml (consulte Referencia de kube-system.yaml).

Tenga en cuenta que puede crear políticas de seguridad de pod para un cluster antes de activar el controlador de admisión PodSecurityPolicy del cluster. Tenga en cuenta también que puede desactivar el controlador de admisión PodSecurityPolicy de un cluster que se ha activado previamente. En este caso, no se suprimen las políticas de seguridad de pod, los Roles (o ClusterRoles) ni los RoleBindings (o ClusterRoleBindings) previamente creados. Las políticas de seguridad de pod simplemente no se aplican. Cualquier pod de aplicación podrá ejecutarse en el cluster.

Para obtener más información sobre las políticas de seguridad de pod y el controlador de admisión PodSecurityPolicy, consulte la documentación de Kubernetes.

Creación de una política de seguridad de pod para pods de aplicación

Para crear una política de seguridad de pod para pods de aplicación, cree un rol para acceder a la política de seguridad de pod y cree un RoleBinding para permitir que los pods de aplicación utilicen la política de seguridad de pod:

  1. Cree la política de seguridad de pod para los pods de aplicación:
    1. Defina y guarde la política de seguridad de pod en un archivo. Por ejemplo, en acme-app-psp.yaml.

      Por ejemplo, esta política (tomada de la documentación de Kubernetes) simplemente evita la creación de pods con privilegios:

      
      apiVersion: policy/v1beta1
      kind: PodSecurityPolicy
      metadata:
        name: acme-app-psp
      spec:
        privileged: false  # Don't allow privileged pods!
        # The rest fills in some required fields.
        seLinux:
          rule: RunAsAny
        supplementalGroups:
          rule: RunAsAny
        runAsUser:
          rule: RunAsAny
        fsGroup:
          rule: RunAsAny
        volumes:
        - '*'
    2. Introduzca el siguiente comando para crear la política de seguridad de pod:

      kubectl create -f <filename>.yaml

      Por ejemplo:

      kubectl create -f acme-app-psp.yaml
  2. Cree el Role (o ClusterRole) para acceder a la política de seguridad de pod:
    1. Defina y guarde un Role (o un ClusterRole) en un archivo. Por ejemplo, en acme-app-psp-crole.yaml.

      Por ejemplo:

      # Cluster role which grants access to the app pod security policy
      apiVersion: rbac.authorization.k8s.io/v1
      kind: ClusterRole
      metadata:
        name: acme-app-psp-crole
      rules:
      - apiGroups:
        - policy
        resourceNames:
        - acme-app-psp
        resources:
        - podsecuritypolicies
        verbs:
        - use
      
    2. Introduzca el siguiente comando para crear el Role (o ClusterRole):

      kubectl create -f <filename>.yaml

      Por ejemplo:

      kubectl create -f acme-app-psp-crole.yaml
  3. Cree el RoleBinding (o ClusterRoleBinding) para autorizar a los pods de aplicación a utilizar la política de seguridad de pod:
    1. Defina y guarde el RoleBinding (o ClusterRoleBinding) en un archivo. Por ejemplo, en acme-app-psp-crole.yaml.

      Por ejemplo:

      
      # Role binding which grants access to the app pod security policy
      apiVersion: rbac.authorization.k8s.io/v1
      kind: RoleBinding
      metadata:
        name: acme-app-psp-binding
        namespace: acme-namespace
      roleRef:
        apiGroup: rbac.authorization.k8s.io
        kind: ClusterRole
        name: acme-app-psp-crole
      subjects:
      # For all service accounts in acme-namespace
      - apiGroup: rbac.authorization.k8s.io
        kind: Group
        name: system:serviceaccounts:acme-namespace
    2. Introduzca el siguiente comando para crear el RoleBinding (o ClusterRoleBinding):

      kubectl create -f <filename>.yaml

      Por ejemplo:

      kubectl create -f acme-app-psp-crole-bind.yaml

Una vez definida una política de seguridad de pod y los pods de aplicación autorizados para utilizarla mediante la creación de un Role y un RoleBinding (o un ClusterRole y un ClusterRoleBinding), active el controlador de admisión PodSecurityPolicy para aplicar la política de seguridad de pod (si no está activada ya).

Uso de la consola para activar el controlador de admisión PodSecurityPolicy

Para activar el controlador de admisión PodSecurityPolicy al crear nuevos clusters mediante la consola:

  1. Inicie sesión en la Consola.
  2. Siga las instrucciones para crear un nuevo cluster en Uso de la consola para crear un cluster con una configuración definida explícitamente en el flujo de trabajo "Creación personalizada", haga clic en Mostrar opciones avanzadas y seleccione la opción Políticas de seguridad de pod - Aplicada. Esta opción activa el controlador de admisión PodSecurityPolicy.

    No se aceptará ningún pod de aplicación en el nuevo cluster a menos que existan las políticas de seguridad de pod adecuadas, junto con Roles (o ClusterRoles) y RoleBindings (o ClusterRoleBindings) para asociar los pods a las políticas.

  3. Siga las instrucciones para definir los detalles restantes del cluster y haga clic en Crear cluster para crear el nuevo cluster.
  4. Siga las instrucciones de Creación de una política de seguridad de pod para pods de aplicación para crear políticas de seguridad de pod para que se aplique el controlador de admisión PodSecurityPolicy al aceptar pods en el nuevo cluster.

Para activar el controlador de admisión PodSecurityPolicy en los clusters existentes mediante la consola:

  1. Siga las instrucciones de Creación de una política de seguridad de pod para pods de aplicación para crear políticas de seguridad de pod para que se aplique el controlador de admisión PodSecurityPolicy al aceptar pods en el cluster existente.

    Se recomienda verificar primero las políticas de seguridad del cluster en un entorno de desarrollo o prueba. De esa manera, puede estar seguro de que las políticas de seguridad de pod funcionan como espera y permiten (o rechazan) correctamente que los pods comiencen en el cluster.

  2. Abra el menú de navegación y haga clic en Servicios para desarrolladores. En Contenedores y artefactos, haga clic en Clusters de Kubernetes (OKE).
  3. Seleccione un compartimento en el que tenga permiso para trabajar.
  4. En la página Lista de clusters, haga clic en el nombre del cluster que desea modificar.
  5. En el separador Detalles de cluster, haga clic en No forzado junto a Políticas de seguridad de pod.
  6. En la ventana Políticas de seguridad de pod, seleccione Aplicadas.

    A partir de ahora, no se aceptará ningún pod de aplicación en el cluster a menos que existan políticas de seguridad de pod adecuadas, junto con Roles (o ClusterRoles) y RoleBindings (o ClusterRoleBindings) para asociar los pods a las políticas. Tenga en cuenta que todos los pods actualmente en ejecución continuarán ejecutándose de todas formas.

  7. Haga clic en Guardar cambios.

Uso de la consola para desactivar el controlador de admisión PodSecurityPolicy

Para desactivar el controlador de admisión PodSecurityPolicy en clusters donde estaba activado anteriormente:

  1. Abra el menú de navegación y haga clic en Servicios para desarrolladores. En Contenedores y artefactos, haga clic en Clusters de Kubernetes (OKE).
  2. Seleccione un compartimento en el que tenga permiso para trabajar.
  3. En la página Lista de clusters, haga clic en el nombre del cluster que desea modificar.
  4. En el separador Detalles de cluster, haga clic en Aplicado junto a Políticas de seguridad de pod.
  5. En la ventana Políticas de seguridad de pod, seleccione No aplicadas.

    A partir de ahora, se aceptarán nuevos pods de aplicación en el cluster sin que se necesiten políticas de seguridad de pod, roles (o roles de cluster) y enlaces de roles (o enlaces de roles de cluster). Tenga en cuenta que todos los pods actualmente en ejecución continuarán ejecutándose de todas formas.

  6. Haga clic en Guardar cambios.

referencia de kube-system.yaml

La política de seguridad de pod, y ClusterRole y ClusterRoleBinding asociados, para los pods con privilegios del sistema Kubernetes se crean automáticamente al activar el controlador de admisión PodSecurityPolicy de un cluster. Estos permiten que se ejecute cualquier pod en el espacio de nombre kube-system. Se crean a partir de definiciones en el kube-system.yaml que se muestra a continuación:


apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
  annotations:
    # See https://kubernetes.io/docs/concepts/policy/pod-security-policy/#seccomp
    seccomp.security.alpha.kubernetes.io/allowedProfileNames: '*'
  name: oke-privileged
spec:
  allowedCapabilities:
  - '*'
  allowPrivilegeEscalation: true
  fsGroup:
    rule: 'RunAsAny'
  hostIPC: true
  hostNetwork: true
  hostPID: true
  hostPorts:
  - min: 0
    max: 65535
  privileged: true
  readOnlyRootFilesystem: false
  runAsUser:
    rule: 'RunAsAny'
  seLinux:
    rule: 'RunAsAny'
  supplementalGroups:
    rule: 'RunAsAny'
  volumes:
  - '*'
  
---
  
# Cluster role which grants access to the privileged pod security policy
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: oke-privileged-psp
rules:
- apiGroups:
  - policy
  resourceNames:
  - oke-privileged
  resources:
  - podsecuritypolicies
  verbs:
  - use
  
---
  
# Role binding for kube-system - allow kube-system service accounts - should take care of CNI i.e. flannel running in the kube-system namespace
# Assumes access to the kube-system is restricted
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: kube-system-psp
  namespace: kube-system
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: oke-privileged-psp
subjects:
# For all service accounts in the kube-system namespace
- apiGroup: rbac.authorization.k8s.io
  kind: Group
  name: system:serviceaccounts:kube-system