Asigna tokens a datos sensibles de titulares de tarjetas para PCI DSS

Last reviewed 2023-05-05 UTC

En este instructivo, se muestra cómo configurar un servicio de asignación de token para tarjetas de crédito y débito con acceso controlado en Cloud Functions. Para configurar el servicio, en el artículo, se usan estos servicios de Google Cloud: Identity and Access Management (IAM) y Cloud Key Management Service (KMS).

La asignación de token es un proceso que consiste en sustituir un valor de marcador de posición benigno, o token, por información sensible, como los datos de la tarjeta de crédito. En la parte 3 de las Normas de seguridad de datos de la industria de tarjetas de pago (PCI DSS), se requiere que la mayoría de los datos almacenados en una tarjeta de crédito se traten como información sensible.

Un token en sí mismo no es de gran utilidad, excepto como un medio para buscar datos con asignación de token en un contexto particular. Sin embargo, debes asegurarte de que tus tokens no contengan información específica del usuario y que no se puedan desencriptar directamente. De esta manera, si pierdes el control sobre los tokens de la tarjeta de pago de tus clientes, nadie puede usar los tokens para comprometer los datos del titular de la tarjeta.

Un servicio para administrar información sensible

Hay muchas opciones para que la plataforma o el servicio alojen el entorno de los datos del titular de la tarjeta (CDE). En este instructivo, se describe cómo realizar una implementación de muestra mediante Cloud Functions y se ofrece orientación sobre los pasos que se deben seguir a fin de obtener una solución lista para la producción.

Cloud Functions es una plataforma sin servidores que aloja y ejecuta código, y es un servicio conveniente para iniciar con rapidez aplicaciones que escalan sin intervención. Ten en cuenta que para que un CDE cumpla con las PCI DSS, debes limitar todo el tráfico entrante y saliente a las conexiones autorizadas. En la actualidad, estos controles detallados no están disponibles para Cloud Functions. Por lo tanto, debes implementar controles de compensación en otro lugar (como en tu aplicación) o elegir una plataforma diferente. El mismo servicio de asignación de token se puede ejecutar con métodos que incluyan contenedores, como un grupo de instancias administrado de ajuste de escala automático o un clúster de Kubernetes. Estos serían entornos de producción más convenientes con controles de red de VPC completos.

Cloud KMS es el servicio de administración de claves de Google Cloud. Cloud KMS aloja tus claves de encriptación, las rota con regularidad y encripta o desencripta datos almacenados de la cuenta.

En este instructivo, se usa IAM para proporcionar controles estrictos sobre todos los recursos usados en el servicio de asignación de token. Necesitas una cuenta de servicio especial que tenga tokens que se vencen con frecuencia para otorgar acceso a Cloud KMS y ejecutar el tokenizador.

En la siguiente figura, se ilustra la arquitectura de la app de asignación de token que crearás en este instructivo.

arquitectura de la app de asignación de token

Objetivos

  • Crea una cuenta de servicio.
  • Configurar Cloud KMS
  • Crear dos funciones de Cloud Functions
  • Crea un token de autenticación.
  • Llama al tokenizador.

Costos

En este documento, usarás los siguientes componentes facturables de Google Cloud:

Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios. Es posible que los usuarios nuevos de Google Cloud califiquen para obtener una prueba gratuita.

Antes de comenzar

  1. En la consola de Google Cloud, ve a la página del selector de proyectos.

    Ir al selector de proyectos

  2. Para comenzar a crear un proyecto de Google Cloud, haz clic en Crear proyecto.

  3. Ponle un nombre al proyecto. Toma nota de tu ID del proyecto generado.

  4. Edita los otros campos según sea necesario.

  5. Para crear el proyecto, haz clic en Crear.

  6. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.

  7. Habilita las API de Cloud Build, Cloud Functions, and Cloud KMS.

    Habilita las API

Cuando finalices las tareas que se describen en este documento, puedes borrar los recursos que creaste para evitar que continúe la facturación. Para obtener más información, consulta Cómo realizar una limpieza.

Crea la cuenta de servicio

La cuenta de servicio del entorno de ejecución predeterminada para Cloud Functions tiene el rol de editor, que permite un acceso amplio a muchos servicios de Google Cloud. Aunque es la forma más rápida de desarrollar funciones, Google recomienda usar la cuenta de servicio predeterminada solo para pruebas y desarrollo. Creas una cuenta de servicio para limitar las APIs que la función puede usar de acuerdo con el principio de privilegio mínimo. Para crear una cuenta de servicio, haz lo siguiente:

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

    Ir a Cuentas de servicio

  2. Selecciona tu proyecto.

  3. Haz clic en Crear cuenta de servicio.

  4. En el campo Nombre de la cuenta de servicio, ingresa Tokenization Service User. La consola de Google Cloud completa el campo ID de cuenta de servicio según este nombre.

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

  6. Haz clic en Crear y continuar.

  7. Haz clic en Seleccionar un rol y, luego, selecciona Encriptador/Desencriptador de CryptoKeys de Cloud KMS.

  8. Para terminar de crear la cuenta de servicio, haz clic en Listo.

    Ahora tienes un usuario de cuenta de servicio con la siguiente dirección de correo electrónico:

    tokenization-service-user@YOUR_PROJECT_ID.iam.gserviceaccount.com

