Ejecutar cargas de trabajo con privilegios de partners de Autopilot de GKE


En esta página se explica cómo ejecutar cargas de trabajo con privilegios de partners de Autopilot de Google Kubernetes Engine (GKE). Aprenderás a configurar una carga de trabajo de sincronización que instale una lista de permitidos en tu clúster y la mantenga actualizada.

Esta página está dirigida a los siguientes tipos de roles:

  • Ingenieros de seguridad que quieran asegurarse de que las cargas de trabajo de terceros necesiten una lista de permitidos para ejecutarse en sus clústeres y procedan de fuentes aprobadas por GKE.
  • Ingenieros de plataformas que quieran habilitar cargas de trabajo de terceros en clústeres para desbloquear a los equipos de aplicaciones.

Para obtener más información sobre los roles habituales y las tareas de ejemplo a los que hacemos referencia en nuestra documentación, consulta Roles y tareas de usuario habituales de GKE.

Antes de leer esta página, asegúrese de que conoce los siguientes conceptos:

Acerca de las cargas de trabajo de partners con privilegios en Autopilot

GKE permite que un subconjunto de partners aprobados ejecuten cargas de trabajo con privilegios en clústeres de Autopilot. Estas cargas de trabajo privilegiadas pueden eludir algunas de las restricciones de seguridad que aplica Autopilot. Por ejemplo, un partner puede necesitar ejecutar una carga de trabajo que use funciones específicas de Linux o que requiera un contenedor con privilegios.

Los partners crean y mantienen listas de permitidos para sus cargas de trabajo privilegiadas. Cada lista de permitidos es un archivo que coincide con una carga de trabajo de un partner privilegiado específico. Los partners envían estos archivos de lista de permitidos a GKE para que los apruebe. Una vez aprobada, GKE aloja el archivo de lista de permitidos en un repositorio gestionado por Google.

Para ejecutar una carga de trabajo de un partner, instala el archivo de lista de permitidos correspondiente en tu clúster. GKE proporciona un recurso personalizado de Kubernetes llamado AllowlistSynchronizer que instala listas de permitidos y las mantiene actualizadas. Una vez que se haya instalado correctamente una lista de permitidos, podrás implementar la carga de trabajo del partner privilegiado correspondiente.

Errores y solicitudes de funciones para cargas de trabajo privilegiadas y listas de permitidos

Los partners son responsables de crear, desarrollar y mantener sus cargas de trabajo privilegiadas y sus listas de permitidos. Si detectas un error o tienes una solicitud de función para una carga de trabajo privilegiada o una lista de permitidos, ponte en contacto con el partner correspondiente.

Acerca del mando AllowlistSynchronizer

El AllowlistSynchronizer es un controlador que se ejecuta en tu plano de control de GKE. Despliega un nuevo AllowlistSynchronizer como un manifiesto YAML, de forma similar a como despliegas cualquier otra carga de trabajo de Kubernetes. En el manifiesto, especifica la ruta al archivo de la lista de permitidos que quieras instalar, que obtendrás del partner externo. El sincronizador busca el archivo de lista de permitidos del partner en un repositorio gestionado por Google e instala la lista de permitidos en tu clúster.

Cada 10 minutos, el sincronizador comprueba si hay actualizaciones en el archivo de la lista de permitidos. Si hay una actualización, el sincronizador instala la lista de permitidos actualizada en tu clúster.

Para dejar de permitir cargas de trabajo específicas, actualiza los AllowlistSynchronizers que ya tengas para quitar las rutas de los archivos de la lista de permitidos correspondientes y, a continuación, elimina el objeto WorkloadAllowlist de tu clúster. Si eliminas un objeto WorkloadAllowlist instalado sin quitar la ruta de tu sincronizador de lista de permitidos, el sincronizador volverá a instalar la lista de permitidos. Los partners no pueden eliminar archivos de listas de permitidos del repositorio gestionado por Google.

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.

