Comienza a usar la consola de Google Cloud (GKE)


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:

Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios. Es posible que los usuarios nuevos de Google Cloud califiquen para obtener una prueba gratuita.

Antes de comenzar

  1. 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.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Container Registry, Artifact Analysis and Binary Authorization APIs.

    Enable the APIs

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

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

    Go to project selector

  8. Make sure that billing is enabled for your Google Cloud project.

  9. Enable the Container Registry, Artifact Analysis and Binary Authorization APIs.

    Enable the APIs

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

    gcloud init
  12. 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:

  1. Visita el menú de GKE en la consola de Google Cloud.

    Ir a GKE

  2. Haz clic en Crear clúster.

  3. Ingresa test-cluster en el campo Nombre.

  4. Selecciona Zonal en las opciones de Tipo de ubicación.

  5. Selecciona us-central1-a de la lista desplegable Zona.

  6. Haz clic en Availability, networking, security, and additional features.

  7. En la sección Seguridad (Security), selecciona Enable Binary Authorization.

  8. Selecciona Solo aplicar.

  9. 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:

  1. Ve 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. En Regla predeterminada del proyecto, se muestra la opción Permitir todas las imágenes.

  4. 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 de infraestructura de clave pública (X.509) (PKIX) 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:

  1. Crea la clave privada:

    PRIVATE_KEY_FILE="/tmp/ec_private.pem"
    openssl ecparam -genkey -name prime256v1 -noout -out ${PRIVATE_KEY_FILE}
    
  2. 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:

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

    Vuelve a la autorización binaria

  2. En la pestaña Certificadores (Attestors), haz clic en Crear (Create).

    Captura de pantalla de la pestaña de la política que muestra la regla predeterminada

  3. Completa los campos de la siguiente manera:

    1. Ingresa test-attestor en el campo Nombre del certificador.

    2. Verifica que la opción Crear nota de Artifact Analysis automáticamente esté marcada.

    3. Haz clic en Agregar una clave pública de PKIX.

    4. 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.

    5. Haz clic en Elliptic Curve P-256 - SHA256 Digest en el menú desplegable Signature algorithm.

    6. Haz clic en Listo.

  4. Haz clic en Crear para crear el certificador.

  5. 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:

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

  2. En la pestaña Política, haz clic en Editar política.

  3. Selecciona Allow Only Images That Have Been Approved By the Following Attestors.

  4. Haz clic en Agregar certificadores.

  5. Haz clic en Agregar por proyecto y nombre del certificador.

  6. Ingresa el PROJECT_ID en el campo Nombre del proyecto.

  7. Ingresa test-attestor en el campo Nombre del certificador.

  8. Haz clic en Add 1 Attestor.

  9. 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:

  1. 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}
    
  2. 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"
    }
    }
    
  3. 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.

  4. 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.

  5. 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?