Configura una política de autorización binaria con GKE

En esta guía de inicio rápido, se muestra cómo configurar y probar una regla básica en una política de autorización binaria.

En esta guía de inicio rápido, verás y configurarás la regla predeterminada en la política. La regla predeterminada permite que todas las imágenes se implementen. Para probar esto, implementa una imagen de contenedor en un clúster de Google Kubernetes Engine (GKE). Luego, configuras la regla predeterminada para inhabilitar la implementación de todas las imágenes y, luego, intentar implementar una imagen.

Antes de comenzar

  1. Accede a tu cuenta de Google Cloud . Si eres nuevo en Google Cloud, crea una cuenta para evaluar el rendimiento de nuestros productos en situaciones reales. Los clientes nuevos también obtienen $300 en créditos gratuitos para ejecutar, probar y, además, implementar cargas de trabajo.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. If you're using an existing project for this guide, verify that you have the permissions required to complete this guide. If you created a new project, then you already have the required permissions.

  4. Verify that billing is enabled for your Google Cloud project.

  5. Enable the Artifact Registry, Binary Authorization APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  6. Instala Google Cloud CLI.

  7. Si usas un proveedor de identidad externo (IdP), primero debes acceder a la gcloud CLI con tu identidad federada.

  8. Para inicializar gcloud CLI, ejecuta el siguiente comando:

    gcloud init
  9. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  10. If you're using an existing project for this guide, verify that you have the permissions required to complete this guide. If you created a new project, then you already have the required permissions.

  11. Verify that billing is enabled for your Google Cloud project.

  12. Enable the Artifact Registry, Binary Authorization APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  13. Instala Google Cloud CLI.

  14. Si usas un proveedor de identidad externo (IdP), primero debes acceder a la gcloud CLI con tu identidad federada.

  15. Para inicializar gcloud CLI, ejecuta el siguiente comando:

    gcloud init
  16. Instala kubectl.

Roles obligatorios

Para obtener los permisos que necesitas para configurar una política de autorización binaria con GKE, pídele a tu administrador que te otorgue los siguientes roles de IAM en tu proyecto:

Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.

También puedes obtener los permisos necesarios a través de roles personalizados o cualquier otro rol predefinido.

Crea un clúster con la aplicación de Autorización Binaria habilitada

Ahora, crea un clúster de GKE con Autorización Binaria habilitada. Este es el clúster en el que se recomienda que se ejecuten las imágenes de contenedor que implementaste.

Autorización Binaria funciona con clústeres de Autopilot o Standard.

Consola de Google Cloud

En los siguientes pasos, se configura un clúster de Autopilot.

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

    Ir a GKE

  2. Haz clic en Crear.

  3. En Crea un clúster de Autopilot, haz lo siguiente:

    1. En el campo Nombre, ingresa test-cluster.

    2. En el menú Región, selecciona us-central1.

    3. Expande la sección Configuración avanzada.

    4. Haz clic en el vínculo Seguridad para que se muestre el panel Seguridad.

    5. En la sección Seguridad, selecciona la casilla de verificación Habilitar Autorización Binaria:

    6. Selecciona Solo aplicar.

    7. Haz clic en Siguiente y, luego, en Siguiente:Revisar y crear.

    8. Para comenzar a crear el clúster, haz clic en Crear.

gcloud

Ejecuta gcloud container clusters create con la marca --binauthz-evaluation-mode=PROJECT_SINGLETON_POLICY_ENFORCE habilitada.

gcloud container clusters create \
    --binauthz-evaluation-mode=PROJECT_SINGLETON_POLICY_ENFORCE \
    --zone us-central1-a \
    test-cluster

Crea un clúster puede tomar varios minutos.

Política predeterminada

De forma predeterminada, la política de autorización binaria está configurada para permitir que se implementen todas las imágenes de contenedor.

Consola de Google Cloud

Para ver la política predeterminada, haz lo siguiente:

  1. Ve a la página Autorización binaria en la consola de Google Cloud .

    Ve a Autorización binaria

    En la consola, se muestran detalles de la política.

  2. Haz clic en Editar política.

  3. En Regla predeterminada del proyecto (Project Default Rule), está seleccionada la opción Permitir todas las imágenes (Allow All Images).

