Protege los datos compartidos en uso con Confidential Space

1. Descripción general

Confidential Space ofrece colaboración y uso compartido de datos seguros entre varias partes, al mismo tiempo que permite a las organizaciones preservar la confidencialidad de sus datos. Esto significa que las organizaciones pueden colaborar entre sí y, al mismo tiempo, mantener el control de sus datos y protegerlos del acceso no autorizado.

Confidential Space desbloquea situaciones en las que deseas obtener valor mutuo a partir de la agregación y el análisis de datos sensibles, a menudo regulados, y, al mismo tiempo, conservar el control total sobre ellos. Con Confidential Space, las organizaciones pueden obtener valor mutuo a partir de la agregación y el análisis de datos sensibles, como información de identificación personal (PII), información de salud protegida (PHI), propiedad intelectual y secretos criptográficos, y, al mismo tiempo, conservar el control total sobre ellos.

Requisitos

Qué aprenderás

  • Cómo configurar los recursos de Cloud necesarios para ejecutar Confidential Space
  • Cómo ejecutar la carga de trabajo en una Confidential VM que ejecuta la imagen de VM de Confidential Space
  • Cómo autorizar el acceso a los recursos protegidos según los atributos del código de la carga de trabajo (qué), el entorno de Confidential Space (dónde) y la cuenta que ejecuta la carga de trabajo (quién)

En este codelab, configurarás un Espacio Confidencial entre Primus y Secundus Bank para determinar sus clientes comunes sin compartir listas de cuentas completas entre sí. Esto implica los siguientes pasos:

  • Paso 1: Configura los recursos de Cloud necesarios para los bancos Primus y Secundus. Estos recursos de Cloud incluyen buckets de Cloud Storage, claves de KMS, grupos de identidades de cargas de trabajo y cuentas de servicio para los bancos Primus y Secundus. Primus Bank y Secundus Bank almacenan los datos de sus clientes en buckets de Cloud Storage y los encriptan con claves de Cloud Key Management Service.
  • Paso 2: Crea una cuenta de servicio de carga de trabajo que usará la VM de carga de trabajo. Secundus Bank, que será el operador de la carga de trabajo, iniciará la VM de la carga de trabajo. Primus Bank crearía el código de la carga de trabajo.
  • Paso 3: Crea una carga de trabajo que incluya dos comandos de CLI, uno para contar los clientes de la ubicación proporcionada y otro para encontrar los clientes comunes de Primus Bank y Secundus Bank. Primus Bank crearía la carga de trabajo y se empaquetaría como una imagen de Docker. Esta imagen de Docker se publicará en Artifact Registry.
  • Paso 4: Autoriza una carga de trabajo. Primus Bank usaría un grupo de identidades para cargas de trabajo para autorizar cargas de trabajo a acceder a sus datos de clientes según los atributos de quién ejecuta la carga de trabajo, qué hace la carga de trabajo y dónde se ejecuta.
  • Paso 5: Cuando se ejecute la carga de trabajo, se solicitará acceso a los recursos de la nube de los colaboradores de datos (Primus Bank y Secundus Bank) ofreciendo un token del servicio de verificador de certificación con reclamos de carga de trabajo y entorno. Si las afirmaciones de medición de la carga de trabajo en el token coinciden con la condición del atributo en los grupos de identidades para cargas de trabajo de Primus y Secundus Banks, se devuelve el token de acceso de la cuenta de servicio que tiene permiso para acceder a los recursos de Cloud respectivos. Solo se podrá acceder a los recursos de la nube desde la carga de trabajo que se ejecuta dentro de Confidential Space.
  • Paso 5a: Ejecuta la primera carga de trabajo, que cuenta los clientes de Primus Bank de ubicaciones específicas. Para esta carga de trabajo, Primus Bank sería un colaborador de datos y autor de la carga de trabajo, lo que proporcionaría la lista de clientes encriptada a la carga de trabajo que se ejecuta en Confidential Space. Secundus Bank sería un operador de cargas de trabajo y ejecutaría la carga de trabajo en un Confidential Space.
  • Paso 5b: Ejecuta la segunda carga de trabajo, que busca los clientes comunes de los bancos Primus y Secundus. Para esta carga de trabajo, tanto Primus Bank como Secundus Bank serían colaboradores de datos. Proporcionarían las listas de clientes encriptadas a la carga de trabajo que se ejecuta en Confidential Space. Secundus Bank volvería a ser un operador de cargas de trabajo. Secundus Bank también autorizaría esta carga de trabajo, ya que esta necesita acceder a las listas de clientes encriptadas de Secundus Bank para encontrar los clientes comunes. En este caso, Secundus Bank autorizaría a la carga de trabajo a acceder a los datos de sus clientes según los atributos de quién ejecuta la carga de trabajo, qué hace la carga de trabajo y dónde se ejecuta, como se mencionó en el paso 4 para Primus Bank.

