Configura una política mediante la API de REST

En esta página, se proporcionan instrucciones para configurar una política de autorización binaria mediante la API de REST. Como alternativa, también puedes realizar estas tareas con la Google Cloud CLI o la consola de Google Cloud. Este paso forma parte de la configuración de la autorización binaria.

Descripción general

Una política es un conjunto de reglas que rigen la implementación de una o más imágenes de contenedor.

Cuando configuras una política con la API de REST, propagas valores en un formato JSON cuya estructura es idéntica a la estructura YAML que se usa en las interacciones de gcloud con el servicio. Para obtener más información, consulta la Referencia de las políticas en formato YAML.

Para configurar una política, debes hacer lo siguiente:

  • Exportar un archivo de políticas en formato JSON
  • Agregar cualquier imagen exenta adicional (opcional)
  • Configurar la regla predeterminada
  • Agregar cualquier regla específica del clúster (opcional)
  • Importa el archivo de políticas en formato JSON

La mayoría de las políticas reales comprueban que todos los certificadores necesarios verifiquen que una imagen de contenedor esté lista para implementarse. En este caso, también debes crear certificadores cuando configures la política.

Configura el proyecto predeterminado

Configura el proyecto predeterminado de Google Cloud si aún no lo hiciste:

PROJECT_ID=PROJECT_ID
gcloud config set project ${PROJECT_ID}

En el ejemplo anterior, PROJECT_ID es el ID de tu proyecto.

Exporta la política

Esta sección se aplica a GKE, clústeres de GKE, Cloud Run y Anthos Service Mesh.

Exporta la política a un archivo JSON en tu sistema local:

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" \
    -o "/tmp/policy.json"

De forma predeterminada, el archivo tiene el siguiente contenido:

{
  "name": "projects/PROJECT_ID/policy",
  "admissionWhitelistPatterns": [
    {
      "namePattern": "gcr.io/google_containers/*"
    },
    {
      "namePattern": "gcr.io/google-containers/*"
    },
    {
      "namePattern": "k8s.gcr.io/**"
    },
    {
      "namePattern": "gcr.io/stackdriver-agents/*"
    }
  ],
  "globalPolicyEvaluationMode": "ENABLE",
  "defaultAdmissionRule": {
    "evaluationMode": "ALWAYS_ALLOW",
    "enforcementMode": "ENFORCED_BLOCK_AND_AUDIT_LOG"
  }
}

La lista admissionWhitelistPatterns predeterminada en tu exportación de políticas puede mostrar rutas de imagen diferentes de las que se muestran en esta guía.

Administra imágenes exentas

Esta sección se aplica a GKE, clústeres de GKE, Cloud Run y Anthos Service Mesh.

Una imagen exenta es una imagen de contenedor que está exenta de las reglas de política. La autorización binaria siempre permite que se implementen imágenes exentas

Para especificar imágenes exentas, enumera sus rutas de registro en admissionWhitelistPatterns. La ruta puede hacer referencia a Container Registry o a otro registro de imágenes. El ejecutor procesa imágenes exentas en admissionWhitelistPatterns después de que las imágenes estén exentas por el modo de evaluación de la política del sistema.

Para agregar una imagen exenta, agrega un nodo namePattern en una lista admissionWhitelistPatterns en el archivo de la política en formato JSON:

{
  "name": "projects/PROJECT_ID/policy",
  "admissionWhitelistPatterns": [
    {
      "namePattern": "MATCHING_PATTERN"
    }
  ],
  ...
}

En el ejemplo anterior, MATCHING_PATTERN es la ruta a una sola imagen en tu registro por coincidencia exacta o a cualquier imagen que coincida con un patrón que use el símbolo de comodín (*, **).

Cloud Run

Esta sección se aplica a Cloud Run.

No puedes especificar directamente los nombres de imágenes que contengan una etiqueta. Por ejemplo, no puedes especificar IMAGE_PATH:latest.

