Configuración para clústeres de GKE

En este documento, se muestra cómo configurar Autorización Binaria para clústeres de GKE. Luego, se muestra cómo configurar una política de autorización binaria de muestra.

Antes de comenzar

  1. Debes tener clústeres de GKE registrados en Connect. Autorización Binaria es compatible con los siguientes entornos.

    GKE en Bare Metal

    GKE on Bare Metal 1.14 o versiones posteriores.

    GKE en VMware

    GKE en VMware 1.4 o una versión posterior.

  2. El servicio de autorización binaria usa una dirección IP pública, a la que se puede acceder a través de una conexión a Internet normal. Configura las reglas de firewall para HTTPS a fin de permitir que el clúster de usuario acceda al extremo binaryauthorization.googleapis.com.

    GKE en Bare Metal

    Configura las reglas de firewall de GKE en equipos físicos.

    GKE en VMware

    Configura las reglas de firewall de GKE en WMware.

  3. Si deseas usar los Registros de auditoría de Cloud centralizados para ver las entradas de registro de auditoría, incluidas las de Autorización Binaria para clústeres de GKE, debes configurar los registros de auditoría de Cloud en la configuración del clúster.

    GKE en Bare Metal

    Configura los registros de auditoría de Cloud en GKE on Bare Metal.

    GKE en VMware

    Configura registros de auditoría de Cloud en GKE en VMware.

  4. Debes habilitar la API de autorización binaria de la siguiente manera:

    1. Ve a la consola de Google Cloud

      Habilite las API

    2. En la lista desplegable del proyecto, selecciona tu proyecto de Connect. Puedes encontrar este proyecto de Google Cloud en la sección gkeConnect del archivo de configuración de tu clúster de usuario. Este es el proyecto de Google Cloud que conecta tu clúster de usuario a Google Cloud.

Configura Autorización Binaria

En esta sección, configurarás Autorización Binaria para clústeres de GKE en tu clúster.

Especifica las variables de entorno de instalación

Para especificar las variables de entorno, sigue estos pasos:

Usa Workload Identity

  1. Especifica tu proyecto de Connect:

    export PROJECT_ID=PROJECT_ID
    
  2. Especifica el ID de membresía de la flota de tu clúster:

    export MEMBERSHIP_ID=MEMBERSHIP_ID
    

Usa la clave de cuenta de servicio

  1. Especifica tu proyecto de Connect:

    export PROJECT_ID=PROJECT_ID
    

    Reemplaza PROJECT_ID por el proyecto de Google Cloud en la sección gkeConnect del archivo de configuración de tu clúster de usuario.

  2. Especifica la ruta de acceso del archivo kubeconfig del clúster de usuario:

    export KUBECONFIG=PATH
    

    Reemplaza PATH con la ruta de tu archivo kubeconfig del clúster de usuario.

  3. Elige un nombre para la cuenta de servicio de acceso a la API de autorización binaria:

    export SA_NAME=SERVICE_ACCOUNT_NAME
    

    Reemplaza SERVICE_ACCOUNT_NAME por el nombre de cuenta de servicio que elijas. El módulo de autorización binaria usa esta cuenta de servicio para acceder a la API de autorización binaria.

  4. Especifica la ruta de acceso al archivo de claves de la cuenta de servicio que descargarás más adelante en esta guía:

    export SA_JSON_PATH=SA_KEY_FILE_PATH
    

    Reemplaza SA_KEY_FILE_PATH por la ruta de acceso del archivo de claves JSON para la cuenta de servicio.

Instala el módulo de autorización binaria en tu clúster de usuario

Para instalar el módulo de autorización binaria, haz lo siguiente:

Usa Workload Identity

