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.
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.
Antes de comenzar
-
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.
-
Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.
-
Habilita las API de Cloud Build, Cloud Functions, and Cloud KMS.
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:
En la consola de Google Cloud, ve a la página Cuentas de servicio.
Selecciona tu proyecto.
Haz clic en
Crear cuenta de servicio.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.Opcional: En el campo Descripción de la cuenta de servicio, ingresa una descripción para la cuenta de servicio.
Haz clic en Crear y continuar.
Haz clic en Seleccionar un rol y, luego, selecciona Encriptador/Desencriptador de CryptoKeys de Cloud KMS.
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
En la consola de Google Cloud, abre la administración de claves.
Haz clic en **+ Crear llavero de claves **. En el cuadro de diálogo que aparece, haz lo siguiente:
- Asigna el nombre
tokenization-service-kr
al llavero de claves. - 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.
- Vuelve a verificar tus opciones, ya que no puedes borrar o cambiar el nombre de los llaveros de claves después de crearlos.
Haz clic en Crear (Create).
El sistema crea el llavero de claves y te redirige a la página de creación de claves.
- Asigna el nombre
En el cuadro de diálogo Crear clave, haz lo siguiente:
- Asigna el nombre
cc-tokenization
a la clave. - En Propósito, selecciona
Symmetric encrypt/decrypt
. Establece el Período de rotación en el valor que desees y haz clic en Crear.
- Asigna el nombre
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.
En la consola de Google Cloud, abre Cloud Shell.
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 archivoindex.js
, que es la fuente de dos funciones de Cloud Functions diferentes que crearás. También contienepackage.json
, que indica a Cloud 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 de Node.js requiere que definas explícitamente el ID del proyecto de Google Cloud:
"project_id": "YOUR_PROJECT_ID"
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"
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.
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
.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.
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 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
.Cuando se implementen las funciones, abre la consola de Cloud Functions.
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.
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
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
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.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.
- En la consola de Google Cloud, ve a la página Administrar recursos.
- En la lista de proyectos, elige el proyecto que quieres borrar y haz clic en Borrar.
- En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrar el proyecto.
¿Qué sigue?
- Cumplimiento de las normas de seguridad de datos de la PCI.
- Usa OAuth 2.0 para acceder a las API de Google.
- Requisitos de las PCI DSS.
- Suplemento de información de la asignación de token de las PCI DSS.
- Explora arquitecturas de referencia, diagramas y prácticas recomendadas sobre Google Cloud. Consulta nuestro Cloud Architecture Center.