Requisitos

  • El recurso personalizado AllowlistSynchronizer requiere la versión 1.32.2-gke.1652000 de GKE o una posterior.
  • Debes saber qué carga de trabajo de partner quieres ejecutar en tu clúster. Consulta la documentación de tu partner para obtener instrucciones sobre cómo instalar la carga de trabajo privilegiada.

Crea un AllowlistSynchronizer.

Para ejecutar una carga de trabajo con privilegios de un partner, debes añadir la ruta al archivo de lista de permitidos correspondiente a un recurso personalizado AllowlistSynchronizer. A continuación, despliega AllowlistSynchronizer en tu clúster.

  1. En un editor de texto, crea un archivo YAML.
  2. Añade el siguiente contenido al archivo YAML:

    apiVersion: auto.gke.io/v1
    kind: AllowlistSynchronizer
    metadata:
      name: ALLOWLIST_SYNCHRONIZER_NAME
    spec:
      allowlistPaths:
      - ALLOWLIST1_PATH
      - ALLOWLIST2_PATH
    

    Haz los cambios siguientes:

    • ALLOWLIST_SYNCHRONIZER_NAME: el nombre del nuevo sincronizador. Elige un nombre descriptivo que identifique la carga de trabajo o el equipo que admite la lista de permitidos.
    • ALLOWLIST1_PATH, ALLOWLIST2_PATH, ...: una o varias rutas a archivos de lista de permitidos de partners que se van a instalar. Consulta la documentación de la carga de trabajo del partner que hayas elegido para este paso. Puedes especificar directorios completos o archivos concretos.
  3. Despliega el archivo YAML en tu clúster:

    kubectl apply -f PATH_TO_YAML_FILE
    

    Sustituye PATH_TO_YAML_FILE por la ruta al archivo YAML que has creado en el paso anterior.

    El controlador AllowlistSynchronizer instala archivos de lista de permitidos desde las rutas especificadas en tu clúster.

  4. Espera hasta que el sincronizador muestre el estado Ready:

    kubectl wait --for=condition=Ready allowlistsynchronizer/ALLOWLIST_SYNCHRONIZER_NAME \
      --timeout=60s
    

También puedes integrar el despliegue de la carga de trabajo del partner en tu flujo de integración continua y despliegue continuo (CI/CD). Configura tu flujo de trabajo para que espere a que se instale correctamente la lista de permitidos antes de implementar la carga de trabajo correspondiente.

Actualizar un AllowlistSynchronizer

Puedes actualizar un AllowlistSynchronizer para añadir o quitar archivos de la lista de permitidos. Puede que tengas que actualizar los sincronizadores en situaciones como las siguientes:

  • El partner añade un nuevo archivo de lista de permitidos con otro nombre.
  • Quieres añadir una nueva lista de permitidos de cargas de trabajo a un sincronizador que agrupe listas de permitidos relacionadas.
  • Quieres quitar una lista de permitidos de un sincronizador porque ya no quieres usar la carga de trabajo correspondiente.

Para actualizar un objeto AllowlistSynchronizer, sigue estos pasos:

  1. Lista los sincronizadores de tu clúster:

    kubectl get allowlistsynchronizer
    
  2. Abre la especificación del sincronizador que quieras actualizar en un editor de texto.

  3. Actualiza el campo spec.allowlistPaths para añadir, modificar o eliminar rutas de archivos de la lista de permitidos.

  4. Guarda y cierra el editor de texto.

  5. Aplica la configuración actualizada al clúster:

    kubectl apply -f PATH_TO_YAML_FILE
    

    Sustituye PATH_TO_YAML_FILE por la ruta del archivo YAML que has actualizado en el paso anterior.

Cuando implementas una configuración de sincronizador actualizada, el campo managedAllowlistStatus.generation del estado del objeto AllowlistSynchronizer aumenta en uno. El controlador AllowlistSynchronizer aplica los cambios.

Monitorizar el estado de la sincronización de la lista de permitidos

Una vez que hayas instalado un AllowlistSynchronizer o actualizado un sincronizador, puedes monitorizar el estado de la sincronización. El estado te ayuda a monitorizar la instalación, la eliminación o las modificaciones de los archivos de la lista de permitidos, así como los errores que puedan producirse.

