Tokenizar datos sensibles de titulares de tarjetas en el ámbito del PCI DSS

Last reviewed 2025-04-28 UTC

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.

arquitectura de la aplicación de tokenización

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.

Los usuarios nuevos Google Cloud pueden disfrutar de una prueba gratuita.

Antes de empezar

  1. Ensure that you have the Project Creator IAM role (roles/resourcemanager.projectCreator). Learn how to grant roles.
  2. In the Google Cloud console, go to the project selector page.

    Go to project selector

  3. Click Create project.

  4. Name your project. Make a note of your generated project ID.

  5. Edit the other fields as needed.

  6. Click Create.

  7. Verify that billing is enabled for your Google Cloud project.

  8. 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 the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

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:

  1. En la Google Cloud consola, ve a la página Cuentas de servicio.

    Ir a Cuentas de servicio

  2. Selecciona el proyecto.

  3. Haz clic en Crear cuenta de servicio.

  4. 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 Cloud

  5. Opcional: En el campo Descripción de la cuenta de servicio, escribe una descripción.

  6. Haz clic en Crear y continuar.

  7. Haz clic en Selecciona un rol y, a continuación, selecciona Encargado del encriptado y desencriptado de claves de CryptoKey de Cloud KMS.

  8. 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

  1. En la consola de Google Cloud , abre Gestión de claves.

    Ir a la página Claves criptográficas

  2. Haz clic en + Crear conjunto de claves. En el cuadro de diálogo que aparece, haz lo siguiente:

    1. Ponle el nombre tokenization-service-kr al conjunto de claves.
    2. 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.
    3. Comprueba tus selecciones, ya que no podrás eliminar ni cambiar el nombre de los llaveros una vez creados.
    4. Haz clic en Crear.

    El sistema crea el conjunto de claves y te redirige a la página de creación de claves.

  3. En el cuadro de diálogo Crear clave, haz lo siguiente:

    1. Dale a la clave el nombre cc-tokenization.
    2. En Objetivo, selecciona Symmetric encrypt/decrypt.
    3. Asigna el valor que quieras a Periodo de rotación y haz clic en Crear.

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.

  1. En la Google Cloud consola, abre Cloud Shell:

    Ir a Cloud Shell

  2. 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 archivo index.js, que es la fuente de dos funciones de Cloud Run diferentes que crearás. También contiene package.json, que indica a Cloud Run Functions qué paquetes ejecutar.

  3. 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"
  4. 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"
    
  5. 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.

  6. Busca el valor de la URL en httpsTrigger en el resultado del comando gcloud functions deploy. Almacena el valor de la URL en la variable de entorno TOK_URL:

    TOK_URL="TOK_URL"

    Usarás la variable de entorno TOK_URL para llamar a la función tokenize.

  7. 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.

  8. Busca el valor de la URL en httpsTrigger en el resultado del comando gcloud functions deploy. Almacena el valor de la URL en la variable de entorno DETOK_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.

  9. Cuando se hayan desplegado las funciones, abre la consola de Cloud Run Functions.

    Abrir la consola de Cloud Run Functions

  10. 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

  1. 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
    
  2. 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.

  3. 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.

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

Siguientes pasos