fdef93a6868a976.png

2. Configura recursos de Cloud

Antes de comenzar

  • Clona este repositorio con el siguiente comando para obtener las secuencias de comandos necesarias que se usan como parte de este codelab.
git clone https://github.com/GoogleCloudPlatform/confidential-space.git
  • Cambia el directorio de este codelab.
cd confidential-space/codelabs/bank_data_analysis_codelab/scripts
  • Asegúrate de haber configurado las variables de entorno del proyecto necesarias como se muestra a continuación. Para obtener más información sobre cómo crear un proyecto de GCP, consulta este codelab. Puedes consultar este vínculo para obtener detalles sobre cómo recuperar el ID del proyecto y en qué se diferencia del nombre y el número del proyecto.
export PRIMUS_PROJECT_ID=<GCP project id of Primus bank>
export SECUNDUS_PROJECT_ID=<GCP project id of Secundus bank>
  • Habilita la facturación para tus proyectos.
  • Habilita la API de Confidential Computing y las siguientes APIs para ambos proyectos.
gcloud services enable \
    cloudapis.googleapis.com \
    cloudkms.googleapis.com \
    cloudresourcemanager.googleapis.com \
    cloudshell.googleapis.com \
    container.googleapis.com \
    containerregistry.googleapis.com \
    iam.googleapis.com \
    confidentialcomputing.googleapis.com
  • Configura las variables para los nombres de recursos como se menciona a continuación con este comando. Puedes anular los nombres de los recursos con estas variables (p. ej., export PRIMUS_INPUT_STORAGE_BUCKET='my-input-bucket').
  • Puedes configurar las siguientes variables con nombres de recursos de Cloud existentes en el proyecto de Primus. Si se configura la variable, se usará el recurso de Cloud existente correspondiente del proyecto de Primus. Si no se configura la variable, el nombre del recurso de Cloud se generará a partir de project-name y se creará un nuevo recurso de Cloud como parte de lo siguiente:

$PRIMUS_INPUT_STORAGE_BUCKET

Es el bucket que almacena el archivo de datos de clientes de Primus Bank.

$PRIMUS_WORKLOAD_IDENTITY_POOL

Es el grupo de identidades para cargas de trabajo (WIP) de Primus Bank que valida las reivindicaciones.

$PRIMUS_WIP_PROVIDER

Es el proveedor del grupo de identidades para cargas de trabajo de Primus Bank, que incluye la condición de autorización que se usará para los tokens firmados por el servicio de verificación de certificación.

$PRIMUS_SERVICE_ACCOUNT

Es la cuenta de servicio de Primus Bank que $PRIMUS_WORKLOAD_IDENTITY_POOL usa para acceder a los recursos protegidos. En este paso, tiene permiso para ver los datos del cliente que se almacenan en el bucket $PRIMUS_INPUT_STORAGE_BUCKET.

$PRIMUS_ENC_KEY

Es la clave de KMS que se usa para encriptar los datos almacenados en $PRIMUS_INPUT_STORAGE_BUCKET para Primus Bank.

$PRIMUS_ENC_KEYRING

El llavero de KMS que se usará para crear la clave de encriptación $PRIMUS_ENC_KEY para Primus Bank.

$PRIMUS_ARTIFACT_REPOSITORY

Es el repositorio de artefactos en el que se enviará la imagen de Docker de la carga de trabajo.

  • Puedes configurar las siguientes variables con nombres de recursos de Cloud existentes en el proyecto de Secundus. Si se configura la variable, se usará el recurso de Cloud existente correspondiente del proyecto de Secundus. Si no se configura la variable, el nombre del recurso de Cloud se generará a partir del nombre del proyecto y se creará un nuevo recurso de Cloud como parte de lo siguiente:

