Tokenização de dados confidenciais do titular do cartão para PCI DSS

Neste tutorial, mostramos como configurar um serviço de tokenização de cartão de crédito e débito controlado por acesso no Cloud Functions. Para configurar o serviço, o artigo usa estes serviços do Google Cloud Platform (GCP): Cloud Identity and Access Management (IAM), Cloud Key Management Service (KMS) e Cloud Firestore no modo Datastore.

A tokenização é o processo de substituir um valor benigno de marcador, ou token, por informações confidenciais, como dados de cartão de crédito. A parte 3 do Padrão de Segurança de Dados do Setor de Cartões de Pagamento (PCI DSS, na sigla em inglês) exige que a maioria dos dados armazenados em um cartão de crédito seja tratada como informações confidenciais.

Um token em si não faz sentido, exceto como um meio de pesquisar dados tokenizados em um contexto específico. No entanto, você ainda precisa garantir que seus tokens não contenham nenhuma informação específica do usuário e que eles não sejam diretamente decodificáveis. Dessa forma, se você perder o controle sobre os tokens de cartão de pagamento de seus clientes, ninguém poderá usar os tokens para comprometer os dados do titular do cartão.

Um serviço para lidar com informações confidenciais

Você tem muitas opções para a plataforma ou o serviço hospedar seu ambiente de dados do titular do cartão (CDE, na sigla em inglês). Neste tutorial, você receberá orientações sobre o processo de implantação de uma amostra usando o Cloud Functions e os próximos passos em direção a uma solução pronta para produção.

O Cloud Functions é uma plataforma sem servidor que hospeda e executa código, além de ser um local conveniente para iniciar rapidamente um aplicativo que é escalonável sem intervenção. Lembre-se de que, em um CDE compatível com PCI DSS, você precisa limitar todo o tráfego de entrada e saída para conexões autorizadas. No momento, esses controles refinados não estão disponíveis para o Cloud Functions. Portanto, é preciso implementar controles de compensação em outro lugar (como em seu aplicativo) ou escolher uma plataforma diferente. O mesmo serviço de tokenização pode ser executado de forma contentorizada, como um grupo de instâncias gerenciadas de escalonamento automático ou um cluster do Kubernetes. Esses seriam ambientes de produção preferíveis com seus controles de rede VPC completos.

O Cloud KMS é o serviço de gerenciamento de segredo do GCP. O Cloud KMS hospeda as chaves de criptografia, roteia-as regularmente e criptografa ou descriptografa os dados da conta armazenados. O Cloud Firestore armazena os dados tokenizados.

O Cloud IAM é usado neste tutorial para fornecer controles rígidos sobre todos os recursos usados no serviço de tokenização. Você precisa de uma conta de serviço especial com tokens que expiram com frequência para conceder acesso ao Cloud KMS e ao Cloud Firestore e para executar o tokenizador.

A figura a seguir ilustra a arquitetura do aplicativo de tokenização.

arquitetura de aplicativo de tokenização

Modos do Cloud Firestore

O Cloud Firestore é a próxima grande versão do Cloud Datastore. O Cloud Firestore pode ser executado no Datastore, que usa a mesma API do Cloud Datastore e é redimensionado para milhões de gravações por segundo ou no modo nativo, que usa uma API diferente para aplicativos móveis e da Web.

Para concluir este tutorial, recomendamos o uso do Cloud Firestore no modo Datastore. O tutorial não oferece suporte ao Cloud Firestore no modo nativo.

Se você tiver ativado o Cloud Datastore em seu projeto do GCP, será possível usar o Cloud Datastore. No entanto, o restante deste tutorial pressupõe que você esteja usando o Cloud Firestore no modo Datastore.

Se precisar de ajuda para decidir qual modo do Cloud Firestore usar em seu próprio aplicativo, consulte nosso guia para escolher entre o modo nativo e o modo Datastore.

Objetivos

  • Selecione um serviço e modo de banco de dados.
  • Crie uma conta de serviço.
  • Configure o Cloud KMS.
  • Escolha uma região de armazenamento.
  • Crie duas Funções do Cloud.

