Este documento mostra como configurar um serviço de tokenização de cartões de crédito e débito controlado por acesso em funções do Cloud Run. Para configurar o serviço, a implementação neste documento usa os seguintes Google Cloud serviços: Identity and Access Management (IAM) e Cloud Key Management Service (KMS).
A tokenização é o processo de substituição de um valor de marcador de posição benigno ou um token por informações confidenciais, como dados de cartões de crédito. A Parte 3 da Norma de Segurança de Dados do Setor de Cartões de Pagamento (PCI DSS) exige que a maioria dos dados armazenados num cartão de crédito seja tratada como informações confidenciais.
Um token por si só não tem significado, exceto como meio de procurar dados tokenizados num contexto específico. No entanto, continua a ter de garantir que os seus tokens não contêm informações específicas do utilizador e que não são diretamente descritografáveis. Desta forma, se perder o controlo sobre os tokens dos cartões de pagamento dos seus clientes, ninguém pode usar os tokens para comprometer os dados dos titulares dos cartões.
Um serviço para processar informações confidenciais
Tem muitas opções para a plataforma ou o serviço que aloja o seu ambiente de dados do titular do cartão (CDE). Este documento explica uma implementação de exemplo com funções do Cloud Run e ajuda nos passos seguintes para uma solução pronta para produção.
O Cloud Run Functions é uma plataforma sem servidor que aloja e executa código. É um local conveniente para iniciar rapidamente uma aplicação que é dimensionada sem intervenção. Tenha em atenção que, num CDE em conformidade com a norma PCI DSS, tem de limitar todo o tráfego de entrada e saída a ligações autorizadas. Atualmente, estes controlos detalhados não estão disponíveis para as funções do Cloud Run. Por conseguinte, tem de implementar controlos de compensação noutro local (como na sua aplicação) ou escolher uma plataforma diferente. O mesmo serviço de tokenização pode ser executado de forma contentorizada, como um grupo de instâncias gerido de escala automática ou um cluster do Kubernetes. Estes seriam ambientes de produção preferíveis com os respetivos controlos completos da rede VPC.
O Cloud KMS é o serviço de gestão de chaves da Google Cloud. O Cloud KMS aloja as suas chaves de encriptação, faz a rotação das mesmas regularmente e encripta ou desencripta os dados da conta armazenados.
O IAM é usado neste documento para fornecer controlos rigorosos em todos os recursos usados no serviço de tokenização. Precisa de uma conta de serviço especial com tokens que expiram frequentemente para conceder acesso ao Cloud KMS e executar o tokenizador.
A figura seguinte ilustra a arquitetura da app de tokenização que cria neste documento.
Objetivos
- Crie uma conta de serviço.
- Configure o Cloud KMS.
- Crie duas funções do Cloud Run.
- Crie um token de autenticação.
- Chame o tokenizador.
Custos
Neste documento, usa os seguintes componentes faturáveis do Google Cloud:
Para gerar uma estimativa de custos com base na sua utilização projetada,
use a calculadora de preços.
Antes de começar
-
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.
Quando terminar as tarefas descritas neste documento, pode evitar a faturação contínua eliminando os recursos que criou. Para mais informações, consulte o artigo Limpe.
Crie a conta de serviço
A conta de serviço de tempo de execução predefinida para as funções do Cloud Run tem a função Editor, que permite um acesso amplo a muitos Google Cloud serviços. Embora seja a forma mais rápida de desenvolver funções, a Google recomenda a utilização da conta de serviço predefinida apenas para testes e desenvolvimento. Cria uma conta de serviço para limitar as APIs que a função pode usar de acordo com o princípio do menor privilégio. Para criar uma conta de serviço, faça o seguinte:
Na Google Cloud consola, aceda à página Contas de serviço.
Selecione o seu projeto.
Clique em
Criar conta de serviço.No campo Nome da conta de serviço, introduza
Tokenization Service User
. A Google Cloud consola preenche o campo ID da conta de serviço com base neste nome.Opcional: no campo Descrição da conta de serviço, introduza uma descrição para a conta de serviço.
Clique em Criar e continuar.
Clique em Selecionar uma função e, de seguida, selecione Encriptador/desencriptador de CryptoKey do Cloud KMS.
Para concluir a criação da conta de serviço, clique em Concluído.
Agora, tem um utilizador de conta de serviço com o seguinte endereço de email:
tokenization-service-user@YOUR_PROJECT_ID.iam.gserviceaccount.com
Configure o Cloud KMS
Na Google Cloud consola, abra Gestão de chaves.
Clique em + Criar conjunto de chaves. Na caixa de diálogo apresentada, faça o seguinte:
- Dê o nome
tokenization-service-kr
ao conjunto de chaves. - Para Localização do porta-chaves, selecione global. Esta é uma escolha comum que é suficiente para esta implementação de exemplo. No entanto, antes de tomar decisões sobre a arquitetura de produção, certifique-se de que compreende as diferenças entre as várias localizações do Cloud KMS.
- Confirme as suas escolhas, porque não pode eliminar nem mudar o nome dos conjuntos de chaves depois de os criar.
- Clique em Criar.
O sistema cria o conjunto de chaves e encaminha-o para a página de criação de chaves.
- Dê o nome
Na caixa de diálogo Criar chave, faça o seguinte:
- Atribua o nome
cc-tokenization
à chave. - Para Finalidade, selecione
Symmetric encrypt/decrypt
. Defina o Período de rotação para um valor à sua escolha e clique em Criar.
- Atribua o nome
Crie funções do Cloud Run
Este documento pressupõe que vai usar o Cloud Shell. Se usar um terminal diferente, certifique-se de que tem a versão mais recente da CLI Google Cloud.
Na Google Cloud consola, abra o Cloud Shell:
Clone o repositório do projeto do GitHub e mova-o para a pasta de trabalho:
git clone https://github.com/GoogleCloudPlatform/community gcp-community cd gcp-community/tutorials/pci-tokenizer/
A pasta
gcs-cf-tokenizer
contém o ficheiroindex.js
, que é a origem de duas funções do Cloud Run diferentes que vai criar. Também contémpackage.json
, que indica às funções do Cloud Run que pacotes executar.Aplique a configuração do KMS: copie o ficheiro do modelo de configuração e abra-o para edição:
cp config/default.json config/local.json nano config/local.json
O tempo de execução do Node.js requer que defina explicitamente o Google Cloud ID do projeto:
"project_id": "YOUR_PROJECT_ID"
Encontre a configuração do KMS e aplique os valores do KMS que criou na secção anterior:
"location": "global", "key_ring": "tokenization-service-kr", "key_name": "cc-tokenization"
Implemente a função tokenize.
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 função transforma as informações do cartão de crédito num token.
Procure o valor do URL em
httpsTrigger
no resultado do comandogcloud functions deploy
. Armazene o valor do URL na variável de ambienteTOK_URL
:TOK_URL="TOK_URL"
Vai usar a variável de ambiente
TOK_URL
para chamar a funçãotokenize
.Implemente a função de anulação da tokenização no 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 função inverte o processo de tokenização.
Procure o valor do URL em
httpsTrigger
no resultado do comandogcloud functions deploy
. Armazene o valor do URL na variável de ambienteDETOK_URL
:DETOK_URL="DETOK_URL"
Vai usar a variável de ambiente
DETOK_URL
para chamar a função detokenize.Criou duas funções do Cloud Run separadas: uma para transformar o número do cartão num token e outra para reverter o processo. Os pontos de entrada diferentes direcionam a execução para a função de início adequada no ficheiro
index.js
.Quando as funções forem implementadas, abra a consola de funções do Cloud Run.
Verifique se as funções foram criadas. Se tudo correr bem, vê as duas funções com uma marca de verificação junto a cada uma.
Crie um token de autenticação
A opção no-allow-unauthenticated
no comando gcloud functions deploy
significa que um autor da chamada que invoca as funções tem de apresentar um token de autenticação para afirmar a identidade do autor da chamada. O autor da chamada tem de ter a autorização cloudfunctions.functions.invoke
. As seguintes funções predefinidas têm esta autorização: Cloud Functions Invoker, Cloud Functions Admin e Cloud Functions Developer.
Crie o token de autenticação:
AUTH_TOKEN=$(gcloud auth print-identity-token) echo $AUTH_TOKEN
Estes comandos geram uma string de token de autenticação, armazenam-na na variável de ambiente $AUTH_TOKEN
e, em seguida, apresentam o token. Mais tarde, chama as funções do Cloud Run que implementou com o token.
Chame o tokenizador
Crie alguns dados de amostra para transmitir ao tokenizador:
export TOK_CC=4000300020001000 export TOK_MM=11 export TOK_YYYY=2028 export TOK_UID=543210
Gere um token de autenticação conforme descrito na secção anterior e, de seguida, chame o 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
É apresentada a string de tokenização que representa os dados do cartão de crédito. Esta string foi armazenada na variável de ambiente
CC_TOK
. Pode obter as informações do cartão invocando o processo de anulação da tokenização.Inverta a tokenização com o seguinte 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"
O resultado tem um aspeto semelhante ao seguinte:
{"cc":"4000300020001000","mm":"11","yyyy":"2028","userid":"543210"}
Estes dados são os que foram originalmente enviados para o tokenizador, desencriptados e obtidos pela sua app.
Desenvolva este exemplo
O código de exemplo no GitHub é um excelente ponto de partida, mas há mais aspetos a considerar antes de passar para a produção.
Se optar por usar funções do Cloud Run para a tokenização de cartões de pagamento, pode ter de fazer mais trabalho para satisfazer o seu avaliador de segurança qualificado ou questionário de autoavaliação. Especificamente, as secções 1.2 e 1.3 da PCI DSS requerem controlos rigorosos sobre o tráfego recebido e enviado. As funções do Cloud Run e o App Engine não oferecem uma firewall configurável bidirecional. Por isso, tem de criar controlos compensatórios ou implementar o serviço de tokenização no Compute Engine ou no Google Kubernetes Engine. Se quiser explorar a contentorização, o código do GitHub é compatível com o Docker e contém documentação de apoio técnico.
Este código de exemplo também extrai as dependências do npm (gestor de pacotes do Node.js) na implementação. No seu ambiente de produção, fixe sempre as dependências a versões validadas específicas. Em seguida, agrupe estas versões com a própria app ou disponibilize-as a partir de uma localização privada e fidedigna. Qualquer uma das abordagens ajuda a evitar tempos de inatividade resultantes de uma indisponibilidade no repositório npm público ou de um ataque à cadeia de fornecimento que infeta pacotes que considerava seguros. Se criar previamente e agrupar a app completa, o tempo de implementação diminui normalmente, o que significa lançamentos mais rápidos e uma expansão mais fluida.
Limpar
Para evitar incorrer em custos na sua conta Google Cloud pelos recursos usados neste exemplo de implementação, pode eliminar o projeto que contém os 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.
O que se segue?
- Conformidade com a norma de segurança dos dados PCI.
- Utilizar o OAuth 2.0 para aceder às APIs Google.
- Requisitos da PCI DSS.
- Suplemento de informações de tokenização da PCI DSS.
- Para ver mais arquiteturas de referência, diagramas e práticas recomendadas, explore o Centro de arquitetura na nuvem.