gcloud

Para ver la política predeterminada, exporta el archivo de política en formato YAML de la siguiente manera:

gcloud container binauthz policy export

De forma predeterminada, el archivo tiene el siguiente contenido:

globalPolicyEvaluationMode: ENABLE
defaultAdmissionRule:
  evaluationMode: ALWAYS_ALLOW
  enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG
name: projects/PROJECT_ID/policy

API de REST

Para ver la política predeterminada, recupérala en formato JSON de la siguiente manera:

curl \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    -H "x-goog-user-project: ${PROJECT_ID}" \
    "https://binaryauthorization.googleapis.com/v1/projects/${PROJECT_ID}/policy"

El comando produce el siguiente resultado:

{
  "name": "projects/PROJECT_ID/policy",
  "globalPolicyEvaluationMode": "ENABLE",
  "defaultAdmissionRule": {
    "evaluationMode": "ALWAYS_ALLOW",
    "enforcementMode": "ENFORCED_BLOCK_AND_AUDIT_LOG"
  }
}

Prueba la política de aplicación

Para probar la política de aplicación, intentas implementar una imagen de contenedor de muestra en el clúster.

En esta guía de inicio rápido, usarás la imagen de contenedor de muestra ubicada en la ruta us-docker.pkg.dev/google-samples/containers/gke/hello-app en Artifact Registry. Esta es una imagen de contenedor pública creada por Google que contiene una aplicación de muestra de Hello World.

Consola de Google Cloud

Para probar la política, haz lo siguiente:

  1. Ve a la página Clústeres de GKE en la consola deGoogle Cloud .

    Ir a GKE

  2. Haz clic en Implementar.

    La consola te solicitará que ingreses los detalles de la implementación.

  3. Ingresa hello-server en el campo Nombre de la implementación.

  4. Haz clic en Siguiente: Detalles del contenedor.

  5. Selecciona Imagen de contenedor existente (Existing Container Image).

  6. Ingresa us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0 como la ruta de la imagen de contenedor.

  7. Haz clic en Implementar.

kubectl

Para probar la política, haz lo siguiente:

  1. Actualiza el archivo kubeconfig local:

    gcloud container clusters get-credentials \
        --zone us-central1-a \
        test-cluster
    

    Esto proporciona las credenciales y la información del extremo necesarias para acceder al clúster en GKE.

  2. Implementa la imagen:

    kubectl run hello-server --image us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0 --port 8080
    

Ahora, verifica que la autorización binaria haya permitido la implementación.

Consola de Google Cloud

Para verificar que la imagen se implementó, ve a la página Cargas de trabajo de GKE en la consola de Google Cloud .

Ir a GKE

Aparece una carga de trabajo para la implementación con un ícono verde que indica que la imagen se implementó de forma correcta.

kubectl

Para verificar que se haya implementado la imagen, haz lo siguiente:

kubectl get pods

El comando imprime un mensaje similar al siguiente, que indica que la implementación se realizó de forma correcta:

NAME                            READY     STATUS    RESTARTS   AGE
hello-server-579859fb5b-h2k8s   1/1       Running   0          1m

Asegúrate de borrar la implementación para poder continuar con el siguiente paso:

Consola de Google Cloud

Para borrar la implementación, haz lo siguiente:

  1. Regresa a la página Cargas de trabajo de GKE en la consola deGoogle Cloud .

    Ir a GKE

  2. Selecciona la carga de trabajo hello-server.

  3. Haz clic en Borrar.

kubectl

Para borrar la implementación, haz lo siguiente:

kubectl delete deployment hello-server

Configura la política de aplicación para inhabilitar todas las imágenes

Ahora, modifica la política para bloquear en lugar de permitir que se implementen todas las imágenes.

Consola de Google Cloud

Para modificar la política, haz lo siguiente:

  1. Regresa a la página Autorización binaria en la consola de Google Cloud .

    Ve a Autorización binaria

  2. Haz clic en Editar política.

  3. Selecciona Inhabilitar todas las imágenes (Disallow all images).

  4. Haga clic en Guardar política.

gcloud