Custos

Neste tutorial, usamos os seguintes componentes faturáveis do Google Cloud Platform:

Use a calculadora de preços para gerar uma estimativa de custo com base no uso do projeto. Novos usuários do GCP são qualificados para uma avaliação gratuita.

Antes de começar

  1. Selecione ou crie um projeto do Google Cloud Platform.

    Acessar a página Gerenciar recursos

  2. Neste tutorial, seu projeto é chamado de [YOUR_PROJECT].
  3. Verifique se o faturamento foi ativado no projeto do Google Cloud Platform.

    Saiba como ativar o faturamento

  4. Ativar Cloud Functions e Cloud KMS APIs.

    Ativar as APIs

  5. Selecione o modo Datastore para o Cloud Firestore.
    Selecionar o modo Datastore

Ao concluir este tutorial, exclua os recursos criados para evitar o faturamento contínuo. Para mais informações, consulte Como fazer a limpeza.

Como criar a conta de serviço

  1. No Console do GCP, abra a página Contas de serviço do IAM.

    ACESSAR A página "Contas de serviço"

  2. Clique em + Criar conta de serviço. Na caixa de diálogo exibida, execute as ações a seguir:

    1. Dê o nome Tokenization Service User à conta.

      O código padrão tokenization-service-user é gerado com base na sua entrada.

    2. Clique em Criar.

    3. Conceda os papéis predefinidos Criptografador/Descriptografador do Cloud KMS CryptoKey e Usuário do Cloud Datastore.

    4. Clique em Continuar.

    5. Clique em Criar chave, selecione o formato JSON e clique em Criar.

      Depois de clicar em Criar, um arquivo JSON é transferido automaticamente.

    6. Mova o arquivo JSON para um local seguro. Trate-o com cuidado porque ele concede acesso eficiente à sua conta do GCP, e essa é a única vez em que é possível recuperar esse conjunto de chaves.

    Agora você tem um usuário da conta de serviço com o endereço de e-mail a seguir:

    tokenization-service-user@[YOUR_PROJECT].iam.gserviceaccount.com

Como configurar o Cloud KMS

  1. No Console do GCP, abra Chaves criptográficas.

    Acessar a página "Chaves criptográficas"

  2. Clique em + Criar keyring. Na caixa de diálogo exibida, execute as ações a seguir:

    1. Dê o nome tokenization-service-kr ao keyring.
    2. Para Localização do keyring, selecione Global. Essa é uma escolha comum que é suficiente para este tutorial. No entanto, antes de tomar decisões relacionadas à arquitetura de produção, compreenda as diferenças entre os vários locais do Cloud KMS.
    3. Verifique cuidadosamente suas opções porque não é possível excluir ou renomear os keyrings depois de criá-los.
    4. Clique em Criar.

      Como criar um keyring

    O sistema cria o keyring e encaminha você para a página de criação de chaves.

  3. Na caixa de diálogo Criar chave, execute as ações a seguir:

    1. Dê o nome cc-tokenization à chave.
    2. Para Finalidade, selecione Symmetric encrypt/decrypt.
    3. Defina o período de rotação como um valor escolhido e clique em Criar.

    Como rastrear informações sobre suas chaves

Como criar Funções do Cloud

Este tutorial pressupõe que você estará usando o Cloud Shell. Se você usa um terminal diferente, verifique se tem a versão mais recente da ferramenta de linha de comando gcloud.

  1. No Console do GCP, abra o Cloud Shell:

    Acessar o Cloud Shell

  2. 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 arquivo index.js, que é a fonte de duas Funções do Cloud diferentes que você criará. Ela também contém o package.json, que informa às Funções do Cloud quais pacotes devem ser executados.

  3. Implante as duas Funções do Cloud:

    gcloud functions deploy tokenize --runtime=nodejs8 --trigger-http --entry-point=tokenize --memory=256MB --source=.
    gcloud functions deploy detokenize --runtime=nodejs8 --trigger-http --entry-point=detokenize --memory=256MB --source=.
    

    Esses comandos criam duas Funções do Cloud separadas: uma para transformar o número do cartão em um token e outra para reverter o processo. Os diferentes pontos de entrada direcionam a execução para a função inicial apropriada em index.js.

  4. Observe o URL httpsTrigger na saída de cada comando. Você precisa desses URLs para chamar as funções.

  5. Quando as funções forem implantadas, abra o console do Cloud Functions.

    Abrir o console do Cloud Functions

  6. Verifique se as funções foram criadas. Se tudo correr bem, você verá suas duas funções com uma marca de seleção ao lado de cada uma.

    Como verificar se suas Funções do Cloud foram criadas

