Los colaboradores de datos deben configurar los siguientes recursos para que una carga de trabajo pueda acceder a sus datos confidenciales:
Datos encriptados, almacenados en Google Cloud.
Un grupo de identidades para cargas de trabajo (WIP) para autorizar la carga de trabajo Después de que un WIP autoriza una carga de trabajo, esta puede acceder a los datos confidenciales de los colaboradores de datos y operar con ellos.
Además, los colaboradores de datos deben elegir dónde se almacenan los resultados de la carga de trabajo de Confidential Space y si esos resultados son únicos para cada colaborador o se comparten. Por ejemplo, puedes elegir generar el mismo resultado en varios buckets de Cloud Storage que pertenezcan a cada colaborador de datos.
Almacena tus datos encriptados
Puedes usar cualquier servicio 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).
Autoriza la carga de trabajo con un WIP
Un WIP es el mecanismo que usa Confidential Space para permitir que una carga de trabajo externa acceda a tus datos confidenciales y trabaje con ellos como una identidad federada. Una identidad federada es una entidad externa que se trata como si fuera una principal dentro de tu propio proyecto, lo que te permite otorgarle roles de IAM para darle acceso a recursos específicos o suplantar cuentas de servicio para hacer lo mismo.
Como colaborador de datos, configuras un proveedor dentro de un WIP que establece las reglas para las entidades que se autentican como una identidad federada. En el caso de Confidential Space, debes definir lo siguiente en un proveedor:
Un servicio de certificación: Este servicio verifica que la carga de trabajo sea una instancia de VM confidencial y, en última instancia, devuelve un token de certificación de OpenID Connect (OIDC) al proveedor de WIP. El operador de carga de trabajo establece el servicio de certificación que se usa, y debe coincidir con el servicio de certificación agregado al proveedor de WIP para que se otorgue el acceso.
Asignaciones de atributos: Son atributos en los tokens de acceso del Servicio de tokens de seguridad que se asignan a aseveraciones realizadas por la entidad de autenticación, en este caso, la instancia de VM que ejecuta la carga de trabajo. La instancia de VM, la imagen de Confidential Space y el contenedor de carga de trabajo realizan las aserciones, y la carga de trabajo las pasa al proveedor de WIP. Estos atributos se usan para elementos como los registros de auditoría en Cloud Logging y para otorgar roles a través de IAM en función de las aserciones de entidades de autenticación, como los resúmenes de contenedores de imágenes de cargas de trabajo. Obtén más información sobre las asignaciones de atributos.
Una política de certificación: Es una serie de condiciones que las entidades de autenticación deben cumplir para obtener acceso, según las afirmaciones que realicen.
Cuando se inicia una carga de trabajo, el Launcher de Confidential Space envía su informe de certificación a un servicio de certificación definido por el operador de la carga de trabajo, que verifica la instancia de VM confidencial y, luego, devuelve un token de certificación de OIDC. Este token dura una hora y se actualiza automáticamente.
Luego, la carga de trabajo pasa el token de certificación al proveedor de WIP, y este lo usa para verificar que las aserciones pasen la política de certificación definida en el proveedor. Si es así, se le permite a la carga de trabajo acceder a los recursos confidenciales.
Acceso a cargas de trabajo externas
Antes de configurar un WIP y un proveedor, debes elegir cómo accederá la carga de trabajo a tus recursos: acceso directo a los recursos o suplantación de identidad de la cuenta de servicio.
Acceso directo a recursos
Te recomendamos el método de acceso directo a los recursos para las cargas de trabajo.
Este método implica configurar una identidad federada en un proveedor de WIP vinculado a las aserciones de una entidad de autenticación. De esta manera, se puede autorizar una carga de trabajo para acceder a los recursos directamente a través de vinculaciones de IAM, según atributos como el resumen de la imagen de contenedor de la carga de trabajo.
El acceso directo a recursos tiene las siguientes ventajas:
Configurar un entorno de Confidential Space requiere menos pasos, ya que los colaboradores de datos no necesitan configurar cuentas de servicio para que una cuenta de servicio de carga de trabajo suplante su identidad.
La carga de trabajo solo puede acceder a recursos específicos según lo determina IAM. Este método es más seguro que el de suplantación de identidad de la cuenta de servicio, en el que las cuentas de servicio con permisos excesivos o los derechos de suplantación de identidad pueden proporcionar a un actor malicioso más acceso del previsto.
Cada acceso a los recursos se registra con la identidad federada de la instancia de VM de la carga de trabajo, en lugar de la identidad de una cuenta de servicio suplantada que podría compartir varias cargas de trabajo. La identidad de una instancia de VM de carga de trabajo puede incluir detalles como el resumen de la imagen de un contenedor, el número de proyecto desde el que opera la carga de trabajo y el ID de la instancia de VM que ejecuta la carga de trabajo, lo que proporciona un registro de auditoría más detallado.
No es necesario que asignes la propiedad de instancia de VM
selfLink
al atributogoogle.subject
en un proveedor de WIP. Los valoresselfLink
muy largos pueden superar el límite de 127 bytes de este atributo, lo que provoca que falle la autenticación del proveedor de WIP.
Uso de identidad temporal como cuenta de servicio
El método de suplantación de identidad de la cuenta de servicio implica que cada colaborador de datos configure una cuenta de servicio para desencriptar sus datos privados y, luego, adjunte esa cuenta de servicio a su propio WIP. También especifican la cuenta de servicio de la carga de trabajo en su proveedor de WIP, lo que permite que la cuenta de servicio de la carga de trabajo suplante a las cuentas de servicio del colaborador de datos para que pueda recuperar y operar con sus datos confidenciales.
El robo de identidad de cuentas de servicio solo debe usarse en las siguientes situaciones:
Cuando necesites usar firmas de imágenes como credencial de autenticación, ya que la sintaxis que usan las firmas no funciona con las asignaciones de atributos.
Cuando accedes a APIs que no admiten identidades federadas
Es posible que el método de suplantación de identidad de la cuenta de servicio no pueda autenticarse en un proveedor de WIP si una instancia de VM tiene una propiedad selfLink
muy larga. Esto se debe a que la declaración sub
en el token de certificación, que se establece en el valor selfLink
, se asigna en el proveedor de WIP al atributo google.subject
, que tiene un límite de 127 bytes.
En el caso de los valores de selfLink
de instancias de VM que superen los 127 bytes, debes cambiar el nombre de tus instancias de VM para acortar el selfLink
o usar el método de acceso directo al recurso.
Configura un WIP y un proveedor
Los pasos para configurar un proveedor cambian según si usas acceso directo a recursos o la suplantación de identidad de una cuenta de servicio.
Acceso directo a recursos
El método de acceso directo a recursos implica configurar un WIP y un proveedor, y, luego, configurar roles de IAM basados en un resumen específico de la imagen del contenedor de carga de trabajo.
Configura un WIP y un proveedor
Para configurar un WIP y un proveedor, completa las siguientes instrucciones:
Crea el WIP:
gcloud iam workload-identity-pools create DATA_COLLABORATOR_POOL_NAME \ --location=global
Crea un proveedor de OIDC en el WIP:
gcloud iam workload-identity-pools providers create-oidc attestation-verifier \ --location=global \ --workload-identity-pool=DATA_COLLABORATOR_POOL_NAME \ --issuer-uri="https://confidentialcomputing.googleapis.com/" \ --allowed-audiences="https://sts.googleapis.com" \ --attribute-mapping="google.subject=\"gcpcs::\"+assertion.submods.container.image_digest+\"::\"+assertion.submods.gce.project_number+\"::\"+assertion.submods.gce.instance_id,attribute.image_digest=assertion.submods.container.image_digest" \ --attribute-condition="assertion.swname == 'CONFIDENTIAL_SPACE' \ && 'STABLE' in assertion.submods.confidential_space.support_attributes"
En este ejemplo, se usan los siguientes valores:
Un
issuer-uri
dehttps://confidentialcomputing.googleapis.com/
, lo que significa que se usa Google Cloud Attestation como servicio de certificación.Es un
allowed-audiences
dehttps://sts.googleapis.com
. Este es el servicio de tokens de seguridad de Google, que intercambia credenciales por tokens de acceso.Un
attribute-mapping
degoogle.subject
, con el siguiente valor:\"gcpcs::\"+assertion.submods.container.image_digest+\"::\"+assertion.submods.gce.project_number+\"::\"+assertion.submods.gce.instance_id,attribute.image_digest=assertion.submods.container.image_digest
Este valor se construye con Common Expression Language (CEL). Los siguientes valores se asignan al atributo
gcpcs
y aparecen en Cloud Logging cada vez que la carga de trabajo accede a los recursos:assertion.submods.container.image_digest
: Es el resumen de la imagen del contenedor de la carga de trabajo.assertion.submods.gce.project_number
: Es el número de proyecto de la instancia de VM.assertion.submods.gce.instance_id
: Es el ID de la instancia de VM.
Además,
attribute.image_digest
se establece enassertion.submods.container.image_digest
, el resumen de la imagen del contenedor de carga de trabajo. Este atributo se asigna para que puedas otorgar roles de IAM a la identidad federada según un resumen de imagen específico.Puedes asignar cualquiera de las aserciones de carga de trabajo disponibles, siempre que la longitud total del valor
google.subject
sea inferior a 127 bytes.Los siguientes
attribute-conditions
, que forman una política de certificación. Si estas condiciones coinciden con las aserciones de la carga de trabajo, se le permite acceder a los recursos confidenciales como una identidad federada:assertion.swname == 'CONFIDENTIAL_SPACE'
: Verifica que Confidential Space sea el software que se ejecuta en la VM, con todas sus garantías de seguridad integradas.'STABLE' in assertion.submods.confidential_space.support_attributes
: Verifica que se esté usando la imagen de Confidential Space de producción y que tenga elSTABLE
atributo de asistencia.
Para obtener más condiciones de atributos que puedes usar, consulta Crea una política de certificación.
Otorga roles de IAM a la identidad federada
Después de crear un proveedor de WIP, puedes otorgar a la identidad federada un rol de IAM según si el resumen del contenedor de la imagen de la carga de trabajo de la identidad coincide con un valor esperado.
En el siguiente ejemplo, se muestra cómo otorgar a una identidad federada la capacidad de desencriptar una clave específica de Cloud Key Management Service:
gcloud kms keys add-iam-policy-binding \
projects/DATA_COLLABORATOR_PROJECT_ID/locations/global/keyRings/DATA_COLLABORATOR_KEYRING_NAME/cryptoKeys/DATA_COLLABORATOR_KEY_NAME \
--member="principalSet://iam.googleapis.com/projects/DATA_COLLABORATOR_PROJECT_NUMBER/locations/global/workloadIdentityPools/DATA_COLLABORATOR_POOL_NAME/attribute.image_digest/WORKLOAD_CONTAINER_IMAGE_DIGEST" \
--role=roles/cloudkms.cryptoKeyDecrypter
Uso de identidad temporal como cuenta de servicio
El método de identidad temporal como cuenta de servicio implica lo siguiente:
Crear cuentas de servicio en cada uno de los proyectos de colaboradores de datos y otorgarles permiso para desencriptar los datos confidenciales
Crear WIP en cada uno de los proyectos de colaborador de datos y, luego, adjuntar la cuenta de servicio de cada proyecto que se acaba de crear a su WIP.
Crear proveedores de WIP en cada WIP, que especifiquen la cuenta de servicio de la carga de trabajo como la cuenta que puede suplantar las cuentas de servicio de los colaboradores de datos
Configura cuentas de servicio para desencriptar datos confidenciales
Crea las cuentas de servicio en los proyectos de colaboradores de datos:
gcloud iam service-accounts create DATA_COLLABORATOR_SERVICE_ACCOUNT_NAME
Otorga a las cuentas de servicio los permisos necesarios para desencriptar los datos confidenciales. Por ejemplo, puedes encriptar archivos confidenciales en Cloud Storage con Cloud KMS, por lo que debes otorgar permiso a la cuenta de servicio para desencriptar esos datos:
gcloud kms keys add-iam-policy-binding \ projects/DATA_COLLABORATOR_PROJECT_ID/locations/global/keyRings/DATA_COLLABORATOR_KEYRING_NAME/cryptoKeys/DATA_COLLABORATOR_KEY_NAME \ --member=serviceAccount:DATA_COLLABORATOR_SERVICE_ACCOUNT_NAME@DATA_COLLABORATOR_PROJECT_ID.iam.gserviceaccount.com \ --role=roles/cloudkms.cryptoKeyDecrypter
Configura un WIP y un proveedor
Para configurar un WIP y un proveedor, completa las siguientes instrucciones en cada proyecto de colaborador de datos:
Crea el WIP:
gcloud iam workload-identity-pools create DATA_COLLABORATOR_POOL_NAME \ --location=global
Conecta la cuenta de servicio que se suplantará al WIP con el rol
roles/iam.workloadIdentityUser
:gcloud iam service-accounts add-iam-policy-binding \ DATA_COLLABORATOR_SERVICE_ACCOUNT_NAME@DATA_COLLABORATOR_PROJECT_ID.iam.gserviceaccount.com \ --member="principalSet://iam.googleapis.com/projects/DATA_COLLABORATOR_PROJECT_NUMBER/locations/global/workloadIdentityPools/DATA_COLLABORATOR_POOL_NAME/*" \ --role=roles/iam.workloadIdentityUser
Crea un proveedor de OIDC en el WIP y define en él la cuenta de servicio de la carga de trabajo para que pueda suplantar la cuenta de servicio del colaborador de datos:
gcloud iam workload-identity-pools providers create-oidc attestation-verifier \ --location=global \ --workload-identity-pool=DATA_COLLABORATOR_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 == 'WORKLOAD_CONTAINER_IMAGE_DIGEST' \ && 'WORKLOAD_SERVICE_ACCOUNT_NAME@WORKLOAD_OPERATOR_PROJECT_ID.iam.gserviceaccount.com' in assertion.google_service_accounts \ && assertion.swname == 'CONFIDENTIAL_SPACE' \ && 'STABLE' in assertion.submods.confidential_space.support_attributes"
En este ejemplo, se usan los siguientes valores:
Un
issuer-uri
dehttps://confidentialcomputing.googleapis.com/
, lo que significa que se usa Google Cloud Attestation como servicio de certificación.Es un
allowed-audiences
dehttps://sts.googleapis.com
. Este es el servicio de tokens de seguridad de Google, que intercambia credenciales por tokens de acceso.Un
attribute-mapping
degoogle.subject
, con el valorassertion.sub
. Es elselfLink
de la instancia de VM, como se define en el reclamosub
del token de certificación.La instancia de VM
selfLink
aparece en Cloud Logging cada vez que la carga de trabajo accede a los recursos.Los siguientes
attribute-conditions
, que forman una política de certificación. Si estas condiciones coinciden con las aserciones de la carga de trabajo, se le permite acceder a los recursos como una identidad federada:assertion.submods.container.image_digest == 'WORKLOAD_CONTAINER_IMAGE_DIGEST'
: Verifica que el resumen de la imagen del contenedor de la carga de trabajo coincida con el valor esperado.'WORKLOAD_SERVICE_ACCOUNT_NAME@WORKLOAD_PROJECT_ID.iam.gserviceaccount.com' in assertion.google_service_accounts
: Verifica que la cuenta de servicio adjunta a la carga de trabajo coincida con la cuenta de servicio esperada y, luego, la usa para actuar en nombre de la cuenta de servicio del colaborador de datos.assertion.swname == 'CONFIDENTIAL_SPACE'
: Verifica que Confidential Space sea el software que se ejecuta en la VM, con todas sus garantías de seguridad integradas.'STABLE' in assertion.submods.confidential_space.support_attributes
: Verifica que se esté usando la imagen de Confidential Space de producción y que tenga elSTABLE
atributo de asistencia.
Para obtener más condiciones de atributos que puedes usar, consulta Crea una política de certificación.
Crea una política de certificación
Como parte de la creación de un WIP, debes crear una política de certificación. Las afirmaciones de una entidad de autenticación deben coincidir con tu política para poder acceder a tus datos.
Las políticas se escriben en Common Expression Language (CEL) y se componen de una serie de instrucciones que se pueden encadenar con el operador &&
.
Las instrucciones usan aserciones de la imagen de Confidential Space, la imagen del contenedor de carga de trabajo o la instancia de VM como variables, y el valor especificado como la expresión.
Por ejemplo, esta es una política que exige que la carga de trabajo use Confidential Space, debe usar una STABLE
imagen de Confidential Space y que la zona en la que se ejecuta la instancia de VM de carga de trabajo debe ser us-central1-a
:
assertion.swname == 'CONFIDENTIAL_SPACE' \
&& 'STABLE' in assertion.submods.confidential_space.support_attributes" \
&& assertion.submods.gce.zone == "us-central1-a"
Consulta afirmaciones de certificación para obtener más información.
Aserciones de certificación
En la siguiente tabla, se detallan las aserciones disponibles para construir una política de certificación. Las políticas pueden validar las aserciones realizadas por la imagen de Confidential Space, el contenedor de la carga de trabajo y la instancia de VM.
Aserciones de imágenes
Aserción | Tipo | Descripción |
---|---|---|
Interactúa con:
|
Cadena definida |
Verifica que la imagen de Confidential Space sea la versión de depuración o de producción. Los valores válidos son los siguientes:
EjemplosEl siguiente código verifica que se esté usando la versión de depuración de la imagen de Confidential Space:
El siguiente código verifica que se esté usando la versión de producción de la imagen de Confidential Space:
|
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 depuración de Confidential Space no tienen ningún atributo de asistencia establecido. Existen tres atributos de asistencia:
EjemploEl siguiente código verifica que se esté usando una versión estable de la imagen de Confidential Space:
|
assertion.swname |
Cadena definida |
Verifica el software que se ejecuta en la entidad que certifica. El valor siempre es Ejemplo
|
assertion.swversion |
Matriz de string |
Verifica la versión de software de la imagen de Confidential Space. Te
recomendamos que uses
Ejemplo
|
Aserciones de contenedores
Aserción | Tipo | Descripción |
---|---|---|
Interactúa con:
|
Matriz de string |
Verifica los comandos y parámetros de CMD que se usan en la imagen de la carga de trabajo. EjemplosEl siguiente código verifica que no se haya reemplazado el CMD de la imagen de carga de trabajo:
El siguiente código verifica que
|
Interactúa con:
|
Objeto JSON |
Verifica que las variables de entorno y sus valores se hayan pasado de forma explícita al contenedor. EjemploEl siguiente código verifica que la variable de entorno
|
Interactúa con:
|
String |
Verifica si el operador de carga de trabajo reemplazó las variables de entorno en el contenedor. EjemplosEl siguiente código verifica que el operador de cargas de trabajo no haya anulado la variable de entorno
El siguiente código verifica que el operador de cargas de trabajo no haya sobrescrito ninguna variable de entorno:
|
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_id |
String |
Verifica el ID de la imagen del contenedor de la carga de trabajo. Ejemplo
|
Interactúa con:
|
String |
Verifica la ubicación del contenedor de carga de trabajo que se ejecuta sobre la imagen de Confidential Space. Ejemplo
|
Interactúa con:
|
Objeto JSON |
Verifica que la imagen tenga una firma determinada o que esté firmada por 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:
Ejemplo
|
Interactúa con:
|
Cadena definida |
Verifica la política de reinicio del iniciador de contenedores cuando se detiene la carga de trabajo. Los valores válidos son los siguientes:
Ejemplo
|
Aserciones de VM
Aserción | Tipo | Descripción |
---|---|---|
Interactúa con:
|
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 Ejemplo
|
assertion.hwmodel |
String |
Verifica la tecnología subyacente de Confidential Computing. Las plataformas compatibles son las siguientes:
Ejemplo
|
Interactúa con:
|
Booleano |
Verifica el estado de supervisión en la entidad certificadora. Ejemplo
|
assertion.submods.gce.instance_id |
String |
Verifica el ID de la instancia de VM. Ejemplo
|
assertion.submods.gce.instance_name |
String |
Verifica el nombre de la instancia de VM. Ejemplo
|
assertion.submods.gce.project_id |
String |
Verifica que la VM ejecute un proyecto Google Cloud con el ID del proyecto especificado. Ejemplo
|
assertion.submods.gce.project_number |
String |
Verifica que la VM se ejecute en un proyecto Google Cloud con el número de proyecto especificado. Ejemplo
|
Interactúa con:
|
String |
Verifica que la VM se esté ejecutando en la zona especificada. Ejemplo
|
Interactúa con:
|
Cadena definida |
Verifica el estado del controlador de Confidential Computing de NVIDIA. Los valores válidos son los siguientes:
Ejemplo
|