Para modificar la política, haz lo siguiente:

  1. Exporta el archivo de políticas en formato YAML:

    gcloud container binauthz policy export  > /tmp/policy.yaml
    
  2. En un editor de texto, cambia el evaluationMode de ALWAYS_ALLOW a ALWAYS_DENY.

    El archivo de políticas en formato YAML debe aparecer de la siguiente manera:

    globalPolicyEvaluationMode: ENABLE
    defaultAdmissionRule:
      evaluationMode: ALWAYS_DENY
      enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG
    name: projects/PROJECT_ID/policy
    
  3. Vuelve a importar el archivo de políticas en formato YAML a la autorización binaria:

    gcloud container binauthz policy import /tmp/policy.yaml
    

API de REST

Para modificar la política, haz lo siguiente:

  1. Crea un archivo de texto con la política actualizada en formato JSON:

    cat > /tmp/policy.json << EOM
    {
      "name": "projects/${PROJECT_ID}/policy",
      "globalPolicyEvaluationMode": "ENABLE",
      "defaultAdmissionRule": {
        "evaluationMode": "ALWAYS_DENY",
        "enforcementMode": "ENFORCED_BLOCK_AND_AUDIT_LOG"
      }
    }
    EOM
    
  2. Envía la política actualizada a la API de REST:

    curl -X PUT \
        -H "Content-Type: application/json" \
        -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
        -H "x-goog-user-project: ${PROJECT_ID}" \
        --data-binary @/tmp/policy.json  \
        "https://binaryauthorization.googleapis.com/v1/projects/${PROJECT_ID}/policy"
    

Vuelve a probar la política

Prueba la política otra vez mediante la implementación de una imagen de contenedor de muestra en el clúster. Esta vez, la autorización binaria bloquea la implementación de la imagen.

Consola de Google Cloud

Implementa la imagen:

  1. Ve a la página Clústeres de GKE en la consola deGoogle Cloud .

    Ir a GKE

  2. Haz clic en Implementar.

    La consola te solicitará que ingreses los detalles de la implementación.

  3. Ingresa hello-server en el campo Nombre de la implementación.

  4. Haz clic en Siguiente: Detalles del contenedor.

  5. Selecciona Imagen de contenedor existente (Existing Container Image).

  6. Ingresa us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0 como la ruta de la imagen de contenedor.

  7. Haz clic en Implementar.

kubectl

Implementa la imagen:

kubectl run hello-server --image us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0 --port 8080

Ahora puede verificar que la política se haya bloqueado:

Consola de Google Cloud

Para verificar que se haya implementado la imagen, haz lo siguiente:

Regresa a la página Cargas de trabajo de GKE en la consola deGoogle Cloud .

Ir a GKE

Aparecerá la carga de trabajo para la imagen de contenedor con un ícono rojo que indica que la imagen no se pudo implementar.

kubectl

Para verificar que la imagen no se haya implementado, ejecuta el siguiente comando:

kubectl get pods

El comando imprime el siguiente mensaje, que indica que la imagen no se implementó:

No resources found.

Puedes obtener más detalles sobre la implementación:

kubectl get event --template \
'{{range.items}}{{"\033[0;36m"}}{{.reason}}:{{"\033[0m"}}{{.message}}{{"\n"}}{{end}}'

Verás una respuesta similar a la siguiente:

FailedCreate: Error creating: pods POD_NAME is forbidden: admission webhook "imagepolicywebhook.image-policy.k8s.io" denied the request: Image IMAGE_NAME denied by Binary Authorization default admission rule. Denied by always_deny admission rule

En este resultado, se ilustra lo siguiente:

  • POD_NAME: Es el nombre del Pod.
  • IMAGE_NAME: Es el nombre de la imagen.
  • ATTESTOR_NAME: Es el nombre del certificador.

Realiza una limpieza

Sigue estos pasos para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos que usaste en esta página.

Borra el clúster que creaste en GKE:

Console

Para borrar el clúster, haz lo siguiente:

  1. Ve a la página Clústeres de GKE en la consola deGoogle Cloud .

    Ir a GKE

  2. Selecciona el clúster test-cluster y haz clic en Borrar.

gcloud

Para borrar el clúster, haz lo siguiente:

gcloud container clusters delete \
    --zone=us-central1-a \
    test-cluster

¿Qué sigue?