Crear y otorgar acceso a recursos confidenciales


Los colaboradores de datos deben configurar los siguientes recursos para que una carga de trabajo pueda acceder a sus datos confidenciales:

Además, los colaboradores de datos deben elegir dónde se almacenan los resultados de la carga de trabajo de Confidential Space y si los datos presentados son únicos o compartidos. Por ejemplo, puedes generar el mismo resultado en varios buckets de Cloud Storage que pertenezcan a cada colaborador de datos.

Almacena tus datos

Puedes usar cualquier servicio de Google Cloud que almacene datos para alojar tus datos confidenciales. Por ejemplo, puedes usar uno de los siguientes servicios:

Debes asegurarte de que estos datos estén encriptados en reposo, ya sea con funciones integradas o con algo como Cloud Key Management Service (Cloud KMS).

Crea una cuenta de servicio para desencriptar datos confidenciales

Puedes poner tus datos confidenciales a disposición de las cargas de trabajo de Confidential Space y reducir la exposición humana a esos datos a través de las cuentas de servicio.

Por ejemplo, puedes encriptar archivos confidenciales en Cloud Storage con Cloud KMS y, luego, crear una cuenta de servicio que tenga permiso para acceder a esos datos y a la clave para desencriptarlos.

Luego, conecta esa cuenta de servicio a un proyecto en curso. Una carga de trabajo de Confidential Space autorizada basada en otro proyecto puede usar ese WIP para robar la identidad de la cuenta de servicio que desencripta los datos, recuperarlos y procesarlos.

Dado que las cuentas de servicio se usan para desencriptar los datos confidenciales y procesarlos, la visibilidad de los datos confidenciales se restringe a sus propietarios. Debido a que la carga de trabajo opera en una Confidential VM, su encriptación de memoria basada en hardware garantiza que tus datos permanezcan privados mientras se usan. SSH también está inhabilitado en las VMs de cargas de trabajo que usan la imagen de Confidential Space de producción, lo que significa que nadie puede acceder a la VM mientras se ejecuta.

Consulta Crea tu primer entorno de Confidential Space para ver un ejemplo de esto.

Crea un WIP y un proveedor para la validación de la certificación

Para ayudar a proteger los datos de un operador de carga de trabajo no confiable, Confidential Space implementa un proceso de certificación que detecta modificaciones en una imagen de carga de trabajo o su TEE. El proceso se basa en el inicio medido de la VM protegida y las mediciones extendidas del entorno de ejecución, y captura las mediciones de la secuencia de inicio en un registro protegido de solo extensión en el dispositivo del módulo de plataforma de confianza virtual (vTPM).

El servicio de certificación de Confidential Space genera tokens de OpenID Connect (OIDC) que incluyen estas certificaciones de vTPM en un formato que puede validar un WIP, que las compara con las políticas agregadas como condiciones de atributos a un proveedor. Google firma estos tokens, que duran una hora y se actualizan automáticamente.

Si el WIP autoriza la carga de trabajo, esta puede suplantar la identidad de las cuentas de servicio en el proyecto para desencriptar y recuperar datos confidenciales.

Para configurar un WIP y un proveedor, completa las siguientes instrucciones:

  1. Crea el WIP.

  2. Conecta tu cuenta de servicio de desencriptación al WIP con el rol iam.workloadIdentityUser.

  3. Crea un proveedor de OIDC con los siguientes detalles:

    • Un URI de la entidad emisora de https://confidentialcomputing.googleapis.com/.

    • Un público permitido de https://sts.googleapis.com

    • Una asignación de atributos del proveedor de google.subject, con un valor de assertion.sub.

    • Condiciones de atributos que se usan para validar las certificaciones de la carga de trabajo Consulta Crea una política de certificación para ver las opciones disponibles.

Crea una política de certificación

Como parte de la creación de un WIP, agregas condiciones de atributos, que son condiciones que una carga de trabajo debe cumplir para poder acceder a tus datos. En el caso de Confidential Space, estas condiciones de atributos forman tu política de certificación.

Las políticas se escriben en Common Expression Language (CEL) y constan de una serie de aserciones que se pueden encadenar con el operador &&.

A continuación, se muestra un ejemplo de cómo agregar un proveedor a un grupo de Workload Identity mediante la gcloud CLI, junto con la opción attribute-condition que define las políticas:

gcloud iam workload-identity-pools providers create-oidc attestation-verifier \
    --location=global \
    --workload-identity-pool=user-pool-name \
    --issuer-uri="https://confidentialcomputing.googleapis.com/" \
    --allowed-audiences="https://sts.googleapis.com" \
    --attribute-mapping="google.subject=assertion.sub" \
    --attribute-condition="assertion.submods.container.image_digest =='sha256:837ccb607e312b170fac7383d7ccfd61fa5072793f19a25e75fbacb56539b86b' \
&& 'service-account@my-project.iam.gserviceaccount.com' in assertion.google_service_accounts \
&& assertion.swname == 'CONFIDENTIAL_SPACE' \
&& 'STABLE' in assertion.submods.confidential_space.support_attributes"