$SECUNDUS_INPUT_STORAGE_BUCKET

Es el bucket que almacena el archivo de datos del cliente de Secundus Bank.

$SECUNDUS_WORKLOAD_IDENTITY_POOL

Es el grupo de identidades para cargas de trabajo (WIP) de Secundus Bank que valida las declaraciones.

$SECUNDUS_WIP_PROVIDER

Es el proveedor del grupo de identidades para cargas de trabajo de Secundus Bank, que incluye la condición de autorización para usar los tokens firmados por el servicio de verificador de certificación.

$SECUNDUS_SERVICE_ACCOUNT

Es la cuenta de servicio del banco Secundus que $SECUNDUS_WORKLOAD_IDENTITY_POOL usa para acceder a los recursos protegidos. En este paso, tiene permiso para ver los datos del cliente que se almacenan en el bucket $SECUNDUS_INPUT_STORAGE_BUCKET.

$SECUNDUS_ENC_KEY

Es la clave de KMS que se usa para encriptar los datos almacenados en $SECUNDUS_INPUT_STORAGE_BUCKET para Secundus Bank.

$SECUNDUS_ENC_KEYRING

El llavero de KMS que se usa para crear la clave de encriptación $SECUNDUS_ENV_KEY para Secundus Bank.

$SECUNDUS_RESULT_STORAGE_BUCKET

Es el bucket que almacena los resultados de la carga de trabajo.

$WORKLOAD_IMAGE_NAME

Es el nombre de la imagen del contenedor de la carga de trabajo.

$WORKLOAD_IMAGE_TAG

Es la etiqueta de la imagen del contenedor de la carga de trabajo.

$WORKLOAD_SERVICE_ACCOUNT

Es la cuenta de servicio que tiene permiso para acceder a la VM confidencial que ejecuta la carga de trabajo.

  • En este codelab, se usan pocos artefactos, como se menciona a continuación:
  • primus_customer_list.csv: Es el archivo que contiene los datos del cliente de Primus Bank. Aquí se encuentra el archivo de muestra que se usa en este codelab.
  • secundus_customer_list.csv: Es el archivo que contiene los datos del cliente de Secundus Bank. Aquí se encuentra el archivo de muestra que se usa en este codelab.
  • Necesitarás ciertos permisos para estos dos proyectos:
  • Para $PRIMUS_PROJECT_ID, necesitarás los roles de administrador de Cloud KMS, administrador de Storage, administrador de Artifact Registry, administrador de cuentas de servicio y administrador de grupos de identidades de cargas de trabajo de IAM.
  • Para el $SECUNDUS_PROJECT_ID, necesitarás los roles de administrador de Compute, administrador de Storage, administrador de cuentas de servicio, administrador de Cloud KMS, administrador de grupos de identidades para cargas de trabajo de IAM y administrador de seguridad (opcional).
  • Ejecuta la siguiente secuencia de comandos para establecer los nombres de las variables restantes en valores basados en el ID de tu proyecto para los nombres de recursos.
source config_env.sh

Configura recursos de nube para Primus Bank

Se requieren los siguientes recursos de la nube para Primus Bank. Ejecuta esta secuencia de comandos para configurar los recursos de Primus Bank:

  • Bucket de Cloud Storage ($PRIMUS_INPUT_STORAGE_BUCKET) para almacenar el archivo de datos del cliente encriptado de Primus Bank.
  • Clave de encriptación ($PRIMUS_ENC_KEY) y llavero ($PRIMUS_ENC_KEYRING) en KMS para encriptar el archivo de datos del cliente de Primus Bank.
  • Grupo de identidades para cargas de trabajo ($PRIMUS_WORKLOAD_IDENTITY_POOL) para validar las declaraciones en función de las condiciones de atributos configuradas en su proveedor.
  • La cuenta de servicio ($PRIMUS_SERVICE_ACCOUNT) adjunta al grupo de identidades de cargas de trabajo ($PRIMUS_WORKLOAD_IDENTITY_POOL) mencionado anteriormente tiene acceso para desencriptar datos con la clave de KMS (con el rol roles/cloudkms.cryptoKeyDecrypter), leer datos del bucket de Cloud Storage (con el rol objectViewer) y conectar la cuenta de servicio al grupo de identidades de cargas de trabajo (con el rol roles/iam.workloadIdentityUser).
