En este instructivo, se explica cómo crear Kritis Signer y usarlo para verificar las imágenes de contenedores en busca de vulnerabilidades antes de crear certificaciones de autorización binaria.
Descripción general
Kritis Signer es una herramienta de línea de comandos de código abierto que puede crear certificaciones de autorización binaria según la política que configures. También puedes usar Kritis Signer para crear certificaciones después de verificar una imagen en busca de vulnerabilidades identificadas por Artifact Analysis.
Además, Cloud Build puede ejecutar Kritis Signer como un compilador personalizado en una canalización de compilación.
En este instructivo, realizarás una compilación única del compilador personalizado de Kritis Signer y, luego, ejecutarás canalizaciones de compilación de muestra. Cada canalización de muestra contiene los siguientes pasos de compilación:
- Compilar una imagen de contenedor de muestra
- Envía la imagen a Container Registry.
- Verifica y firma la imagen: Usa Kritis Signer para crear una certificación basada en la política.
En el paso de compilación de verificación y firma de cada canalización, Kritis Signer hace lo siguiente:
- Analiza la imagen recién compilada con Artifact Analysis y recupera una lista de vulnerabilidades.
- Verifica la lista de vulnerabilidades según las reglas de firma de vulnerabilidades en la política y, luego, haz lo siguiente:
- Si todas las vulnerabilidades identificadas satisfacen las reglas de firma de vulnerabilidades, Kritis Signer crea la certificación.
- Si alguna de las vulnerabilidades identificadas infringe las reglas de firma de vulnerabilidades, Kritis Signer no crea la certificación.
En el momento de la implementación, el ejecutor de la autorización binaria verifica la certificación verificable. Sin una, el ejecutor no permite la implementación de la imagen.
En este instructivo, también se explica cómo ejecutar Kritis Signer en modo de solo verificación en una canalización de Cloud Build. En este modo, Kritis Signer no crea una certificación, solo verifica si los resultados de la vulnerabilidad cumplen con las reglas de firma de vulnerabilidades de la política. Si lo hace, el paso de compilación de Kritis Signer se realiza de forma correcta y la canalización continúa ejecutándose, de lo contrario, el paso falla y la canalización se cierra.
Objetivos
En este instructivo, harás lo que se indica a continuación:
- Configura Kritis Signer como compilador personalizado de Cloud Build.
- Visualiza una política que contenga reglas de firma de vulnerabilidades.
- Ejecuta Kritis Signer para crear certificaciones basadas en los resultados del análisis de vulnerabilidades.
- Ejecuta Kritis Signer en modo de solo verificación.
Costos
En este instructivo, se usan los siguientes productos de Google Cloud.
- Container Registry
- Artifact Analysis
- Cloud Build
- Cloud Key Management Service
Usa la calculadora de precios para estimar los costos según el uso previsto.
Antes de comenzar
En esta sección, realizarás una configuración única del sistema.
Configure su entorno
Almacena tu proyecto de Google Cloud en una variable de entorno.
export PROJECT_ID=PROJECT_ID
Reemplaza PROJECT_ID con el proyecto de Google Cloud.
Establece el ID del proyecto predeterminado en tu proyecto de Google Cloud:
gcloud config set project $PROJECT_ID
Almacena el número de proyecto en una variable de entorno para los pasos futuros:
export PROJECT_NUMBER=$(gcloud projects list --filter="${PROJECT_ID}" \ --format="value(PROJECT_NUMBER)")
Habilita las API:
A fin de asegurarte de que los servicios necesarios para esta guía estén habilitados, ejecuta el siguiente comando:
gcloud services enable \ cloudbuild.googleapis.com \ containerregistry.googleapis.com \ containerscanning.googleapis.com \ cloudkms.googleapis.com
Configura las funciones de IAM
Ejecuta los siguientes comandos para configurar la cuenta de servicio de Cloud Build con los siguientes roles:
containeranalysis.notes.editor
: Agrega el rol Editor de notas de Artifact Analysis para administrar el certificador.containeranalysis.notes.occurrences.viewer
: Agrega el rol Casos de Artifact Analysis para notas a fin de administrar los casos de vulnerabilidades y certificaciones.roles/containeranalysis.occurrences.editor
: Agrega el rol Editor de casos de Artifact Analysis para crear casos de certificación en Artifact Analysis.cloudkms.signer
: Agrega el rol Firmante de CryptoKey de Cloud KMS que permite que la cuenta de servicio acceda al servicio de firmas de Cloud KMS.gcloud projects add-iam-policy-binding $PROJECT_ID --member serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com --role roles/containeranalysis.notes.editor gcloud projects add-iam-policy-binding $PROJECT_ID --member serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com --role roles/containeranalysis.notes.occurrences.viewer gcloud projects add-iam-policy-binding $PROJECT_ID --member serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com --role roles/containeranalysis.occurrences.editor gcloud projects add-iam-policy-binding $PROJECT_ID --member serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com --role roles/cloudkms.signer
Configura el compilador personalizado de Kritis Signer
En esta sección, realizarás una configuración única del compilador personalizado de Kritis Signer. Una vez que obtienes, compilas y envías Kritis Signer, se puede usar en cualquier canalización de Cloud Build.
En esta sección se muestra cómo realizar las siguientes acciones:
- Clonar el repositorio de Kritis.
- Compilar el compilador personalizado de Kritis Signer para Cloud Build
- Enviar Kritis Signer a Container Registry para que esté disponible como paso de compilación de Cloud Build.
Ejecutar los siguientes comandos para obtener el código y los archivos de configuración que se usaron en este instructivo.
Clonar el repositorio de Kritis:
git clone https://github.com/grafeas/kritis.git
Este repositorio contiene lo siguiente:
- Código fuente de Kritis que también incluye Kritis Signer.
- Un archivo de configuración de Cloud Build que es usado por Cloud Build para compilar el compilador personalizado de Kritis Signer
- Una política de ejemplo que contiene reglas de firma de vulnerabilidades.
- Ejemplo de un archivo de configuración de Cloud Build. Cada archivo de configuración usa Kritis Signer en una canalización de análisis de vulnerabilidades.
Navega al directorio
kritis/
.cd kritis
Compila y registra el compilador personalizado de Kritis Signer.
En este paso de configuración único, se compila el compilador personalizado de Kritis Signer y se registra con Cloud Build. Una vez registrado, el compilador personalizado estará disponible para su uso en cualquier canalización de Cloud Build.
gcloud builds submit . --config deploy/kritis-signer/cloudbuild.yaml
Visualiza una política existente
En esta sección, se muestra un ejemplo de la política de Kritis Signer.
Esta política configura Kritis Signer para solicitar a Artifact Analysis que analice la imagen en busca de vulnerabilidades. Una vez que se completa el análisis, Kritis Signer verifica los resultados de la vulnerabilidad que se muestran en las reglas de firma de vulnerabilidades de la política.
Puedes editar las reglas de firma de vulnerabilidades en esta política para crear una certificación basada en lo siguiente:
- Niveles de gravedad de las vulnerabilidades identificadas.
- Vulnerabilidades específicas.
También puedes configurar la política para crear de forma incondicional (ALLOW_ALL
) o no crear una certificación (BLOCK_ALL
).
Para ver la política de Kritis Signer, ejecuta el siguiente comando:
cat samples/signer/policy-strict.yaml
La política es similar al siguiente ejemplo:
Donde:
maximumUnfixableSeverity
ymaximumFixableSeverity
definen los umbrales de gravedad de vulnerabilidades y riesgos comunes (CVE) en los que Kritis Signer crea certificaciones.maximumUnfixableSeverity
define el umbral de gravedad para el cual no hay una corrección disponible actualmente.maximumFixableSeverity
define el umbral de gravedad para el cual hay una corrección disponible actualmente.maximumUnfixableSeverity
ymaximumFixableSeverity
se pueden establecer en uno de los siguientes niveles de gravedad:CRITICAL
HIGH
MEDIUM
LOW
Para obtener más información sobre los niveles de gravedad, consulta Niveles de gravedad.
Como alternativa, puedes establecer
maximumUnfixableSeverity
ymaximumFixableSeverity
de la siguiente manera:BLOCK_ALL
: La certificación no se crea si se identifica alguna vulnerabilidad.ALLOW_ALL
: La certificación siempre se crea.
allowlistCVEs
es una lista de CVE específicas para incluir en la lista de entidades permitidas. Kritis Signer ignora las CVE de esta lista cuando evalúa si crea una certificación. Cada entrada en la lista de anunciantes permitidos debe coincidir con exactitud con el nombre de la nota de Artifact Analysis para la CVE. Obtén más información sobre las fuentes de vulnerabilidades de Artifact Analysis. Para obtener más información sobre las notas, consulta Almacenamiento de metadatos.
Crea una clave de firma de Cloud KMS
Las claves de Cloud Key Management Service se usan para crear la certificación.
Crea un nuevo llavero de claves de Cloud KMS con el nombre KEY_RING:
gcloud kms keyrings create KEY_RING \ --location global
Crea una clave de Cloud KMS nueva llamada KEY_NAME dentro del llavero de claves:
gcloud kms keys create KEY_NAME \ --keyring KEY_RING \ --location global \ --purpose "asymmetric-signing" \ --default-algorithm "rsa-sign-pkcs1-2048-sha256"
Almacena el algoritmo de resumen y Cloud KMS en una variable de entorno para los pasos futuros:
export KMS_DIGEST_ALG=SHA256 export KMS_KEY_NAME=projects/$PROJECT_ID/locations/global/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions/1
Define un nombre de nota
Todas las certificaciones hacen referencia a una nota de Artifact Analysis. Kritis Signer crea de forma automática una nota para un nombre determinado. También puedes volver a usar los nombres de las notas existentes.
export NOTE_ID=my-signer-note
export NOTE_NAME=projects/${PROJECT_ID}/notes/${NOTE_ID}
Crea certificaciones con Kritis Signer en una canalización de Cloud Build
En esta sección, se muestra cómo usar el compilador personalizado en la nube de Kritis Signer para crear certificaciones de autorización binaria basadas en los resultados del análisis de vulnerabilidades.
En los siguientes pasos, se muestra cómo funciona Kritis Signer con los archivos de configuración de compilación de ejemplo en el repositorio de Kritis Signer. Cada archivo de configuración de ejemplo contiene los siguientes pasos de compilación:
- Un paso de
docker build
que compila una imagen de contenedor de Docker. - Un paso de
docker push
que envía la imagen de contenedor recién compilada a Container Registry. Un paso de
vulnsign
que verifica y firma la imagen de contenedor de la siguiente manera:- Se espera a que Artifact Analysis muestre los resultados de la búsqueda de vulnerabilidades en la imagen de contenedor recién compilada.
- Se verifican los resultados con las reglas de firma de vulnerabilidades en la política.
- Se crea la certificación si los resultados cumplen con las reglas de vulnerabilidad
Debes enviar cada una de las compilaciones de ejemplo a Cloud Build. Cada compilación produce un resultado de vulnerabilidad:
- Caso de falla: resultado de la vulnerabilidad infringe las reglas de firma de vulnerabilidades. Esta compilación falla y no se crea ninguna certificación.
- Caso de éxito: El resultado de la vulnerabilidad cumple con las reglas de firma de vulnerabilidades. Esta compilación se realiza de forma correcta y se crea una certificación.
Envía la compilación de muestra de un caso de error
En esta sección, compilarás una imagen de contenedor y la analizarás en busca de vulnerabilidades.
La compilación falla porque la imagen de contenedor se basa en una instantánea específica de Debian 10, que contiene una cantidad de vulnerabilidades con un nivel de gravedad HIGH
. Estas vulnerabilidades infringen la regla de firma de vulnerabilidades. Como resultado, el compilador no produce una certificación.
(Opcional) Consulta el archivo de la política de firma de vulnerabilidades del caso de fallas.
cat samples/signer/policy-strict.yaml
Envía la compilación:
gcloud builds submit \ --substitutions=_KMS_KEY_NAME=$KMS_KEY_NAME,_KMS_DIGEST_ALG=$KMS_DIGEST_ALG,_NOTE_NAME=$NOTE_NAME \ --config=samples/signer/cloudbuild-bad.yaml samples/signer
Verás un resultado como el siguiente:
"ERROR: (gcloud.builds.submit) build BUILD_ID completed with status "FAILURE"
Guarda el ID de compilación de la última compilación:
export BUILD_ID=$(gcloud builds list --limit=1 --format="value('ID')")
Verifica el resultado:
gcloud storage cat gs://${PROJECT_NUMBER}.cloudbuild-logs.googleusercontent.com/log-${BUILD_ID}.txt | grep "does not pass VulnzSigningPolicy"
Envía la compilación de caso de éxito de muestra
En esta sección, compilarás una imagen de contenedor que contiene vulnerabilidades que no infringen las reglas de firma de vulnerabilidades. En este caso, el compilador personalizado de Kritis Signer crea una certificación.
Para enviar la compilación de caso de éxito de muestra a Cloud Build, ejecuta el siguiente comando:
(Opcional) Consulta el archivo de la política de firma de vulnerabilidades del caso de éxito.
cat samples/signer/policy-loose.yaml
Envía la compilación:
gcloud builds submit \ --substitutions=_KMS_KEY_NAME=$KMS_KEY_NAME,_KMS_DIGEST_ALG=$KMS_DIGEST_ALG,_NOTE_NAME=$NOTE_NAME \ --config=samples/signer/cloudbuild-good.yaml samples/signer
Guarda el ID de compilación de la última compilación:
export BUILD_ID=$(gcloud builds list --limit=1 --format="value('ID')")
Verifica el resultado:
gcloud builds describe $BUILD_ID | grep status
Usa Kritis Signer en modo de solo verificación.
En esta sección, se muestra cómo usar Kritis Signer en modo check-only
. En este modo, Kritis Signer no crea una certificación. Solo verifica que la imagen no tenga vulnerabilidades antes del éxito o la falla del paso de compilación, según las reglas de firma de vulnerabilidades.
Envía la compilación de muestra de un caso de error
(Opcional) Consulta el archivo de la política de firma de vulnerabilidades del caso de fallas.
cat samples/policy-check/policy-strict.yaml
En el paso de compilación de Kritis Signer, ten en cuenta que la marca
mode
se establece encheck-only
.Envía la compilación:
gcloud builds submit \ --config=samples/policy-check/cloudbuild-bad.yaml samples/policy-check
Ten en cuenta que la compilación falla.
Guarda el ID de compilación de la última compilación:
export BUILD_ID=$(gcloud builds list --limit=1 --format="value('ID')")
Verifica el resultado:
gcloud storage cat gs://${PROJECT_NUMBER}.cloudbuild-logs.googleusercontent.com/log-${BUILD_ID}.txt | grep "does not pass VulnzSigningPolicy"
Envía la compilación de caso de éxito de muestra
(Opcional) Consulta el archivo de la política de firma de vulnerabilidades del caso de éxito.
cat samples/policy-check/policy-loose.yaml
Envía la compilación:
gcloud builds submit \ --config=samples/policy-check/cloudbuild-good.yaml samples/policy-check
Guarda el ID de compilación de la última compilación:
export BUILD_ID=$(gcloud builds list --limit=1 --format="value('ID')")
Verifica el resultado:
gcloud builds describe $BUILD_ID | grep status
Crea un certificador
Para crear una política que requiera las certificaciones que creas con el método descrito en esta guía, primero debes crear un certificador.
Para crear un certificador, haz lo siguiente:
Recupera el material de clave pública de la clave de Cloud KMS que creaste antes en esta guía:
gcloud kms keys versions get-public-key 1 \ --key KEY_NAME \ --keyring KEY_RING \ --location global \ --output-file OUTPUT_PATH
KEY_NAME
: el nombre de la claveKEY_RING
: es el nombre del llavero de clavesOUTPUT_PATH
: una ruta de acceso a archivos, por ejemplo,my-key.pem
Crea un certificador mediante el material de clave pública en el archivo y la nota que creaste antes en esta guía. Puedes crear un certificador mediante la consola de Google Cloud o gcloud CLI.
Crea una política que requiera certificaciones y proporciona el certificador que creaste en esta sección. Puedes crear una política a través de la consola de Google Cloud o la gcloud CLI.
Crea una certificación
Para crear una certificación mediante tu certificador, consulta Crea una certificación con Cloud KMS.
Libera espacio
Para limpiar los recursos que se usan en este documento, puedes borrar el proyecto:
gcloud projects delete ${PROJECT_ID}
¿Qué sigue?
- Documentación de Kritis Signer en GitHub
- Descripción general de la autorización binaria
- Crea certificadores a través de la consola de Google Cloud o la herramienta de línea de comandos.
- Configura una política para exigir certificaciones a través de la consola de Google Cloud o la herramienta de línea de comandos.
- Crea certificaciones con Voucher
- Artifact Analysis y análisis de vulnerabilidades
- Comunidad de Cloud Build y compiladores personalizados en la nube