En este ejemplo, una identidad externa que intenta actuar en nombre de una cuenta de servicio conectada al grupo de Workload Identity debe certificar los siguientes detalles y coincidir con ellos:

  • El resumen de la imagen del contenedor de la carga de trabajo

  • La dirección de la cuenta de servicio conectada a la VM de la carga de trabajo

  • Ese CONFIDENTIAL_SPACE es el software que se ejecuta en la VM, con todas sus garantías de seguridad integradas.

  • El atributo de asistencia de la imagen de Confidential Space de producción

Aserciones de certificación

Las aserciones disponibles para crear una política de certificación se detallan en la siguiente tabla. Pueden validar las aserciones que hacen la imagen de Confidential Space, el contenedor de la carga de trabajo y la VM.

Aserciones de imágenes

Aserción Tipo Descripción

assertion.dbgstat

Interactúa con lo siguiente:

Cadena definida

Verifica que la imagen de Confidential Space sea la versión de depuración o producción.

Los valores válidos son los siguientes:

  • enable: Verifica que se esté usando la imagen de depuración.
  • disabled-since-boot: Verifica que se esté usando la imagen de producción.
Ejemplos

En el siguiente código, se verifica que se esté usando la versión de depuración de la imagen de Confidential Space:

assertion.dbgstat == "enable"

En el siguiente código, se verifica que se esté usando la versión de producción de la imagen de Confidential Space:

assertion.dbgstat == "disabled-since-boot"
assertion.submods.confidential_space.support_attributes Matriz de string

Verifica que la versión de seguridad del TEE sea una imagen de Confidential Space de producción. Las imágenes de Confidential Space de depuración no tienen ningún atributo de compatibilidad configurado.

Existen tres atributos de compatibilidad:

  • LATEST: Esta es la versión más reciente de la imagen y es compatible. La imagen LATEST también es STABLE y USABLE.
  • STABLE: Esta versión de la imagen es compatible y se supervisa para detectar vulnerabilidades. Una imagen STABLE también es USABLE.
  • USABLE: Una imagen con solo este atributo está fuera de asistencia y ya no se supervisa para detectar vulnerabilidades. Úsala bajo tu propia responsabilidad.
Ejemplo

En el siguiente código, se verifica que se esté usando una versión estable de la imagen de Confidential Space:

"STABLE" in assertion.submods.confidential_space.support_attributes
assertion.swname Cadena definida

Verifica el software que se ejecuta en la entidad de certificación. El valor siempre es CONFIDENTIAL_SPACE.

Ejemplo
assertion.swname == "CONFIDENTIAL_SPACE"
assertion.swversion Matriz de string

Verifica la versión de software de la imagen de Confidential Space. Te recomendamos que uses assertion.submods.confidential_space.support_attributes en su lugar para segmentar la versión más reciente de una imagen.

Ejemplo
int(assertion.swversion[0]) == 230103

Aserciones de contenedores

Aserción Tipo Descripción

assertion.submods.container.cmd_override

Interactúa con lo siguiente:

  • Autor de la carga de trabajo: La allow_cmd_override política de lanzamiento.
  • Operador de carga de trabajo: Es la variable de metadatos tee-cmd .
Matriz de string

Verifica los comandos y parámetros de CMD que se usan en la imagen de la carga de trabajo.

Ejemplos

El siguiente código verifica que no se haya reemplazado el CMD de la imagen de carga de trabajo:

size(assertion.submods.container.cmd_override) == 0

El siguiente código verifica que program sea el único contenido en las anulaciones de CMD:

assertion.submods.container.cmd_override == ['program']

assertion.submods.container.env

Interactúa con lo siguiente:

Objeto JSON

Verifica que las variables de entorno y sus valores se hayan pasado de forma explícita al contenedor.

Ejemplo

El siguiente código verifica que la variable de entorno example-env-1 esté configurada en value-1 y que example-env-2 esté configurada en value-2.

assertion.submods.container.env == {"example-env-1": "value-1", "example-env-2": "value-2"}

assertion.submods.container.env_override

Interactúa con lo siguiente:

String

Verifica si el operador de carga de trabajo reemplazó las variables de entorno en el contenedor.

Ejemplos

El siguiente código verifica que el operador de carga de trabajo no haya reemplazado la variable de entorno example:

!has(assertion.submods.container.env_override.example)

El siguiente código verifica que el operador de cargas de trabajo no haya reemplazado ninguna variable de entorno:

size(assertion.submods.container.env_override) == 0
assertion.submods.container.image_digest String

