En este instructivo, se muestra cómo configurar y probar una política de autorización binaria que requiere certificaciones. Con este tipo de política, se protege tu cadena de suministro de software basada en contenedores mediante la definición de quién puede implementar imágenes de contenedor en Google Kubernetes Engine (GKE) y qué imágenes de contenedor se pueden implementar.
En el momento de la implementación, la autorización binaria usa certificadores para verificar las firmas digitales de las certificaciones. Los firmantes crearon las certificaciones como parte del proceso de compilación.
En este instructivo, el clúster de GKE, las certificaciones y los certificadores se encuentran en un solo proyecto. La configuración de un solo proyecto es muy útil para realizar pruebas o experimentar con el servicio. Para ver un ejemplo más real, consulta la configuración de varios proyectos.
En los siguientes pasos, se describen las tareas que realizarás desde la consola de Google Cloud y algunas tareas que realizarás mediante los comandos de gcloud
. Para seguir estos pasos mediante gcloud
, consulta Comienza a usar Google Cloud CLI.
Objetivos
En este instructivo, aprenderás a realizar las siguientes acciones:
- Crear un clúster (de GKE) con la autorización binaria habilitada
- Crear un certificador que el ejecutor de la autorización binaria usará para verificar la firma de una certificación
- Configurar una política que requiera una certificación
- Crear un par de claves criptográficas para firmar certificaciones y poder verificarlas más tarde
- Firmar un resumen de imagen de contenedor, lo que crea una firma
- Crear una certificación mediante la firma
- Probar la política mediante la implementación de una imagen de contenedor en GKE
Costos
En este documento, usarás los siguientes componentes facturables de Google Cloud:
- Artifact Registry
- Binary Authorization
- GKE
- Container Registry
- Optional: Cloud Key Management Service
Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios.
Antes de comenzar
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Container Registry, Artifact Analysis and Binary Authorization APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Container Registry, Artifact Analysis and Binary Authorization APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
- Instala
kubectl
.
Configura el proyecto predeterminado
Para facilitar los siguientes comandos, almacena el ID del proyecto de Google Cloud en una variable de entorno, de la siguiente manera:
PROJECT_ID=PROJECT_ID
En el ejemplo anterior, PROJECT_ID es el nombre del proyecto.
Si no seleccionaste el proyecto predeterminado, configúralo ahora:
gcloud config set project ${PROJECT_ID}
Crea un clúster con la autorización binaria habilitada
Crea el clúster
Ahora puedes crear un clúster de GKE con la autorización binaria habilitada. Aquí, crearás un clúster llamado test-cluster
en la zona de GKE us-central1-a
.
Sigue estos pasos para crear el clúster:
Visita el menú de GKE en la consola de Google Cloud.
Haz clic en Crear clúster.
Ingresa
test-cluster
en el campo Nombre.Selecciona Zonal en las opciones de Tipo de ubicación.
Selecciona
us-central1-a
de la lista desplegable Zona.Haz clic en Availability, networking, security, and additional features.
En la sección Seguridad (Security), selecciona Enable Binary Authorization.
Selecciona Solo aplicar.
Haz clic en Crear.
Configurar kubectl
También debes actualizar el archivo local kubeconfig
de tu instalación de kubectl
. Esto proporciona las credenciales y la información del extremo necesarias para acceder al clúster en GKE.
Para actualizar el archivo kubeconfig
local, sigue estos pasos:
gcloud container clusters get-credentials \ --zone us-central1-a \ test-cluster
Visualiza la política predeterminada
Una política en la autorización binaria es un conjunto de reglas que rige la implementación de imágenes de contenedor. Puedes tener una política por proyecto. De forma predeterminada, la política está configurada para permitir la implementación de todas las imágenes de contenedor.
Para ver la política predeterminada, sigue estos pasos:
Ve a la página Autorización binaria en la consola de Google Cloud.
Haz clic en Editar política.
En Regla predeterminada del proyecto, se muestra la opción Permitir todas las imágenes.
Haz clic en Guardar política.
Crea un certificador
Un certificador es la autoridad de verificación que el ejecutor de la autorización binaria usa en el momento de la implementación para decidir si permite que GKE implemente la imagen de contenedor firmada correspondiente. El certificador contiene la clave pública y, por lo general, lo administra la persona responsable de la seguridad de la cadena de suministro de software.
Para crear un certificador, debes hacer lo siguiente:
- Crear el certificador en la autorización binaria
- Generar de forma automática una nota de certificador asociado en Artifact Analysis para almacenar metadatos de certificación de confianza que se usan en el proceso de autorización
Para este instructivo, tienes un certificador llamado test-attestor
. En una situación real, puedes tener cualquier cantidad de certificadores, cada uno representa a una parte que participa en el proceso de autorización de la imagen.
Genera un par de claves
La autorización binaria usa claves criptográficas para verificar de forma segura la identidad de los firmantes. Esto garantiza que solo se puedan implementar imágenes de contenedor autorizadas. El par de claves contiene una clave privada y una pública. El firmante usa la clave privada a fin de firmar el resumen de la imagen de contenedor, lo que produce una firma que, luego, se almacena en una certificación. La clave pública se almacena en el certificador. En el momento de la implementación, el ejecutor de la autorización binaria usa la clave pública del certificador para verificar la firma en la certificación antes de permitir la implementación del contenedor.
En este instructivo, usarás el formato (PKIX) de infraestructura de claves públicas (X.509) para las claves criptográficas. En este instructivo, se usa el Algoritmo de firma digital de curva elíptica (ECDSA) que se recomienda para crear el par de claves PKIX. También puedes usar las claves de RSA o PGP para firmar. Consulta Algoritmos y propósitos de clave para obtener más información sobre los algoritmos de firma.
Las claves que Cloud Key Management Service (Cloud KMS) genera y almacena son compatibles con PKIX. Consulta Crea certificadores mediante la CLI para obtener más información sobre el uso de claves PKIX y Cloud KMS.
Para generar un par de claves de PKIX, haz lo siguiente:
Crea la clave privada:
PRIVATE_KEY_FILE="/tmp/ec_private.pem" openssl ecparam -genkey -name prime256v1 -noout -out ${PRIVATE_KEY_FILE}
Extrae la clave pública de la clave privada:
PUBLIC_KEY_FILE="/tmp/ec_public.pem" openssl ec -in ${PRIVATE_KEY_FILE} -pubout -out ${PUBLIC_KEY_FILE}
Crea el certificador
Ahora puedes crear el certificador en la autorización binaria y asociar la clave pública que creaste.
Para crear el certificador, haz lo siguiente:
Regresa a la página Autorización binaria en la consola de Google Cloud.
En la pestaña Certificadores (Attestors), haz clic en Crear (Create).
Completa los campos de la siguiente manera:
Ingresa
test-attestor
en el campo Nombre del certificador.Verifica que la opción Crear nota de Artifact Analysis automáticamente esté marcada.
Haz clic en Agregar una clave pública de PKIX.
Abre
/tmp/ec_public.pem
en un editor de texto. Este es el archivo de claves públicas que creaste en el paso anterior. Copia el contenido del archivo en el cuadro de texto Material de clave pública.Haz clic en
Elliptic Curve P-256 - SHA256 Digest
en el menú desplegable Signature algorithm.Haz clic en Listo.
Haz clic en Crear para crear el certificador.
Almacena el ID de la clave pública.
Para ver el ID de la clave pública del certificador después de agregárselo, usa
gcloud container binauthz attestors describe ${ATTESTOR_NAME}
: Si quieres crear una variable de entorno para almacenar el ID de la clave pública, ejecuta el siguiente comando:ATTESTOR_NAME=test-attestor PUBLIC_KEY_ID=$(gcloud container binauthz attestors describe ${ATTESTOR_NAME}\ --format='value(userOwnedGrafeasNote.publicKeys[0].id)')
Configura la política
Ahora puedes configurar tu política:
Regresa a la página Autorización binaria en Google Cloud Console.
En la pestaña Política, haz clic en Editar política.
Selecciona Allow Only Images That Have Been Approved By the Following Attestors.
Haz clic en Agregar certificadores.
Haz clic en Agregar por proyecto y nombre del certificador.
Ingresa el PROJECT_ID en el campo Nombre del proyecto.
Ingresa
test-attestor
en el campo Nombre del certificador.Haz clic en Add 1 Attestor.
Haga clic en Save Policy.
Para obtener más información, consulta Configura una política mediante Console.
Prueba la política
Para probar la política que configuraste antes, intenta implementar una imagen de contenedor de muestra en el clúster. La política bloqueará la implementación porque no se realizó la certificación necesaria.
Para este instructivo, puedes usar imágenes de muestra de Container Registry y Artifact Registry. La imagen de Container Registry se encuentra en la ruta gcr.io/google-samples/hello-app:1.0
. La imagen de Artifact Registry se encuentra en la ruta us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0
.
Ambas rutas de acceso contienen una imagen pública creada por Google que contiene una aplicación "Hello, World!" de muestra.
Para intentar implementar la imagen, ejecuta el siguiente comando:
kubectl run hello-server --image gcr.io/google-samples/hello-app:1.0 --port 8080
Ahora, verifica que la autorización binaria haya bloqueado la implementación:
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. Image IMAGE_NAME denied by ATTESTOR_NAME: No attestations found
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.
Asegúrate de borrar la implementación para poder continuar con el siguiente paso:
kubectl delete deployment hello-server
Crea una certificación
Una certificación es un documento digital creado por un firmante que certifica que GKE puede implementar la imagen de contenedor asociado. A veces, el proceso para crear una certificación se denomina “firmar una imagen”.
En este instructivo, creas una certificación para imágenes de ejemplo de Container Registry y Artifact Registry.
Para crear una certificación, sigue estos pasos:
Configura las variables que almacenan la ruta de registro, el resumen de la imagen y el nombre del certificador:
Container Registry
IMAGE_PATH="gcr.io/google-samples/hello-app" IMAGE_DIGEST="sha256:c62ead5b8c15c231f9e786250b07909daf6c266d0fcddd93fea882eb722c3be4" ATTESTOR="test-attestor" IMAGE_TO_ATTEST=${IMAGE_PATH}@${IMAGE_DIGEST}
Artifact Registry
IMAGE_PATH="us-docker.pkg.dev/google-samples/containers/gke/hello-app" IMAGE_DIGEST="sha256:37e5287945774f27b418ce567cd77f4bbc9ef44a1bcd1a2312369f31f9cce567" ATTESTOR="test-attestor" IMAGE_TO_ATTEST=${IMAGE_PATH}@${IMAGE_DIGEST}
Genera la carga útil de la certificación:
Container Registry
gcloud container binauthz create-signature-payload \ --artifact-url=${IMAGE_PATH}@${IMAGE_DIGEST} > /tmp/generated_payload.json
El archivo JSON de carga útil tiene el siguiente contenido:
{ "critical": { "identity": { "docker-reference": "gcr.io/google-samples/hello-app" }, "image": { "docker-manifest-digest": "sha256:c62ead5b8c15c231f9e786250b07909daf6c266d0fcddd93fea 882eb722c3be4" }, "type": "Google cloud binauthz container signature" } }
Artifact Registry
gcloud container binauthz create-signature-payload \ --artifact-url=${IMAGE_PATH}@${IMAGE_DIGEST} > /tmp/generated_payload.json
El archivo JSON de carga útil tiene el siguiente contenido:
{ "critical": { "identity": { "docker-reference": "us-docker.pkg.dev/google-samples/containers/gke/hello-app" }, "image": { "docker-manifest-digest": "sha256:37e5287945774f27b418ce567cd77f4bbc9ef44a1bcd1a2312369f31f9cce567" }, "type": "Google cloud binauthz container signature" } }
Firma la carga útil con la clave privada de PKIX y genera un archivo de firma:
openssl dgst -sha256 -sign ${PRIVATE_KEY_FILE} /tmp/generated_payload.json > /tmp/ec_signature
El archivo de firma es una versión con firma digital del archivo JSON de carga útil que creaste antes.
Crea y valida la certificación:
gcloud container binauthz attestations create \ --project="${PROJECT_ID}" \ --artifact-url="${IMAGE_TO_ATTEST}" \ --attestor="projects/${PROJECT_ID}/attestors/${ATTESTOR_NAME}" \ --signature-file=/tmp/ec_signature \ --public-key-id="${PUBLIC_KEY_ID}" \ --validate
En el ejemplo anterior,
PUBLIC_KEY_ID
es el ID de la clave pública que encontraste en Genera un par de claves de PKIX.La marca
validate
comprueba que el certificador que configuraste en la política pueda verificar la certificación.Verifica que se haya creado la certificación:
gcloud container binauthz attestations list \ --attestor=$ATTESTOR_NAME --attestor-project=$PROJECT_ID
Para obtener más información sobre cómo crear certificaciones, consulta Crea certificaciones.
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, debes implementar la imagen mediante el resumen en lugar de una etiqueta, como 1.0
o latest
, ya que la Autorización Binaria usará el resumen para buscar certificaciones. Aquí, la Autorización Binaria permite implementar la imagen, ya que se realizó la certificación necesaria.
Para implementar la imagen, ejecute el siguiente comando.
kubectl run hello-server --image ${IMAGE_PATH}@${IMAGE_DIGEST} --port 8080
Para verificar que la imagen se haya implementado, ejecuta el siguiente comando:
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
Para borrar el pob, ejecute el siguiente comando:
kubectl delete pod hello-server
Realiza una limpieza
Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos usados en este instructivo, borra el proyecto que contiene los recursos o conserva el proyecto y borra los recursos individuales.
Borra el clúster que creaste en GKE:
gcloud container clusters delete \ --zone=us-central1-a \ test-cluster
¿Qué sigue?
- Más información sobre la autorización binaria
- Obtén más información sobre los conceptos clave que se usan en la autorización binaria
- Usa el certificador
built-by-cloud-build
para implementar solo imágenes compiladas por Cloud Build (Vista previa). - Aprende a usar resúmenes de imágenes en manifiestos de Kubernetes
- Habilita el modo de ejecución de prueba para inhabilitar la aplicación