Criar tokens de autenticação

Você executa todas as Funções do Cloud como um único usuário de conta de serviço. Se quiser ter mais controle sobre o que uma determinada Função do Cloud pode fazer, crie regras no próprio código. O código implantado nos passos anteriores exige um token de autorização OAuth2, chamado de auth_token neste documento, que foi gerado em nome da conta de serviço especial que você criou: tokenization-service-user@[YOUR_PROJECT].iam.gserviceaccount.com.

Existem muitas maneiras de gerar um auth_token que vão além do escopo deste tutorial. Uma ferramenta de desenvolvimento e teste chamada getToken.js pode ajudar você no restante deste tutorial. É possível encontrar getToken.js na pasta src do repositório do GitHub.

Antes de poder usar o gerador auth_token, é preciso fornecer credenciais de conta de serviço.

  1. Abra o arquivo JSON contendo as credenciais da conta de serviço que você baixou e copie todo o conteúdo para a área de transferência, certificando-se de não truncar os dados.
  2. No Cloud Shell, crie e abra um arquivo de token de autenticação:

    nano ~/.tokenization-service-user.json
  3. Cole o conteúdo do arquivo JSON.

  4. Pressione Control+O, Enter e depois Control+X para salvar e sair do editor.

  5. Se estiver executando esse processo fora do Cloud Shell, defina a variável de ambiente GOOGLE_CLOUD_PROJECT:

    export GOOGLE_CLOUD_PROJECT=[YOUR_PROJECT]
  6. Gere uma amostra de auth_token:

    npm install
    AUTH_TOKEN=$(GOOGLE_APPLICATION_CREDENTIALS=~/.tokenization-service-user.json node src/getToken.js)
    echo $AUTH_TOKEN
    

    Esses comandos geram uma string auth_token e a armazenam na variável de ambiente $AUTH_TOKEN. Para sua conveniência, o auth_token também é exibido. A partir daqui, é possível usar esse auth_token para chamar seu serviço de tokenização.

Chamar o tokenizador

  1. Abra o console do Cloud Functions.

    Abrir o console do Cloud Functions

  2. Clique na sua função.

  3. Alterne para a guia Acionador e copie o URL, caso ainda não o tenha feito. Use o URL do acionador no lugar de {CF_URL} nos passos a seguir.

    Como copiar o URL da Função do Cloud

  4. No seu shell, salve o URL do acionador em uma variável de ambiente:

    export TOK_URL="{CF_URL}"
  5. Crie alguns dados de amostra para passar para o tokenizador:

    export TOK_CC=4000300020001000
    export TOK_MM=11
    export TOK_YYYY=2028
    export TOK_UID=543210
    
  6. Gere um auth_token conforme descrito na seção anterior e chame o tokenizador:

    CC_TOKEN=$(curl -s -X POST "$TOK_URL" -H "Content-Type:application/json" --data '{"auth_token":"'$AUTH_TOKEN'", "cc": "'$TOK_CC'", "mm": "'$TOK_MM'", "yyyy": "'$TOK_YYYY'", "userid": "'$TOK_UID'"}') ; echo $CC_TOKEN
    

    Se este passo funcionar, será exibida uma string alfanumérica de 64 caracteres. Essa string foi armazenada na variável de ambiente CC_TOK. É possível recuperar as informações do cartão invocando o detokenizador.

  7. Para reverter o processo de tokenização, primeiro recupere o URL para a função de detokenização da mesma forma que você o recuperou para a tokenização.

  8. Para detokenizar, execute o comando a seguir, substituindo {CF2_URL} pelo URL do acionador:

    export DETOK_URL="{CF2_URL}"
    curl -s -X POST "$DETOK_URL" -H "Content-Type:application/json" --data '{"auth_token":"'$AUTH_TOKEN'", "cc_token": "'$CC_TOKEN'"}'
    

    A saída tem uma aparência semelhante à seguinte:

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

    Esses dados foram originalmente enviados para o tokenizador, descriptografados e recuperados pelo seu aplicativo.