Configura Cloud KMS

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

    Ir a la página Claves criptográficas

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

    1. Asigna el nombre tokenization-service-kr al llavero de claves.
    2. En Ubicación del llavero de claves (Key ring location), selecciona global. Esta es una opción común que resulta suficiente para este instructivo. Sin embargo, antes de tomar decisiones sobre la arquitectura de producción, asegúrate de conocer las diferencias entre las distintas ubicaciones de Cloud KMS.
    3. Vuelve a verificar tus opciones, ya que no puedes borrar o cambiar el nombre de los llaveros de claves después de crearlos.
    4. Haz clic en Crear (Create).

      Creación de un llavero de claves

    El sistema crea el llavero 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. Asigna el nombre cc-tokenization a la clave.
    2. En Propósito, selecciona Symmetric encrypt/decrypt.
    3. Establece el Período de rotación en el valor que desees y haz clic en Crear.

    Seguimiento de información sobre tus claves

Crea Cloud Functions

En este instructivo, se supone que usarás Cloud Shell. Si usas una terminal diferente, asegúrate de tener la última versión de Google Cloud CLI.

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

    Ir a Cloud Shell

  2. Clona el repositorio de proyectos 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 Functions diferentes que crearás. También contiene package.json, que indica a Cloud 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 de Node.js requiere que definas explícitamente el ID del proyecto de Google Cloud:

    "project_id":              "YOUR_PROJECT_ID"
  4. Busca la configuración de KMS y aplica los valores de KMS que creaste en la sección anterior:

    "location":                "global",
    "key_ring":                "tokenization-service-kr",
    "key_name":                "cc-tokenization"
    
  5. Implementa la función de asignación de tokens.

    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. Implementa la función de anulación de la asignació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 revierte el proceso de asignación de token.

  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 anulación de la asignación.

    Creaste dos funciones de Cloud Functions separadas: una para convertir el número de tarjeta en un token y otra con el fin de revertir el proceso. Los diferentes puntos de entrada dirigen la ejecución a la función de inicio adecuada en el archivo index.js.

  9. Cuando se implementen las funciones, abre la consola de Cloud Functions.

    Abrir la consola de Cloud Functions

  10. Verifica que las funciones se hayan creado. Si todo sale bien, verás las dos funciones con una marca de verificación junto a cada una.

    Verifica que las funciones de Cloud Functions se hayan creado.

Crea un token de autenticación

La opción no-allow-unauthenticated en el comando gcloud functions deploy significa que un emisor que invoca las funciones debe presentar un token de autenticación para confirmar su identidad. El 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 string de token de autenticación, la almacenan en la variable de entorno $AUTH_TOKEN y, luego, muestran el token. Luego, llama a las funciones de Cloud Functions que implementaste con el token.

Llama al tokenizador

  1. Crea algunos datos de muestra para pasar 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, luego, 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 string de asignación de token que representa los datos de la tarjeta de crédito. Esta string se almacenó en la variable de entorno CC_TOK. Puedes recuperar la información de la tarjeta si invocas al detokenizador.

  3. Revierte la asignación de token 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"
    

    El resultado presenta el siguiente aspecto:

    {"cc":"4000300020001000","mm":"11","yyyy":"2028","userid":"543210"}
    

    Estos datos son los que tu app envió originalmente al tokenizador, encriptó y recuperó.

Expande este instructivo

El código de muestra en GitHub es un excelente comienzo, pero hay más aspectos que se deben considerar antes de pasar a producción.

Si decides usar Cloud Functions para la asignación de token de tarjetas de pago, es posible que debas trabajar más a fin de cumplir con los requisitos del asesor de seguridad calificado o el cuestionario de autoevaluación. En particular, en las secciones 1.2 y 1.3 de las PCI DSS, se requieren controles estrictos sobre el tráfico entrante y saliente. Cloud Functions y App Engine no ofrecen un firewall configurable bidireccional, por lo que debes crear controles de compensación o implementar el servicio de asignación de token en Compute Engine o Google Kubernetes Engine. Si deseas explorar la creación de contenedores, el código de GitHub es compatible con Docker y contiene documentación complementaria.

Con este código de ejemplo, también se extraen las dependencias de npm (administrador de paquetes de Node.js) en la implementación. En tu entorno de producción, siempre fija las dependencias en versiones específicas aprobadas. Luego, combina estas versiones con la app o entrégalas desde una ubicación privada y confiable. Cualquiera de estos enfoques te ayuda a evitar el tiempo de inactividad que se produce a partir de una interrupción en el repositorio público de npm o de un ataque a la cadena de suministro que infecta los paquetes que pensaste que eran seguros. Si compilas previamente y agrupas la app completa, el tiempo de implementación suele disminuir, lo que implica un inicio más rápido y un escalamiento más moderado.

Limpia

Para limpiar los recursos individuales que usaste en este instructivo, puedes borrar el proyecto.

  1. En la consola de Google Cloud, ve a la página Administrar recursos.

    Ir a Administrar recursos

  2. En la lista de proyectos, elige el proyecto que quieres borrar y haz clic en Borrar.
  3. En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrar el proyecto.

¿Qué sigue?