Para monitorizar el estado general de la sincronización, ejecuta el siguiente comando:

kubectl get allowlistsynchronizer ALLOWLIST_SYNCHRONIZER_NAME -o yaml

El resultado debería ser similar al siguiente:

...
status:
  conditions:
  - type: Ready
    status: "False"
    reason: "SyncError"
    message: "some allowlists failed to sync: example-allowlist-1.yaml"
    lastTransitionTime: "2024-10-12T10:00:00Z"
    observedGeneration: 2
  managedAllowlistStatus:
    - filePath: "gs://path/to/allowlist1.yaml"
      generation: 1
      phase: Installed
      lastSuccessfulSync: "2024-10-10T10:00:00Z"
    - filePath: "gs://path/to/allowlist2.yaml"
      phase: Failed
      lastError: "Initial install failed: invalid contents"
      lastSuccessfulSync: "2024-10-08T10:00:00Z"

Para ver una descripción de estos campos, consulta el estado AllowlistSynchronizer.

Verificar que existe una lista de permitidos en el clúster

Para verificar que hay una lista de permitidos en tu clúster, ejecuta el siguiente comando:

kubectl get workloadallowlist

El resultado es una lista de las listas de permitidos instaladas en el clúster. Comprueba que el resultado incluya la lista de permitidos que quieras usar.

Desplegar la carga de trabajo privilegiada

Una vez que se haya instalado correctamente una lista de permitidos, podrás implementar la carga de trabajo correspondiente en tu clúster. El partner que proporcione la carga de trabajo también debe facilitarte las instrucciones de instalación de la carga de trabajo. Para ver una lista de los partners de Autopilot y enlaces a su documentación, consulta Partners de Autopilot.

Usar repositorios de réplica de imágenes privadas

Puedes replicar las imágenes de contenedor de las cargas de trabajo de los partners en repositorios privados de tu propiedad. Para ejecutar estas imágenes reflejadas en una carga de trabajo, debes cumplir todos los requisitos siguientes:

  • El digest SHA-256 de la imagen reflejada debe coincidir con el digest de la imagen de la carga de trabajo del partner disponible públicamente.
  • El digest de imagen SHA-256 que especifiques debe existir en el objeto WorkloadAllowlist que proporciona el partner y que se sincroniza con tu clúster.

Si la carga de trabajo del partner admite imágenes reflejadas, la especificación de la lista de permitidos de esa carga de trabajo contiene una lista de resúmenes de imágenes en el campo containers.imageDigests de la especificación de la lista de permitidos de esa carga de trabajo. Normalmente, este campo tiene un resumen independiente para cada versión disponible de la imagen del contenedor. Para ver esta lista de resúmenes de imágenes, haz lo siguiente:

  1. Verifica que la lista de permitidos exista en tu clúster.
  2. Obtén la especificación de la lista de permitidos instalada:

    kubectl get workloadallowlist ALLOWLIST_NAME -o yaml
    

    Sustituye ALLOWLIST_NAME por el nombre de la lista de permitidos instalada. Por ejemplo, company-name-solution-v1.0.0.

    En las cargas de trabajo que admiten esta función, el resultado es similar al siguiente. El campo imageDigests tiene una lista de resúmenes permitidos.

    # lines omitted for clarity
    - containerName: pause-container1
      imageDigests:
      - cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229
      - 932ea160d395f3d7f76c0c17a52a63c4cfe1836a900f1058b6bc20b16fd10d23
    

    Si el resultado no incluye el campo imageDigests o si el resumen de la versión que quiere usar no está en la lista, póngase en contacto directamente con el partner y pídale que actualice su lista de permitidos. Una vez que el partner añada resúmenes de imágenes a su lista de permitidas y envíe los cambios a GKE, el sincronizador de listas de permitidas de tu clúster instalará automáticamente la lista de permitidas actualizada.

  3. Añade uno de los resúmenes de imagen admitidos al manifiesto de tu carga de trabajo.