Workload Identity de la flota permite que las cargas de trabajo de tu clúster se autentiquen en Google sin que tengas que descargar, rotar de forma manual y, en general, administrar las claves de cuentas de servicio de Google Cloud. Puedes obtener más información sobre cómo funciona Workload Identity de flota y las ventajas de usarlo, consulta Usa Workload Identity de flota.

  1. Otorga el rol binaryauthorization.policyEvaluator a la cuenta de servicio de Kubernetes en tu proyecto de Connect:

    gcloud projects add-iam-policy-binding ${PROJECT_ID} \
        --member="serviceAccount:${PROJECT_ID}.svc.id.goog[binauthz-system/binauthz-admin]" \
        --role="roles/binaryauthorization.policyEvaluator"
    
  2. Cree un directorio de trabajo:

    1. Crea un directorio llamado binauthz.

    2. Cambia al directorio.

  3. Descarga el archivo manifest-wi-0.2.6.yaml.tmpl, que usas para instalar el módulo de Autorización Binaria en tu clúster de usuario de clústeres de GKE:

    GKE en Bare Metal

    gsutil cp gs://anthos-baremetal-release/binauthz/manifest-wi-0.2.6.yaml.tmpl .
    

    GKE en VMware

    gsutil cp gs://gke-on-prem-release/binauthz/manifest-wi-0.2.6.yaml.tmpl .
    
  4. Sustituye las variables de entorno en la plantilla:

    envsubst < manifest-wi-0.2.6.yaml.tmpl > manifest-0.2.6.yaml
    
  5. Instala el módulo de autorización binaria en tu clúster de usuario:

    kubectl apply -f manifest-0.2.6.yaml
    
  6. Verifica si se creó la implementación:

    kubectl get pod --namespace binauthz-system
    

    Verás el Pod binauthz-module-deployment-* con Status de Running y 1/1 Pods listos, similar a este resultado:

    NAME                                          READY   STATUS    RESTARTS   AGE
    binauthz-module-deployment-5fddf9594f-qjprz   1/1     Running   0          11s
    

Usa la clave de cuenta de servicio

  1. Configura el proyecto predeterminado para Google Cloud CLI:

    gcloud config set project ${PROJECT_ID}
    
  2. Crea una cuenta de servicio de acceso a la API de autorización binaria:

    gcloud iam service-accounts create ${SA_NAME}
    
  3. Otorga el rol binaryauthorization.policyEvaluator a la cuenta de servicio de acceso a la API de autorización binaria en tu proyecto de Connect:

    gcloud projects add-iam-policy-binding ${PROJECT_ID}\
        --member="serviceAccount:${SA_NAME}@${PROJECT_ID}.iam.gserviceaccount.com" \
        --role="roles/binaryauthorization.policyEvaluator"
    
  4. Cree un directorio de trabajo:

    1. Crea un directorio llamado binauthz.

    2. Cambia al directorio.

  5. Descarga el archivo manifest-0.2.6.yaml, que usas para instalar el módulo de Autorización Binaria en tu clúster de usuario de clústeres de GKE:

    anthos_clusters_on_bare_metal

    gsutil cp gs://anthos-baremetal-release/binauthz/manifest-0.2.6.yaml .
    

    anthos_clusters_on_vmware

    gsutil cp gs://gke-on-prem-release/binauthz/manifest-0.2.6.yaml .
    
  6. Crea un archivo YAML para el espacio de nombres binauthz-system.

    Guarda lo siguiente en un archivo llamado namespace.yaml:

    apiVersion: v1
    kind: Namespace
    metadata:
      labels:
        control-plane: binauthz-controller
      name: binauthz-system
    
  7. Crea el espacio de nombres en el clúster de usuario:

    kubectl apply -f namespace.yaml
    

    Verás un resultado similar al siguiente:

    namespace/binauthz-system created
    
  8. Descarga un archivo de claves JSON para tu cuenta de servicio:

    gcloud iam service-accounts keys create ${SA_JSON_PATH} --iam-account ${SA_NAME}@${PROJECT_ID}.iam.gserviceaccount.com
    
  9. Guarda la clave de la cuenta de servicio como un Secret de Kubernetes en tu clúster de usuario:

    kubectl --namespace binauthz-system create secret generic binauthz-sa --from-file=key.json=${SA_JSON_PATH}
    
  10. Instala el módulo de autorización binaria en tu clúster de usuario:

    kubectl apply -f manifest-0.2.6.yaml
    
  11. Verifica si se creó la implementación:

    kubectl get pod --namespace binauthz-system
    

    Verás el Pod binauthz-module-deployment-* con Status de Running y 1/1 Pods listos, similar a este resultado:

    NAME                                          READY   STATUS    RESTARTS   AGE
    binauthz-module-deployment-5fddf9594f-qjprz   1/1     Running   0          11s
    

Configura y usa políticas de autorización binaria

En esta sección, se muestra cómo configurar y usar las políticas de Autorización Binaria para los clústeres de GKE.

En cada ejemplo, debes configurar la política y, luego, probarla mediante la implementación de una imagen de contenedor en el clúster de GKE.

Permitir todo

En esta sección, se muestra un caso de éxito. Debes configurar la política de autorización binaria para que una imagen de contenedor cumpla con ella y se implemente.

En Google Cloud, haz lo siguiente:

Console

  1. En la consola de Google Cloud, ve a la página Autorización binaria.

    Ve a Autorización binaria

  2. Asegúrate de seleccionar el ID de tu proyecto de Connect.

  3. Haz clic en Editar política.

  4. En Regla predeterminada del proyecto, selecciona Permitir todas las imágenes.

  5. Haga clic en Save Policy.