./setup_primus_bank_resources.sh

Configura recursos de Cloud para Secundus Bank

Para Secundus Bank, se requieren los siguientes recursos de la nube. Ejecuta esta secuencia de comandos para configurar los recursos de Secundus Bank. Como parte de estos pasos, se crearán los siguientes recursos:

  • Bucket de Cloud Storage ($SECUNDUS_INPUT_STORAGE_BUCKET) para almacenar el archivo de datos del cliente encriptado de Secundus Bank.
  • Clave de encriptación ($SECUNDUS_ENC_KEY) y llavero ($SECUNDUS_ENC_KEYRING) en KMS para encriptar el archivo de datos de Secundus Bank.
  • Grupo de identidades para cargas de trabajo ($SECUNDUS_WORKLOAD_IDENTITY_POOL) para validar las declaraciones en función de las condiciones de atributos configuradas en su proveedor.
  • La cuenta de servicio ($SECUNDUS_SERVICE_ACCOUNT) adjunta al grupo de identidades de cargas de trabajo mencionado anteriormente ($SECUNDUS_WORKLOAD_IDENTITY_POOL) tiene acceso para desencriptar datos con la clave de KMS (con el rol roles/cloudkms.cryptoKeyDecrypter), leer datos del bucket de Cloud Storage (con el rol objectViewer) y conectar la cuenta de servicio al grupo de identidades de cargas de trabajo (con el rol roles/iam.workloadIdentityUser).
  • Bucket de Cloud Storage ($SECUNDUS_RESULT_STORAGE_BUCKET) para almacenar el resultado de la ejecución de la carga de trabajo por parte de Secundus Bank.
./setup_secundus_bank_resources.sh

3. Crear carga de trabajo

Crea una cuenta de servicio de carga de trabajo

Ahora crearás una cuenta de servicio para la carga de trabajo con los roles y permisos necesarios, como se menciona a continuación. Ejecuta el siguiente script para crear una cuenta de servicio de carga de trabajo en el proyecto de Secundus Bank. La VM que ejecuta la carga de trabajo usaría esta cuenta de servicio.

Esta cuenta de servicio de cargas de trabajo ($WORKLOAD_SERVICE_ACCOUNT) tendrá los siguientes roles:

  • Otorga el rol confidentialcomputing.workloadUser a la cuenta de servicio de la carga de trabajo . Esto permitirá que la cuenta de usuario genere un token de certificación.
  • Otorga el rol logging.logWriter al permiso de la cuenta de servicio de la carga de trabajo. Esto permite que el entorno de Confidential Space escriba registros en Cloud Logging además de la consola en serie, de modo que los registros estén disponibles después de que se detenga la VM.
  • objectViewer para leer datos del bucket de almacenamiento en la nube $PRIMUS_INPUT_STORAGE_BUCKET
  • objectViewer para leer datos del bucket de almacenamiento en la nube $SECUNDUS_INPUT_STORAGE_BUCKET
  • objectAdmin para escribir el resultado de la carga de trabajo en el bucket de almacenamiento en la nube $SECUNDUS_RESULT_STORAGE_BUCKET
./create_workload_service_account.sh

Crear carga de trabajo

Como parte de este paso, crearás una imagen de Docker para la carga de trabajo que se usa en este codelab. La carga de trabajo es una aplicación simple de GoLang que hace lo siguiente:

  • Recuento de clientes en una ubicación geográfica especificada.
  • Busca los clientes comunes de Primus Bank y Secundus Bank en las listas de clientes almacenadas en sus respectivos buckets de Cloud Storage.

Ejecuta la siguiente secuencia de comandos para crear una carga de trabajo en la que se realizan los siguientes pasos:

  • Crea un Artifact Registry ($PRIMUS_ARTIFACT_REPOSITORY) propiedad de Primus Bank en el que se publicará la carga de trabajo.
  • Genera el código y actualízalo con los nombres de los recursos requeridos. El código de carga de trabajo que se usa en este codelab se puede encontrar aquí.
  • Compila el código y empaquétalo en una imagen de Docker. El Dockerfile correspondiente se puede encontrar aquí.
  • Publica la imagen de Docker en Artifact Registry ($PRIMUS_ARTIFACT_REGISTRY) propiedad de Primus Bank.
  • Otorga permiso de lectura $WORKLOAD_SERVICE_ACCOUNT a la cuenta de servicio para Artifact Registry ($PRIMUS_ARTIFACT_REGISTRY).
