En este documento se explica cómo configurar un servicio de tokenización de tarjetas de crédito y débito con control de acceso en funciones de Cloud Run. Para configurar el servicio, la implementación de este documento usa los siguientes Google Cloud servicios: Gestión de Identidades y Accesos (IAM) y Cloud Key Management Service (KMS).
La tokenización es el proceso de sustituir un valor de marcador de posición benigno o un token por información sensible, como los datos de una tarjeta de crédito. La parte 3 de la normativa de seguridad de datos del sector de las tarjetas de pago (PCI DSS) exige que la mayoría de los datos almacenados en una tarjeta de crédito se traten como información sensible.
Un token por sí solo no tiene sentido, excepto como medio para buscar datos tokenizados en un contexto concreto. Sin embargo, debes asegurarte de que tus tokens no contengan información específica de los usuarios y de que no se puedan descifrar directamente. De esta forma, si pierdes el control de los tokens de las tarjetas de pago de tus clientes, nadie podrá usarlos para poner en peligro los datos de los titulares de las tarjetas.
Un servicio para gestionar información sensible
Tienes muchas opciones para la plataforma o el servicio que alojará tu entorno de datos del titular de la tarjeta (CDE). En este documento se explica cómo llevar a cabo una implementación de muestra con funciones de Cloud Run y se indica cómo dar los siguientes pasos para conseguir una solución lista para producción.
Cloud Run Functions es una plataforma sin servidor que aloja y ejecuta código. Es un lugar práctico para lanzar rápidamente una aplicación que se escala sin intervención. Ten en cuenta que, en un CDE que cumpla el estándar PCI DSS, debes limitar todo el tráfico entrante y saliente a las conexiones autorizadas. Actualmente, estos controles detallados no están disponibles para las funciones de Cloud Run. Por lo tanto, debes implementar controles compensatorios en otro lugar (por ejemplo, en tu aplicación) o elegir otra plataforma. El mismo servicio de tokenización se puede ejecutar de forma contenerizada, como un grupo de instancias gestionado con escalado automático o un clúster de Kubernetes. Estos serían los entornos de producción preferibles con sus controles de red VPC completos.
Cloud KMS es el servicio de gestión de claves de Google Cloud. Cloud KMS aloja tus claves de encriptado, las rota periódicamente y encripta o desencripta los datos de la cuenta almacenados.
En este documento, se usa la gestión de identidades y accesos para controlar estrictamente todos los recursos utilizados en el servicio de tokenización. Necesitas una cuenta de servicio especial que tenga tokens que caduquen con frecuencia para conceder acceso a Cloud KMS y ejecutar el tokenizador.
En la siguiente figura se muestra la arquitectura de la aplicación de tokenización que crearás en este documento.
Objetivos
- Crea una cuenta de servicio.
- Configura Cloud KMS.
- Crea dos funciones de Cloud Run.
- Crea un token de autenticación.
- Llama al tokenizador.
Costes
En este documento, se utilizan los siguientes componentes facturables de Google Cloud:
Para generar una estimación de costes basada en el uso previsto,
utiliza la calculadora de precios.
Antes de empezar
-
Ensure that you have the Project Creator IAM role
(
roles/resourcemanager.projectCreator
). Learn how to grant roles. -
In the Google Cloud console, go to the project selector page.
-
Click Create project.
-
Name your project. Make a note of your generated project ID.
-
Edit the other fields as needed.
-
Click Create.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the Cloud Build, Cloud Run functions, and Cloud KMS APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin
), which contains theserviceusage.services.enable
permission. Learn how to grant roles.
Cuando termines las tareas que se describen en este documento, puedes evitar que se te siga facturando eliminando los recursos que has creado. Para obtener más información, consulta la sección Limpiar.
Crear la cuenta de servicio
La cuenta de servicio de entorno de ejecución predeterminada de las funciones de Cloud Run tiene el rol Editor, que le da acceso amplio a muchos Google Cloud servicios. Aunque esta es la forma más rápida de desarrollar funciones, Google recomienda usar la cuenta de servicio predeterminada solo para pruebas y desarrollo. Crea una cuenta de servicio para limitar las APIs que puede usar la función de acuerdo con el principio de mínimos accesos. Para crear una cuenta de servicio, sigue estos pasos:
En la Google Cloud consola, ve a la página Cuentas de servicio.
Selecciona el proyecto.
Haz clic en
Crear cuenta de servicio.En el campo Nombre de cuenta de servicio, escribe
Tokenization Service User
. La consola rellena el campo ID de cuenta de servicio en función de este nombre. Google CloudOpcional: En el campo Descripción de la cuenta de servicio, escribe una descripción.
Haz clic en Crear y continuar.
Haz clic en Selecciona un rol y, a continuación, selecciona Encargado del encriptado y desencriptado de claves de CryptoKey de Cloud KMS.
Para terminar de crear la cuenta de servicio, haz clic en Hecho.
Ahora tienes un usuario de cuenta de servicio con la siguiente dirección de correo:
tokenization-service-user@YOUR_PROJECT_ID.iam.gserviceaccount.com
Configurar Cloud KMS
En la consola de Google Cloud , abre Gestión de claves.
Haz clic en + Crear conjunto de claves. En el cuadro de diálogo que aparece, haz lo siguiente:
- Ponle el nombre
tokenization-service-kr
al conjunto de claves. - En Ubicación del conjunto de claves, selecciona global. Es una opción habitual que es suficiente para este ejemplo de implementación. Sin embargo, antes de tomar cualquier decisión sobre la arquitectura de producción, asegúrate de entender las diferencias entre las distintas ubicaciones de Cloud KMS.
- Comprueba tus selecciones, ya que no podrás eliminar ni cambiar el nombre de los llaveros una vez creados.
- Haz clic en Crear.
El sistema crea el conjunto de claves y te redirige a la página de creación de claves.
- Ponle el nombre
En el cuadro de diálogo Crear clave, haz lo siguiente:
- Dale a la clave el nombre
cc-tokenization
. - En Objetivo, selecciona
Symmetric encrypt/decrypt
. Asigna el valor que quieras a Periodo de rotación y haz clic en Crear.
- Dale a la clave el nombre
Crear funciones de Cloud Run
En este documento se da por supuesto que usarás Cloud Shell. Si usas otro terminal, asegúrate de tener la versión más reciente de la CLI de Google Cloud.
En la Google Cloud consola, abre Cloud Shell:
Clona el repositorio del proyecto de GitHub y ve a la carpeta de trabajo:
git clone https://github.com/GoogleCloudPlatform/community gcp-community cd gcp-community/tutorials/pci-tokenizer/
La carpeta
gcs-cf-tokenizer
contiene el archivoindex.js
, que es la fuente de dos funciones de Cloud Run diferentes que crearás. También contienepackage.json
, que indica a Cloud Run Functions qué paquetes ejecutar.Aplica la configuración de KMS: copia el archivo de plantilla de configuración y ábrelo para editarlo:
cp config/default.json config/local.json nano config/local.json
El entorno de ejecución Node.js requiere que definas explícitamente el ID del proyecto: Google Cloud
"project_id": "YOUR_PROJECT_ID"
Busca la configuración de KMS y aplica los valores de KMS que has creado en la sección anterior:
"location": "global", "key_ring": "tokenization-service-kr", "key_name": "cc-tokenization"
Implementa la función de tokenización.
gcloud functions deploy tokenize --runtime=nodejs18 --trigger-http \ --entry-point=kms_crypto_tokenize --memory=256MB \ --service-account=tokenization-service-user@YOUR_PROJECT_ID.iam.gserviceaccount.com \ --no-allow-unauthenticated --source=.
Esta función convierte la información de la tarjeta de crédito en un token.
Busca el valor de la URL en
httpsTrigger
en el resultado del comandogcloud functions deploy
. Almacena el valor de la URL en la variable de entornoTOK_URL
:TOK_URL="TOK_URL"
Usarás la variable de entorno
TOK_URL
para llamar a la funcióntokenize
.Despliega la función de destokenización en el modo KMS.
gcloud functions deploy detokenize --runtime=nodejs18 --trigger-http \ --entry-point=kms_crypto_detokenize --memory=256MB \ --service-account=tokenization-service-user@YOUR_PROJECT_ID.iam.gserviceaccount.com \ --no-allow-unauthenticated --source=.
Esta función invierte el proceso de tokenización.
Busca el valor de la URL en
httpsTrigger
en el resultado del comandogcloud functions deploy
. Almacena el valor de la URL en la variable de entornoDETOK_URL
:DETOK_URL="DETOK_URL"
Usarás la variable de entorno
DETOK_URL
para llamar a la función de detokenización.Has creado dos funciones de Cloud Run independientes: una para convertir el número de la tarjeta en un token y otra para invertir el proceso. Los puntos de entrada diferentes dirigen la ejecución a la función de inicio adecuada en el archivo
index.js
.Cuando se hayan desplegado las funciones, abre la consola de Cloud Run Functions.
Verifica que se hayan creado las funciones. Si todo ha ido bien, verás las dos funciones con una marca de verificación junto a cada una.
Crear un token de autenticación
La opción no-allow-unauthenticated
del comando gcloud functions deploy
significa que la persona que llama que invoca las funciones debe presentar un token de autenticación para confirmar su identidad. El método llamador debe tener el permiso cloudfunctions.functions.invoke
. Los siguientes roles predefinidos tienen este permiso: Invocador de Cloud Functions, Administrador de Cloud Functions y Desarrollador de Cloud Functions.
Crea el token de autenticación:
AUTH_TOKEN=$(gcloud auth print-identity-token) echo $AUTH_TOKEN
Estos comandos generan una cadena de token de autenticación, la almacenan en la variable de entorno $AUTH_TOKEN
y, a continuación, muestran el token. Más adelante, llamarás a las funciones de Cloud Run que hayas desplegado con el token.
Llamar al tokenizador
Crea algunos datos de muestra para pasarlos al tokenizador:
export TOK_CC=4000300020001000 export TOK_MM=11 export TOK_YYYY=2028 export TOK_UID=543210
Genera un token de autenticación como se describe en la sección anterior y, a continuación, llama al tokenizador:
CC_TOKEN=$(curl -s \ -X POST "$TOK_URL" \ -H "Content-Type:application/json" \ -H "Authorization: Bearer $AUTH_TOKEN" \ --data '{"cc": "'$TOK_CC'", "mm": "'$TOK_MM'", "yyyy": "'$TOK_YYYY'", "user_id": "'$TOK_UID'"}' \ ) echo $CC_TOKEN
Se muestra la cadena de tokenización que representa los datos de la tarjeta de crédito. Esta cadena se ha almacenado en la variable de entorno
CC_TOK
. Puedes recuperar la información de la tarjeta invocando el detokenizador.Invierte la tokenización con el siguiente comando.
DETOK_DATA=$(curl -s \ -X POST "$DETOK_URL" \ -H "Content-Type:application/json" \ -H "Authorization: Bearer $AUTH_TOKEN" \ --data '{"user_id": "'$TOK_UID'", "token": "'$CC_TOKEN'"}' \ ) echo -e "$DETOK_DATA\n"
La salida es similar a la siguiente:
{"cc":"4000300020001000","mm":"11","yyyy":"2028","userid":"543210"}
Estos datos son los que se enviaron originalmente al tokenizador, se descifraron y tu aplicación los recuperó.
Ampliar este ejemplo
El código de muestra de GitHub es un buen punto de partida, pero hay más aspectos que debes tener en cuenta antes de pasar a producción.
Si decides usar funciones de Cloud Run para la tokenización de tarjetas de pago, es posible que tengas que hacer más trabajo para cumplir los requisitos de tu asesor de seguridad cualificado o tu cuestionario de autoevaluación. En concreto, las secciones 1.2 y 1.3 de PCI DSS requieren controles estrictos sobre el tráfico entrante y saliente. Las funciones de Cloud Run y App Engine no ofrecen un cortafuegos configurable bidireccional, por lo que debes crear controles compensatorios o desplegar el servicio de tokenización en Compute Engine o Google Kubernetes Engine. Si quieres probar la contenerización, el código de GitHub es compatible con Docker y contiene documentación de asistencia.
Este código de muestra también incorpora las dependencias de npm (gestor de paquetes de Node.js) en la implementación. En tu entorno de producción, siempre debes fijar las dependencias a versiones específicas verificadas. Después, agrupa estas versiones con la aplicación o sirve las versiones desde una ubicación privada y de confianza. Cualquiera de los dos enfoques te ayuda a evitar el tiempo de inactividad derivado de una interrupción en el repositorio público de npm o de un ataque a la cadena de suministro que infecte paquetes que creías que eran seguros. Si precompilas y empaquetas la aplicación completa, el tiempo de implementación suele reducirse, lo que significa que los lanzamientos son más rápidos y el escalado es más fluido.
Limpieza
Para evitar que se apliquen cargos en tu Google Cloud cuenta por los recursos utilizados en este ejemplo de implementación, puedes eliminar el proyecto que contiene los recursos.
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
Siguientes pasos
- Cumplimiento del estándar de seguridad de datos del PCI.
- Usar OAuth 2.0 para acceder a las APIs de Google.
- Requisitos del PCI DSS.
- Suplemento de información sobre la tokenización de PCI DSS.
- Para ver más arquitecturas de referencia, diagramas y prácticas recomendadas, consulta el centro de arquitectura de Cloud.