gcloud

  1. Establece el PROJECT_ID para tu proyecto de Connect. Puedes encontrar este ID de proyecto en el campo gkeConnect del archivo de configuración de tu clúster de usuario.

    export PROJECT_ID=PROJECT_ID
    

    Configura el proyecto predeterminado de Google Cloud.

    gcloud config set project ${PROJECT_ID}
    
  2. Exporta el archivo de políticas en formato YAML a tu sistema local:

    gcloud container binauthz policy export  > policy.yaml
    

    Tu archivo YAML se ve de la siguiente manera:

    defaultAdmissionRule:
      enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG
      evaluationMode: ALWAYS_ALLOW
    globalPolicyEvaluationMode: ENABLE
    name: projects/<var>PROJECT_ID</var>/policy
    
  3. Editar policy.yaml.

  4. Establece evaluationMode en ALWAYS_ALLOW.

  5. Si tienes un bloque requireAttestationsBy en el archivo, bórralo.

  6. Guarde el archivo.

  7. Importa policy.yaml de la siguiente manera:

    gcloud container binauthz policy import policy.yaml
    

Para agregar una imagen exenta a la lista de entidades permitidas, agrega lo siguiente al archivo de políticas:

admissionWhitelistPatterns:
  - namePattern: EXEMPT_IMAGE_PATH

Reemplaza EXEMPT_IMAGE_PATH por la ruta de acceso a la imagen que se exime. Para eximir imágenes adicionales, agrega entradas - namePattern adicionales. Obtén más información sobre admissionWhitelistPatterns.

En tu estación de trabajo de administrador de clústeres de GKE, haz lo siguiente:

  1. Crea un archivo de manifiesto para un Pod.

    Guarda lo siguiente en un archivo llamado pod.yaml:

    apiVersion: v1
    kind: Pod
    metadata:
      name: test-pod
    spec:
      containers:
      - name: test-container
        image: gcr.io/google-samples/hello-app@sha256:c62ead5b8c15c231f9e786250b07909daf6c266d0fcddd93fea882eb722c3be4
    
  2. Crea el Pod:

    kubectl apply -f pod.yaml
    

    Verás que el Pod se implementó correctamente.

  3. Borra el Pod:

    kubectl delete -f pod.yaml
    

Inhabilitar todos

En esta sección, se muestra un caso de falla. En esta sección, debes configurar la política predeterminada para que no permita la implementación de la imagen de contenedor.

En Google Cloud, haz lo siguiente:

Console

  1. En la consola de Google Cloud, ve a la página Autorización binaria.

    Ve a Autorización binaria

  2. Asegúrate de que tu proyecto de Connect esté seleccionado.

  3. Haz clic en Editar política.

  4. En Regla predeterminada del proyecto, selecciona No permitir ninguna imagen.

  5. Haz clic en Guardar política.

gcloud

  1. Establece el PROJECT_ID para tu ID del proyecto de Connect.

    export PROJECT_ID=PROJECT_ID
    
  2. Configura el proyecto predeterminado de Google Cloud.

    gcloud config set project ${PROJECT_ID}
    
  3. Exporta el archivo de políticas en formato YAML:

    gcloud container binauthz policy export  > policy.yaml
    
  4. Editar policy.yaml.

  5. Establece evaluationMode en ALWAYS_DENY.

  6. Si tienes un bloque requireAttestationsBy en el archivo, bórralo.

  7. Guarde el archivo.

  8. Importa policy.yaml de la siguiente manera:

    gcloud container binauthz policy import policy.yaml
    

En tu estación de trabajo de administrador de clústeres de GKE, haz lo siguiente:

  1. Crea un archivo de manifiesto para un Pod.

    Guarda lo siguiente en un archivo llamado pod.yaml:

    apiVersion: v1
    kind: Pod
    metadata:
      name: test-pod
    spec:
      containers:
      - name: test-container
        image: gcr.io/google-samples/hello-app@sha256:c62ead5b8c15c231f9e786250b07909daf6c266d0fcddd93fea882eb722c3be4
    
  2. Crea el Pod:

    kubectl apply -f pod.yaml
    

    Verás que se bloqueó la implementación del Pod. El resultado será similar al siguiente:

    Error from server (VIOLATES_POLICY): error when creating "pod.yaml": admission webhook "binaryauthorization.googleapis.com" denied the request: Denied by default admission rule. Overridden by evaluation mode
    

