En este instructivo, se muestra cómo crear una certificación de autorización binaria en una canalización de Cloud Build. Esta configuración ayuda a garantizar que solo las imágenes de contenedor compiladas y firmadas como parte del proceso de compilación de Cloud Build se autoricen de forma automática para ejecutarse en tu entorno de implementación.
Para obtener información sobre cómo usar el análisis de vulnerabilidades de Artifact Analysis en tu canalización de compilación de Cloud Build, consulta Crea certificaciones con Voucher o Crea certificaciones con Kritis Signer.
Descripción general de Cloud Build
Cloud Build (descripción general) toma el código fuente almacenado en Cloud Source Repositories o en otro repositorio alojado, ejecuta tus compilaciones y pruebas, y almacena las salidas de software en Container Registry o cualquier otro servicio de almacenamiento en Google Cloud Platform.
Descripción general de la autorización binaria
La autorización binaria (descripción general) es un producto de Google Cloud que aplica restricciones en el momento de la implementación en las aplicaciones. Su integración en Google Kubernetes Engine (GKE) permite que los usuarios establezcan que los contenedores implementados en un clúster de Kubernetes estén firmados de forma criptográfica por una autoridad confiable y verificados por un certificador de autorización binaria.
Puedes configurar la autorización binaria para requerir certificaciones según la ubicación del código fuente a fin de evitar que se implementen las imágenes de contenedor compiladas a partir de fuentes no autorizadas.
Obtén más información:
- Introducción general a la autorización binaria
- Codelab: Securing Your GKE Deployments with Binary Authorization (Codelab: protege tus implementaciones de GKE con la autorización binaria)
Arquitectura
En el siguiente diagrama, se muestran los componentes de una configuración de autorización binaria de Cloud Build:
En esta canalización, sucede lo siguiente:
El código para compilar la imagen del contenedor se envía a un repositorio de código fuente, como Cloud Source Repositories.
Una herramienta de integración continua (CI), Cloud Build, compila y prueba el contenedor.
La compilación envía la imagen del contenedor a Container Registry o a otro registro que almacena tus imágenes compiladas.
Cloud Key Management Service, que proporciona administración de claves para el par de claves criptográficas, firma la imagen de contenedor. La firma resultante se almacena en una certificación recién creada.
En el momento de la implementación, el certificador verifica la certificación mediante la clave pública del par de claves. La autorización binaria aplica la política mediante la solicitud de certificaciones firmadas para implementar la imagen de contenedor.
Crea una certificación con Cloud Build con Cloud Key Management Service
En esta sección, se muestra cómo implementar la arquitectura anterior. Se usa un paso de compilación personalizado de código abierto de la comunidad de Cloud Build. En el paso de compilación personalizado, se firma una imagen de contenedor, se crea la certificación y se sube a la autorización binaria.
Configura la administración de identidades y accesos
Para usar este paso de compilación, la cuenta de servicio de Cloud Build necesita las siguientes funciones de IAM:
- Visualizador de certificadores de autorización binaria
roles/binaryauthorization.attestorsViewer
- Verificador y firmante de CryptoKey de Cloud KMS (si se usa la clave en KMS para firmar la certificación)
roles/cloudkms.signerVerifier
- Vinculador de notas de Artifact Analysis
roles/containeranalysis.notes.attacher
Los siguientes comandos se pueden usar para agregar las funciones a la cuenta de servicio de Cloud Build de tu proyecto:
Habilita Cloud Build:
Habilita la API de Cloud Build en el proyecto de Cloud de Google Cloud.
Guarda el ID del proyecto en una variable de entorno:
PROJECT_ID=PROJECT_ID
En el ejemplo anterior, PROJECT_ID es el ID del proyecto de Google Cloud.
Configura Google Cloud CLI para el proyecto:
gcloud config set project ${PROJECT_ID}
Obtén el número de proyecto:
PROJECT_NUMBER=$(gcloud projects list --filter="${PROJECT_ID}" --format="value(PROJECT_NUMBER)")
Agrega la función de visualizador de certificadores de autorización binaria a la cuenta de servicio de Cloud Build:
gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \ --role roles/binaryauthorization.attestorsViewer
Agrega la función de verificador y firmante de CryptoKey de Cloud KMS a la cuenta de servicio de Cloud Build (firma basada en KMS):
gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \ --role roles/cloudkms.signerVerifier
Agrega el rol de vinculador de notas de Artifact Analysis a la cuenta de servicio de Cloud Build:
gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \ --role roles/containeranalysis.notes.attacher
Compila y registra el paso de compilación personalizado con Cloud Build
Clona el repositorio de la comunidad de compilación de Google Cloud:
git clone https://github.com/GoogleCloudPlatform/cloud-builders-community.git
Configura el firmante de autorización binaria para Cloud Build:
Antes de usarlo, el código para el paso de compilación personalizado se debe compilar en un contenedor y enviar a Cloud Build. Para ello, ejecuta los siguientes comandos:
cd cloud-builders-community/binauthz-attestation gcloud builds submit . --config cloudbuild.yaml
El paso de compilación personalizado se envió al Google Container Registry de tu proyecto actual y ya está listo para usarse.
Crea un certificador en la autorización binaria
Crea un certificador que la autorización binaria usará en el momento de la implementación para verificar la certificación.
Configura un par de claves del certificador y de Cloud Key Management Service en la autorización binaria:
Consulta Crea un certificador mediante la CLI.
Verifica que se haya creado el certificador
gcloud --project="${ATTESTOR_PROJECT_ID}" container binauthz attestors list
Agrega un paso “create-attestation” a tu cloudbuild.yaml
Si quieres usar el paso binauthz-attestation
, debes actualizar cloudbuild.yaml
. Para ello, agrega el paso que firmará la compilación que se envió a Container Registry.
A continuación, se proporcionan dos métodos:
Actualiza tu
cloudbuild.yaml
de forma manual.Ejecuta una canalización de ejemplo con las variables de entorno que configuraste antes.
Actualiza tu cloudbuild.yaml
de forma manual
Para actualizar
cloudbuild.yaml
de forma manual, agrega el paso de compilación que aparece a continuación después del paso en el que el contenedor se sube a Container Registry. Nota: Debes reemplazar de forma manual ATTESTOR_NAME, KMS_KEY_LOCATION, KMS_KEYRING_NAME, KMS_KEY_NAME, y KMS_KEY_VERSION por tus propios valores:- id: 'create-attestation' name: 'gcr.io/${PROJECT_ID}/binauthz-attestation:latest' args: - '--artifact-url' - 'gcr.io/${PROJECT_ID}/helloworld:latest' - '--attestor' - 'projects/${PROJECT_ID}/attestors/ATTESTOR_NAME' - '--keyversion' - 'projects/${PROJECT_ID}/locations/KMS_KEY_LOCATION/keyRings/KMS_KEYRING_NAME/cryptoKeys/KMS_KEY_NAME/cryptoKeyVersions/KMS_KEY_VERSION'
Lo siguiente también es válido:
- id: 'create-attestation' name: 'gcr.io/${PROJECT_ID}/binauthz-attestation:latest' args: - '--artifact-url' - 'gcr.io/${PROJECT_ID}/helloworld:latest' - '--attestor' - 'ATTESTOR_NAME' - '--attestor-project' - '${PROJECT_ID}' - '--keyversion' - 'KEY_VERSION' - '--keyversion-project' - '${PROJECT_ID}' - '--keyversion-location' - 'KEY_LOCATION' - '--keyversion-keyring' - 'KEYRING_NAME' - '--keyversion-key' - 'KEY_NAME'
Prueba la canalización (opcional)
Para probar una canalización de certificación de Cloud Build de ejemplo, sigue estos pasos:
Crea un archivo
cloudbuild.yaml
con las variables de entorno que configuraste antes:cd example cat <<EOM > cloudbuild_example.yaml steps: - id: 'build' name: 'gcr.io/cloud-builders/docker' args: - 'build' - '-t' - 'gcr.io/$PROJECT_ID/helloworld:latest' - '.' - id: 'publish' name: 'gcr.io/cloud-builders/docker' args: - 'push' - 'gcr.io/$PROJECT_ID/helloworld:latest' - id: 'create-attestation' name: 'gcr.io/$PROJECT_ID/binauthz-attestation:latest' args: - '--artifact-url' - 'gcr.io/$PROJECT_ID/helloworld:latest' - '--attestor' - 'projects/$PROJECT_ID/attestors/${ATTESTOR_NAME}' - '--keyversion' - 'projects/${PROJECT_ID}/locations/${KMS_KEY_LOCATION}/keyRings/${KMS_KEYRING_NAME}/cryptoKeys/${KMS_KEY_NAME}/cryptoKeyVersions/${KMS_KEY_VERSION}' tags: ['cloud-builders-community'] EOM
Ejecuta Cloud Build con el
cloudbuild_example.yaml
de ejemplo:Desde el directorio
cloud-builders-community/binauthz-attestation/example
, ejecuta los siguientes comandos:gcloud builds submit . --config cloudbuild_example.yaml
¿Qué sigue?
- Crea certificaciones después de verificar una imagen con Kritis Signer o Voucher a fin de detectar vulnerabilidades.
- Crea un paso personalizado de Cloud Build para firmar y subir certificaciones de autorización binaria a GitHub.