./create_workload.sh

4. Autoriza y ejecuta cargas de trabajo

Autoriza la carga de trabajo

Primus Bank desea autorizar cargas de trabajo para que accedan a los datos de sus clientes según los atributos de los siguientes recursos:

  • Qué: Código que se verifica
  • Dónde: Un entorno seguro
  • Quién: Un operador de confianza

Primus usa la federación de Workload Identity para aplicar una política de acceso basada en estos requisitos.

La federación de identidades para cargas de trabajo te permite especificar condiciones de atributo. Estas condiciones restringen qué identidades pueden autenticarse con el grupo de identidades para cargas de trabajo (WIP). Puedes agregar el servicio de verificador de certificación al WIP como un proveedor de grupos de identidades para cargas de trabajo para presentar mediciones y aplicar la política.

El grupo de identidades para cargas de trabajo ya se creó antes como parte del paso de configuración de los recursos de Cloud. Ahora, Primus Bank creará un nuevo proveedor de grupos de identidades para cargas de trabajo de OIDC. El --attribute-condition especificado autoriza el acceso al contenedor de la carga de trabajo. Requiere lo siguiente:

  • Qué: Se subió la versión más reciente de $WORKLOAD_IMAGE_NAME al repositorio de $PRIMUS_ARTIFACT_REPOSITORY.
  • Ubicación: El entorno de ejecución confiable de Confidential Space se ejecuta en la imagen de Confidential Space VM totalmente compatible.
  • Quién: Cuenta de servicio de Secundus Bank $WORKLOAD_SERVICE_ACCOUNT.
gcloud config set project $PRIMUS_PROJECT_ID
gcloud iam workload-identity-pools providers create-oidc $PRIMUS_WIP_PROVIDER \
  --location="global" \
  --workload-identity-pool="$PRIMUS_WORKLOAD_IDENTITY_POOL" \
  --issuer-uri="https://confidentialcomputing.googleapis.com/" \
  --allowed-audiences="https://sts.googleapis.com" \
  --attribute-mapping="google.subject='assertion.sub'" \
  --attribute-condition="assertion.swname == 'CONFIDENTIAL_SPACE' && 
   'STABLE' in assertion.submods.confidential_space.support_attributes &&
   assertion.submods.container.image_reference == 'us-docker.pkg.dev/$PRIMUS_PROJECT_ID/$PRIMUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG' && 
'$WORKLOAD_SERVICE_ACCOUNT@$SECUNDUS_PROJECT_ID.iam.gserviceaccount.com' in assertion.google_service_accounts"

Al igual que el WIP creado para Primus Bank, Secundus Bank desea autorizar cargas de trabajo para que accedan a sus datos de clientes según los siguientes criterios:

  • Qué: Es la carga de trabajo.
  • Dónde: El entorno de Confidential Space.
  • Quién: La cuenta ($WORKLOAD_SERVICE_ACCOUNT) que ejecuta la carga de trabajo.

Primus Bank usa el reclamo image_reference, que incluye la etiqueta de imagen, para determinar si debe autorizar el acceso. Controlan el repositorio remoto, por lo que pueden asegurarse de etiquetar solo las imágenes que no filtran sus datos.

En comparación, Secundus Bank no controla el repositorio del que obtiene la imagen, por lo que no puede hacer esa suposición de forma segura. En cambio, eligen autorizar el acceso a la carga de trabajo según su image_digest. A diferencia de image_reference, que Primus Bank podría cambiar para que apunte a una imagen diferente, Primus Bank no podría hacer que image_digest haga referencia a una imagen que no sea la que Secundus Bank auditó en el paso anterior.

Antes de crear proveedores de grupos de identidades para cargas de trabajo, recopilaremos el image_digest para la imagen del contenedor de la carga de trabajo que se usará en las condiciones de atributos del proveedor.