Verifica el resumen de la imagen del contenedor de la carga de trabajo. Especificar esta condición permite que varias partes acuerden una carga de trabajo autorizada que pueda acceder a sus datos.

Ejemplo
assertion.submods.container.image_digest == "sha256:837ccb607e312b170fac7383d7ccfd61fa5072793f19a25e75fbacb56539b86b"
assertion.submods.container.image_id String

Verifica el ID de la imagen del contenedor de la carga de trabajo.

Ejemplo
assertion.submods.container.image_id == "sha256:652a44b0e911271ba07cf2915cd700fdfa50abd62a98f87a57fdebc59843d93f"

assertion.submods.container.image_reference

Interactúa con lo siguiente:

String

Verifica la ubicación del contenedor de la carga de trabajo que se ejecuta sobre la imagen de Confidential Space.

Ejemplo
assertion.submods.container.image_reference == "us-docker.pkg.dev/PROJECT_ID/WORKLOAD_CONTAINER:latest"

assertion.submods.container.image_signatures

Interactúa con lo siguiente:

Objeto JSON

Verifica que la imagen tenga una firma determinada o que esté firmada con una clave pública y un algoritmo de firma. Especificar esta condición permite que varias partes acuerden una carga de trabajo autorizada que pueda acceder a sus datos.

La aserción puede incluir los siguientes elementos:

  • key_id: Es la huella digital hexadecimal de la clave pública. Para obtener la huella digital, puedes ejecutar el siguiente comando:

    openssl pkey -pubin -in public_key.pem -outform DER | openssl sha256

    En este caso, public_key.pem es tu clave pública en formato PEM.

  • signature: La firma sobre una carga útil que está asociada con el contenedor firmado y que sigue el formato de firma simple.
  • signature_algorithm: Es el algoritmo que se usa para firmar la clave. Uno de los siguientes:

    • RSASSA_PSS_SHA256 (RSASSA-PSS con un resumen SHA-256)
    • RSASSA_PKCS1V15_SHA256 (RSASSA-PKCS1 v1_5 con un resumen SHA-256)
    • ECDSA_P256_SHA256 (ECDSA en la curva P-256 con un resumen SHA-256)
Ejemplo
assertion.swname == 'CONFIDENTIAL_SPACE' && ['ECDSA_P256_SHA256:PUBLIC_KEY_FINGERPRINT'].exists(fingerprint, fingerprint in assertion.submods.container.image_signatures.map(sig, sig.signature_algorithm+':'+sig.key_id)) && 'serviceaccount.iam.gserviceaccount.com' in assertion.google_service_accounts"

assertion.submods.container.restart_policy

Interactúa con lo siguiente:

Cadena definida

Verifica la política de reinicio del selector de contenedores para cuando se detenga la carga de trabajo.

Los valores válidos son los siguientes:

  • Never (predeterminada)
  • Always
  • OnFailure
Ejemplo
assertion.submods.container.restart_policy == "Never"

Aserciones de VM

Aserción Tipo Descripción

assertion.google_service_accounts

Interactúa con lo siguiente:

Matriz de string

Verifica que una cuenta de servicio especificada esté conectada a la VM que ejecuta la carga de trabajo o que se haya incluido en la lista con tee-impersonate-service-accounts en los metadatos de la VM.

Ejemplo
workload-service-account@my-project.iam.gserviceaccount.com in assertion.google_service_accounts
assertion.hwmodel String

Verifica la tecnología subyacente de Confidential Computing. Las plataformas compatibles son las siguientes:

Ejemplo
assertion.hwmodel == "GCP_AMD_SEV"

assertion.submods.confidential_space.monitoring_enabled

Interactúa con lo siguiente:

Booleano

Verifica el estado de supervisión en la entidad de certificación.

Ejemplo
assertion.submods.confidential_space.monitoring_enabled.memory == true
assertion.submods.gce.instance_id String

Verifica el ID de la instancia de VM.

Ejemplo
assertion.submods.gce.instance_id == "0000000000000000000"
assertion.submods.gce.instance_name String

Verifica el nombre de la instancia de VM.

Ejemplo
assertion.submods.gce.instance_name == "workload-vm"
assertion.submods.gce.project_id String

Verifica que la VM ejecute un proyecto de Google Cloud con el ID del proyecto especificado.

Ejemplo
assertion.submods.gce.project_id == "project-id"
assertion.submods.gce.project_number String

Verifica que la VM se ejecute en un proyecto de Google Cloud con el número de proyecto especificado.

Ejemplo
assertion.submods.gce.project_number == "00000000000"

assertion.submods.gce.zone

Interactúa con lo siguiente:

  • Operador de carga de trabajo: Es el valor de --zone .
String

Verifica que la VM se esté ejecutando en la zona especificada.

Ejemplo
assertion.submods.gce.zone == "us-central1-a"