Si deseas especificar nombres de imágenes que contienen etiquetas, debes especificar el nombre de la imagen con un comodín de la siguiente manera:

  • * para todas las versiones de una sola imagen; por ejemplo, us-docker.pkg.dev/myproject/container/hello@*
  • ** para todas las imágenes de un proyecto; por ejemplo, us-docker.pkg.dev/myproject/**

Puedes usar nombres de rutas para especificar un resumen en el formato IMAGE_PATH@DIGEST.

Modo de evaluación de la política del sistema

Esta sección se aplica a GKE y clústeres de GKE.

El modo de evaluación de políticas del sistema es una configuración de política que hace que la autorización binaria evalúe una política del sistema antes de evaluar la política que configuraste. Google administra la política del sistema, que exime una lista de imágenes del sistema mantenidas por Google que GKE usa. La aplicación de las políticas no bloquea las imágenes enumeradas en la política del sistema. Si no habilitas la configuración, debes administrar la lista de imágenes exentas por tu cuenta. Obtén más información para administrar imágenes exentas.

Puedes ver el contenido del sistema global mediante el siguiente comando:

gcloud alpha container binauthz policy export-system-policy

Para habilitar el modo de evaluación de políticas del sistema, agrega el siguiente nodo de nivel superior al archivo de la política en formato JSON:

"globalPolicyEvaluationMode": "ENABLE"

Para inhabilitar el modo de evaluación del sistema global, agrega lo siguiente:

"globalPolicyEvaluationMode": "DISABLE"

Puedes exportar la política del sistema asociada con una región específica de la siguiente manera:

gcloud alpha container binauthz policy export-system-policy \
  --location=REGION > /tmp/policy.yaml

Reemplaza REGION por la región asociada a la política del sistema que deseas exportar (o “global”). Los ejemplos incluyen: asia-east1, europe-west1, us-central1.

Si omites --location o especificas --location=global, el comando genera una política del sistema de una región en el último grupo de regiones para recibir actualizaciones. Debido a que la mayoría de los cambios en la política del sistema son adiciones, el resultado muestra el conjunto de imágenes del sistema que están permitidas en todas las regiones.

Configura la regla predeterminada

Esta sección se aplica a GKE, clústeres de GKE, Cloud Run y Anthos Service Mesh.

Una regla es la parte de una política que define las restricciones que las imágenes de contenedor deben pasar antes de poder implementarlas. Cada solicitud de admisión tiene un clúster de GKE asociado. Si una solicitud no coincide con una regla específica del clúster, se usa la regla predeterminada.

La regla predeterminada se define en el nodo defaultAdmissionRule de la política. Para obtener más información sobre las partes de esta regla, consulta ADMISSION_RULE en la referencia de políticas en formato YAML. Para ver ejemplos de reglas predeterminadas, consulta Políticas de ejemplo.

Para establecer la regla predeterminada, edita el nodo defaultAdmissionRule en el archivo de políticas en formato JSON según sea necesario:

  "defaultAdmissionRule": {
    "evaluationMode": "EVAL_MODE",
    "enforcementMode": "ENFORCEMENT_MODE"
    requireAttestationsBy: [
      ATTESTOR,
      ...
    ]
  }

Donde:

  • EVAL_MODE especifica el tipo de restricción que la autorización binaria evalúa antes de permitir que se implemente una imagen de contenedor.
  • ENFORCEMENT_MODE especifica la acción que se realiza si una imagen de contenedor no cumple con las restricciones definidas en la regla.
  • ATTESTOR especifica los certificadores (si es necesario) que deben firmar una imagen de contenedor antes de implementarla. Usa la ruta completamente calificada al certificador en el formato projects/PROJECT_ID/attestors/ATTESTOR_NAME.

Si la regla verifica que todos los certificadores obligatorios hayan firmado una imagen de contenedor, debes crear certificadores antes de completar este paso.

Configura reglas específicas del clúster (opcional)

Esta sección se aplica a GKE y clústeres de GKE.

Un clúster también puede tener una o más reglas específicas del clúster. Este tipo de regla se aplica solo al clúster de GKE especificado. Si un clúster no tiene una regla propia, se usa la predeterminada. Las reglas específicas del clúster son una parte opcional de una política.

Las reglas específicas del clúster se definen en los nodos clusterAdmissionRules en el archivo de la política en formato JSON. Para obtener más información sobre las partes de esta regla, consulta ADMISSION_RULE en la referencia de políticas en formato YAML. Para ver un ejemplo, consulta Usa una regla específica del clúster en las Políticas de ejemplo.

Para agregar una regla específica del clúster, haz lo siguiente:

En el archivo de la política en formato JSON, agrega un nodo clusterAdmissionRules:

"clusterAdmissionRules": {
    "us-central1-a.test-cluster": {
      "evaluationMode": "REQUIRE_ATTESTATION",
      "requireAttestationsBy": [
        "ATTESTOR",
        ...
      ],
      "enforcementMode": "ENFORCED_BLOCK_AND_AUDIT_LOG"
    }
  },

en el que CLUSTER_SPECIFIER es el ID de recurso del clúster al que se aplica la regla.

  • Para GKE, clústeres conectados de GKE y GKE on AWS, el formato es CLUSTER_LOCATION.CLUSTER_NAME, por ejemplo, us-central1-a.test-cluster.
  • Para GKE en Bare Metal y GKE en VMware, el formato es FLEET_MEMBERSHIP_LOCATION.FLEET_MEMBERSHIP_ID, por ejemplo, global.test-membership.

Las otras propiedades se describen en Configura la regla predeterminada, una sección anterior en esta guía. Consulta Políticas de ejemplo para ver un ejemplo de una regla específica del clúster.

Si la regla verifica que todos los certificadores obligatorios hayan firmado una imagen de contenedor, debes crear certificadores antes de completar este paso.

Importa el archivo de políticas en formato JSON

Esta sección se aplica a GKE, clústeres de GKE, Cloud Run y Anthos Service Mesh.

Para volver a importar el archivo de la política en formato JSON a la autorización binaria, ingresa lo siguiente:

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"

¿Qué sigue?