Obtén el ID de recurso del clúster de usuario

En esta sección, se muestra cómo redactar el ID de recurso de tu clúster de usuario. En tu política de autorización binaria, puedes crear reglas específicas del clúster. Debes asociar estas reglas con un ID de recurso específico del clúster, que se basa en tu ID de clúster.

Obtienes el ID de recurso de la siguiente manera:

Console

  1. En la consola de Google Cloud, ve a la página de clústeres de GKE Enterprise.

    Ir a los clústeres

  2. Selecciona el ID del proyecto de Connect para los clústeres de GKE. Puedes encontrar este ID de proyecto en la sección gkeConnect del archivo de configuración de tu clúster de usuario.

  3. En Clústeres administrados por Anthos, busca el ID del clúster en la columna Nombre.

  4. Para crear el ID de recurso, agrega el prefijo global. al ID del clúster a fin de que el ID de recurso tenga el siguiente formato: global.CLUSTER_ID.

gcloud

  1. Usa SSH para conectarte a la estación de trabajo de administrador de clústeres de GKE.

  2. En la estación de trabajo de administrador, ejecuta el siguiente comando:

    kubectl get membership -o yaml
    
  3. Obtén el ID del clúster del campo spec.owner.id del resultado. Este es un resultado de ejemplo:

    apiVersion: v1
    items:
    - apiVersion: hub.gke.io/v1
      kind: Membership
      ...
      spec:
        owner:
          id: //gkehub.googleapis.com/projects/PROJECT_NUMBER/locations/global/memberships/my-cluster-id
    

    En el resultado de ejemplo, el ID del clúster es my-cluster-id.

  4. Para crear el ID de recurso, agrega el prefijo global. al ID del clúster. En el ejemplo, el ID de recurso es global.my-cluster-id.

Usas este ID de recurso cuando defines reglas específicas del clúster. Obtén información para configurar reglas específicas del clúster mediante la consola de Google Cloud o la CLI de gcloud.

Actualiza la política de fallas

El webhook del módulo de autorización binaria se puede configurar para fail open o fail close.

Fail close

Para actualizar la política de fallas a fail close, haz lo siguiente:

  1. Edita el manifest-0.2.6.yaml y establece failurePolicy en Fail

  2. Vuelve a habilitar el webhook:

    kubectl apply -f manifest-0.2.6.yaml
    

    Verás un resultado similar al siguiente:

    serviceaccount/binauthz-admin unchanged
    role.rbac.authorization.k8s.io/binauthz-role configured
    clusterrole.rbac.authorization.k8s.io/binauthz-role configured
    rolebinding.rbac.authorization.k8s.io/binauthz-rolebinding unchanged
    clusterrolebinding.rbac.authorization.k8s.io/binauthz-rolebinding unchanged
    secret/binauthz-tls unchanged
    service/binauthz unchanged
    deployment.apps/binauthz-module-deployment unchanged
    validatingwebhookconfiguration.admissionregistration.k8s.io/binauthz-validating-webhook-configuration configured
    

Fail open

Para actualizar la política de fallas a fail open, haz lo siguiente:

  1. Edita el manifest-0.2.6.yaml y establece failurePolicy en Ignore

  2. Vuelve a habilitar el webhook:

    kubectl apply -f manifest-0.2.6.yaml
    

    Verás un resultado similar al siguiente:

    serviceaccount/binauthz-admin unchanged
    role.rbac.authorization.k8s.io/binauthz-role configured
    clusterrole.rbac.authorization.k8s.io/binauthz-role configured
    rolebinding.rbac.authorization.k8s.io/binauthz-rolebinding unchanged
    clusterrolebinding.rbac.authorization.k8s.io/binauthz-rolebinding unchanged
    secret/binauthz-tls unchanged
    service/binauthz unchanged
    deployment.apps/binauthz-module-deployment unchanged
    validatingwebhookconfiguration.admissionregistration.k8s.io/binauthz-validating-webhook-configuration configured
    

Para obtener más información, consulta la política de falla del webhook.

Libera espacio

  1. En la siguiente muestra de código, se indica cómo inhabilitar el webhook:

    kubectl delete ValidatingWebhookConfiguration/binauthz-validating-webhook-configuration
    
  2. En la siguiente muestra de código, se muestra cómo volver a habilitar el webhook:

    kubectl apply -f manifest-0.2.6.yaml
    
  3. En la siguiente muestra de código, se indica cómo borrar todos los recursos relacionados con la autorización binaria:

    kubectl delete -f manifest-0.2.6.yaml
    kubectl delete namespace binauthz-system
    

¿Qué sigue?