Por ejemplo, considera la siguiente imagen en una especificación de Pod disponible públicamente de un partner:

...
  containers:
  - name: pause-container1
    image: partner-repo/pause1@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229
    securityContext:
      privileged: true

Puedes usar una imagen reflejada si el digest coincide con el digest disponible públicamente, como en el siguiente ejemplo:

...
  containers:
  - name: pause-container1
    image: my-private-repo/pause1@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229
    securityContext:
      privileged: true

Debes incluir el digest SHA-256 en el campo de imagen, como en el ejemplo anterior. Si los resúmenes no coinciden, la imagen reflejada no se ejecutará. Para conservar los resúmenes de imágenes al replicar imágenes de partners, puedes usar una herramienta como crane, ORAS o skopeo.

Eliminar una carga de trabajo privilegiada

Para dejar de permitir que una carga de trabajo privilegiada se ejecute en tus clústeres, elimina la ruta a la lista de permitidos correspondiente de tu AllowlistSynchronizer. El sincronizador desinstala la lista de permitidos.

Si eliminas un objeto WorkloadAllowlist de tu clúster en lugar de actualizar el sincronizador, este volverá a instalar la lista de permitidos. Asegúrate de quitar la ruta de AllowlistSynchronizer.

Para desinstalar una lista de permitidos, sigue estos pasos:

  1. En el manifiesto YAML del AllowlistSynchronizer que gestiona la lista de permitidos, elimina la ruta de la lista de permitidos que quieras desinstalar. Para obtener instrucciones, consulta la sección Actualizar un AllowlistSynchronizer.
  2. Para verificar que la lista de permitidos se ha desinstalado, obtén una lista de objetos WorkloadAllowlist en tu clúster:

    kubectl get workloadallowlist
    

    En el resultado, comprueba que la lista de permitidas que querías eliminar no aparezca.

  3. Elimina la carga de trabajo del clúster. Para obtener instrucciones, consulta la documentación del proveedor de la carga de trabajo.

Evitar la instalación de listas de permitidos en tus clústeres

Para evitar la instalación de listas de permitidos de cargas de trabajo privilegiadas en clústeres específicos, usa un ValidatingAdmissionPolicy. La validación de las políticas de admisión asegura que los recursos de Kubernetes cumplan criterios específicos antes de poder ejecutarse en el clúster. Por ejemplo, puede validar que una etiqueta tenga un valor específico.

Para evitar que se instalen listas de permitidos en un clúster, haz lo siguiente:

  1. Guarda el siguiente manifiesto de ValidatingAdmissionPolicy como disallow-allowlists.yaml:

    apiVersion: admissionregistration.k8s.io/v1
    kind: ValidatingAdmissionPolicy
    metadata:
      name: "disallow-allowlists"
    spec:
      failurePolicy: Fail
      matchConstraints:
        resourceRules:
        - apiGroups:   ["auto.gke.io"]
          apiVersions: ["*"]
          operations:  ["*"]
          resources:   ["allowlistsynchronizers"]
      validations:
      - expression: "false"
        message: 'AllowlistSynchronizer creation is not allowed'
    
  2. Guarda el siguiente manifiesto de ValidatingAdmissionPolicyBinding como disallow-allowlists-binding.yaml:

    apiVersion: admissionregistration.k8s.io/v1
    kind: ValidatingAdmissionPolicyBinding
    metadata:
      name: "disallow-allowlists-binding"
    spec:
      policyName: "disallow-allowlists"
      validationActions: [Deny]
    
  3. Despliega ValidatingAdmissionPolicy en tu clúster:

    kubectl apply -f disallow-allowlists.yaml
    kubectl apply -f disallow-allowlists-binding.yaml
    

Esta política impide la creación de nuevos AllowlistSynchronizers en el clúster.

Solucionar problemas

Si la sincronización o la implementación de la carga de trabajo fallan, consulta Solucionar problemas al implementar cargas de trabajo de Autopilot con privilegios.

Siguientes pasos