export WORKLOAD_IMAGE_DIGEST=$(gcloud artifacts docker images describe ${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/$PRIMUS_PROJECT_ID/$PRIMUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG  --format="value(image_summary.digest)" --project ${PRIMUS_PROJECT_ID})
gcloud config set project $SECUNDUS_PROJECT_ID
gcloud iam workload-identity-pools providers create-oidc $SECUNDUS_WIP_PROVIDER \
  --location="global" \
  --workload-identity-pool="$SECUNDUS_WORKLOAD_IDENTITY_POOL" \
  --issuer-uri="https://confidentialcomputing.googleapis.com/" \
  --allowed-audiences="https://sts.googleapis.com" \
  --attribute-mapping="google.subject='assertion.sub'" \
  --attribute-condition="assertion.swname == 'CONFIDENTIAL_SPACE' && 
'STABLE' in assertion.submods.confidential_space.support_attributes && 
assertion.submods.container.image_digest == '${WORKLOAD_IMAGE_DIGEST}' &&
 assertion.submods.container.image_reference == '${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/$PRIMUS_PROJECT_ID/$PRIMUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG' && 
'$WORKLOAD_SERVICE_ACCOUNT@$SECUNDUS_PROJECT_ID.iam.gserviceaccount.com' in assertion.google_service_accounts"

Ejecutar cargas de trabajo

Como parte de este paso, Secundus Bank ejecutará la carga de trabajo en Confidential Space. Esta carga de trabajo obtendrá los tokens de acceso de los grupos de identidades para cargas de trabajo de Primus y Secundus para leer y desencriptar los datos de los clientes de Primus Bank y Secundus Bank, respectivamente.

Los argumentos de TEE obligatorios se pasan con la marca de metadatos. Los argumentos para el contenedor de carga de trabajo se pasan con la parte "tee-cmd" de la marca. El resultado de la ejecución de la carga de trabajo se publicará en $SECUNDUS_RESULT_STORAGE_BUCKET.

Ejecuta la primera carga de trabajo

Como parte de la primera ejecución de la carga de trabajo, esta contará los clientes de Primus Bank desde la ubicación proporcionada en los argumentos del contenedor de carga de trabajo. Como se muestra a continuación, la primera carga de trabajo ejecutará el comando "count-location" y el resultado se almacenará en $SECUNDUS_RESULT_STORAGE_BUCKET/seattle-result.

gcloud compute instances create ${WORKLOAD_VM1} \
 --project=${SECUNDUS_PROJECT_ID} \
 --confidential-compute-type=SEV \
 --shielded-secure-boot \
 --maintenance-policy=MIGRATE \
 --scopes=cloud-platform \
 --zone=${SECUNDUS_PROJECT_ZONE} \
 --image-project=confidential-space-images \
 --image-family=confidential-space \
--service-account=${WORKLOAD_SERVICE_ACCOUNT}@${SECUNDUS_PROJECT_ID}.iam.gserviceaccount.com \
 --metadata "^~^tee-image-reference=${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/${PRIMUS_PROJECT_ID}/${PRIMUS_ARTIFACT_REPOSITORY}/${WORKLOAD_IMAGE_NAME}:${WORKLOAD_IMAGE_TAG}~tee-restart-policy=Never~tee-cmd="[\"count-location\",\"Seattle\",\"gs://${SECUNDUS_RESULT_STORAGE_BUCKET}/seattle-result\"]""

Ver resultados

En el proyecto Secundus, visualiza los resultados de la primera carga de trabajo. Espera de 3 a 5 minutos para que la carga de trabajo complete la ejecución y el resultado esté disponible en el bucket de Cloud Storage.

gcloud config set project $SECUNDUS_PROJECT_ID
gsutil cat gs://$SECUNDUS_RESULT_STORAGE_BUCKET/seattle-result

El resultado debería ser 3, ya que esta es la cantidad de personas de Seattle que se encuentran en el archivo primus_customer_list.csv.

Ejecuta la segunda carga de trabajo

Como parte de la segunda ejecución de la carga de trabajo, encontraremos los clientes comunes de Primus Bank y Secundus Bank. Como se muestra a continuación, la segunda carga de trabajo ejecutará el comando "list-common-customers" y el resultado se almacenará en $SECUNDUS_RESULT_STORAGE_BUCKET/list-common-count.

gcloud compute instances create ${WORKLOAD_VM2} \
 --project=${SECUNDUS_PROJECT_ID} \
 --confidential-compute-type=SEV \
 --shielded-secure-boot \
 --maintenance-policy=MIGRATE \
 --scopes=cloud-platform \
 --zone=${SECUNDUS_PROJECT_ZONE} \
 --image-project=confidential-space-images \
 --image-family=confidential-space \
--service-account=${WORKLOAD_SERVICE_ACCOUNT}@${SECUNDUS_PROJECT_ID}.iam.gserviceaccount.com \
  --metadata "^~^tee-image-reference=${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/${PRIMUS_PROJECT_ID}/${PRIMUS_ARTIFACT_REPOSITORY}/${WORKLOAD_IMAGE_NAME}:${WORKLOAD_IMAGE_TAG}~tee-restart-policy=Never~tee-cmd="[\"list-common-customers\",\"gs://$SECUNDUS_RESULT_STORAGE_BUCKET/list-common-result\"]""

Ver resultados

En el proyecto Secundus, consulta los resultados de la segunda carga de trabajo. Espera de 3 a 5 minutos para que la carga de trabajo complete la ejecución y el resultado esté disponible en el bucket de Cloud Storage.

gcloud config set project $SECUNDUS_PROJECT_ID
gsutil cat gs://$SECUNDUS_RESULT_STORAGE_BUCKET/list-common-result

El resultado debería ser la siguiente lista, ya que estos son los clientes comunes entre Primus y Secundus Bank.

Resultado:

Eric
Clinton
Ashley
Cooper

Ejecuta una carga de trabajo no autorizada

Vence el contrato de Primus Bank que permite a Secundus Bank acceder a sus datos. Por lo tanto, Primus Bank actualiza su condición de atributo para permitir VMs con la cuenta de servicio de su nuevo socio, Tertius Bank.

Primus Bank modifica el proveedor de grupos de Workload Identity

En $PRIMUS_PROJECT_ID, actualiza la condición del atributo para el proveedor de identidades del verificador de certificación de modo que autorice las cargas de trabajo en una ubicación nueva.

  1. Establece el proyecto en $PRIMUS_PROJECT_ID.
gcloud config set project $PRIMUS_PROJECT_ID
  1. Exporta el ID del proyecto de GCP de Tertius Bank con el siguiente comando. Más adelante, Primus Bank usaría esto para actualizar la condición del atributo del proveedor de grupos de identidades para cargas de trabajo. El banco Primus no dejará de autorizar las cuentas de servicio de la carga de trabajo del banco Secundus. Ahora permitirá las cuentas de servicio de la carga de trabajo de Tertius Bank.
export TERTIUS_PROJECT_ID=<GCP project-id of Tertius Bank>
  1. Actualiza el proveedor de OIDC en el grupo de identidades para cargas de trabajo. Aquí, '$WORKLOAD_SERVICE_ACCOUNT@$SECUNDUS_PROJECT_ID.iam.gserviceaccount.com' in assertion.google_service_accounts se cambia a '$WORKLOAD_SERVICE_ACCOUNT@$TERTIUS_PROJECT_ID.iam.gserviceaccount.com' in assertion.google_service_accounts.. En lugar de autorizar la cuenta de servicio de carga de trabajo de Secundus Bank, ahora se autorizará la cuenta de servicio de carga de trabajo de Tertius Bank.
gcloud iam workload-identity-pools providers update-oidc $PRIMUS_WIP_PROVIDER \
  --location="global" \
  --workload-identity-pool="$PRIMUS_WORKLOAD_IDENTITY_POOL" \
  --issuer-uri="https://confidentialcomputing.googleapis.com/" \
  --allowed-audiences="https://sts.googleapis.com" \
  --attribute-mapping="google.subject='assertion.sub'" \
  --attribute-condition="assertion.swname == 'CONFIDENTIAL_SPACE' && 
   'STABLE' in assertion.submods.confidential_space.support_attributes &&
   assertion.submods.container.image_reference == '${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/$PRIMUS_PROJECT_ID/$PRIMUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG' && 
'$WORKLOAD_SERVICE_ACCOUNT@$TERTIUS_PROJECT_ID.iam.gserviceaccount.com' in assertion.google_service_accounts"

Vuelve a ejecutar la carga de trabajo

Cuando Secundus Bank intenta ejecutar la carga de trabajo original, falla. Para ver el error, borra el archivo de resultados original y la instancia de VM, y, luego, intenta ejecutar la carga de trabajo de nuevo.

Borra el archivo de resultados y la instancia de VM existentes

  1. Configura el proyecto como el proyecto de $SECUNDUS_PROJECT_ID.
gcloud config set project $SECUNDUS_PROJECT_ID
  1. Borra el archivo de resultados.
gsutil rm gs://$SECUNDUS_RESULT_STORAGE_BUCKET/list-common-result
  1. Borra la instancia de Confidential VM.
gcloud compute instances delete ${WORKLOAD_VM2} --zone=${SECUNDUS_PROJECT_ZONE}

Ejecuta la carga de trabajo no autorizada:

gcloud compute instances create ${WORKLOAD_VM2} \
 --confidential-compute-type=SEV \
 --shielded-secure-boot \
 --maintenance-policy=MIGRATE \
 --scopes=cloud-platform \
 --zone=${SECUNDUS_PROJECT_ZONE}\
 --image-project=confidential-space-images \
 --image-family=confidential-space \
--service-account=${WORKLOAD_SERVICE_ACCOUNT}@${SECUNDUS_PROJECT_ID}.iam.gserviceaccount.com \
 --metadata "^~^tee-image-reference=${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/${PRIMUS_PROJECT_ID}/${PRIMUS_ARTIFACT_REPOSITORY}/${WORKLOAD_IMAGE_NAME}:${WORKLOAD_IMAGE_TAG}~tee-restart-policy=Never~tee-cmd="[\"list-common-customers\",\"gs://$SECUNDUS_RESULT_STORAGE_BUCKET/list-common-result\"]""

Ver error

En lugar de los resultados de la carga de trabajo, verás un error (The given credential is rejected by the attribute condition).

gsutil cat gs://$SECUNDUS_RESULT_STORAGE_BUCKET/list-common-result

De manera similar, si Primus Bank modifica secretamente la carga de trabajo para enviar la lista completa de clientes de Secundus Bank a un bucket que pertenece a Primus Bank, ese intento fallaría, ya que el resumen de la carga de trabajo maliciosa sería diferente del resumen de la imagen que se autorizó en el grupo de identidades de carga de trabajo de Secundus Bank.

5. Limpieza

Aquí se encuentra la secuencia de comandos que se puede usar para limpiar los recursos que creamos como parte de este codelab. Como parte de esta limpieza, se borrarán los siguientes recursos:

  • Bucket de Cloud Storage de entrada de Primus Bank ($PRIMUS_INPUT_STORAGE_BUCKET).
  • Una cuenta de servicio de Primus Bank ($PRIMUS_SERVICE_ACCOUNT).
  • Un registro de artefactos de Primus Bank que contiene firmas de imágenes ($PRIMUS_COSIGN_REPOSITORY).
  • Es un grupo de identidades para cargas de trabajo de Primus Bank($PRIMUS_WORKLOAD_IDENTITY_POOL).
  • Es una cuenta de servicio de carga de trabajo del banco Secundus ($WORKLOAD_SERVICE_ACCOUNT).
  • Bucket de Cloud Storage de entrada del banco de Secundus ($SECUNDUS_INPUT_STORAGE_BUCKET).
  • Es una cuenta de servicio del banco Secundus ($SECUNDUS_SERVICE_ACCOUNT).
  • Un registro de artefactos de Secundus Bank que contiene firmas de imágenes ($SECUNDUS_COSIGN_REPOSITORY).
  • Es un grupo de identidades para cargas de trabajo de Secundus Bank($SECUNDUS_WORKLOAD_IDENTITY_POOL).
  • Es una cuenta de servicio de carga de trabajo de Secundus Bank ($WORKLOAD_SERVICE_ACCOUNT).
  • Instancias de procesamiento de cargas de trabajo.
  • Es el bucket de almacenamiento de resultados de Secundus Bank ($SECUNDUS_RESULT_STORAGE_BUCKET).
  • Un repositorio de artefactos de Primus Bank ($PRIMUS_ARTIFACT_REPOSITORY).
./cleanup.sh

Si terminaste de explorar, considera borrar tu proyecto.

  • Ve a Cloud Platform Console.
  • Selecciona el proyecto que deseas cerrar y, luego, haz clic en "Borrar" en la parte superior para programar su eliminación.

Felicitaciones

¡Felicitaciones! Completaste el codelab correctamente.

Aprendiste a proteger los datos compartidos y a mantener su confidencialidad con Confidential Space.

¿Qué sigue?

Consulta algunos de estos codelabs similares…

Lecturas adicionales