Verificar os dados

  1. Abra o console do Cloud Datastore. Esse console também oferece suporte ao Cloud Firestore no modo Datastore.

    Abrir o console do Cloud Datastore

  2. Se você não vir nenhum registro, defina Tipo como cc e Namespace como tokenizer.

Os dados que você vê são os dados de token com um cartão de pagamento criptografado no campo de criptografia. A captura de tela a seguir não mostra o campo de criptografia.

Cartões de pagamento tokenizados com êxito. O campo de criptografia não é exibido.

Como expandir este tutorial

O código de exemplo no GitHub é um excelente começo, mas há mais a considerar antes de passar para a produção.

Se você for iniciante na geração e atualização de tokens de acesso, gerar um token OAuth para cada solicitação adicionará chamadas de API desnecessárias e poderá tornar seu serviço mais lento e esgotar as cotas de autenticação.

Se você optar por usar o Cloud Functions para a tokenização do cartão de pagamento, talvez seja necessário trabalhar mais para satisfazer seu assessor de segurança qualificado ou o questionário de autoavaliação. Especificamente, as seções 1.2 e 1.3 do PCI DSS exigem controles rígidos sobre o tráfego de entrada e de saída. O Cloud Functions e o Google App Engine não oferecem um firewall configurável de duas vias, portanto, é preciso criar controles de compensação ou implantar o serviço de tokenização no Compute Engine ou no Google Kubernetes Engine. Se você quiser explorar a contentorização, o código do GitHub é compatível com o Docker e contém documentação de suporte.

Esse código de amostra também extrai as dependências do npm (gerenciador de pacotes Node.js) na implantação. Em seu ambiente de produção, sempre fixe as dependências em versões específicas selecionadas. Em seguida, agrupe essas versões com o próprio aplicativo ou exiba-as em um local particular e confiável. Qualquer abordagem ajuda a evitar a inatividade resultante de uma indisponibilidade no repositório npm público ou de um ataque à cadeia de suprimentos que infecta pacotes que eram considerados seguros. Se você pré-criar e agrupar o aplicativo completo, seu tempo de implantação normalmente diminuirá, o que significa lançamentos mais rápidos e escalonamento mais suave.

Como fazer a limpeza

Para limpar os recursos individuais usados neste tutorial, execute as ações a seguir:

  1. Abra o console do Cloud Datastore.

    Abrir o console do Cloud Datastore

  2. Selecione todos os registros que você criou e clique em Excluir.

  3. Abra o console do Cloud Functions.

    Abrir o console do Cloud Functions

  4. Selecione as funções que você criou e clique em Excluir.

  5. Abra o console do Cloud IAM.

    Abrir o console do Cloud IAM

  6. Selecione a conta de serviço chamada tokenization-service-user@[YOUR_PROJECT].iam.gserviceaccount.com e clique em Remover.

  7. Na página Chaves criptográficas do IAM, abra o keyring tokenization-service-kr. Exclua a chave cc-tokenization.

  8. No console do Cloud Storage, exclua o intervalo chamado staging.[YOUR_PROJECT].appspot.com.

Ou, se você criou um projeto apenas para este tutorial, pode excluir todo o projeto.

  1. No Console do GCP, acesse a página "Projetos".

    Acessar a página Projetos

  2. Na lista de projetos, selecione um e clique em Excluir projeto.
  3. Na caixa de diálogo, digite o código do projeto e clique em Encerrar para excluí-lo.

A seguir

Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…