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

Last reviewed 2023-05-05 UTC

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: Identity and Access Management (IAM) e Cloud Key Management Service (KMS).

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 chave do Google Cloud. O Cloud KMS hospeda as chaves de criptografia, roteia-as regularmente e criptografa ou descriptografa os dados da conta armazenados.

O 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 para executar o tokenizador.

A figura a seguir ilustra a arquitetura do aplicativo de tokenização que você cria neste tutorial.

arquitetura de aplicativo de tokenização

Objetivos

  • Crie uma conta de serviço
  • Configure o Cloud KMS.
  • Crie duas Funções do Cloud.
  • Crie um token de autenticação.
  • Chame o tokenizador.

Custos

Neste documento, você usará os seguintes componentes faturáveis do Google Cloud:

Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços. Novos usuários do Google Cloud podem estar qualificados para uma avaliação gratuita.

Antes de começar

  1. No console do Google Cloud, acesse a página do seletor de projetos.

    Acessar o seletor de projetos

  2. Para começar a criar um projeto do Google Cloud, clique em Criar projeto.

  3. Escolha o nome do projeto. Anote o código do projeto gerado.

  4. Edite os outros campos conforme necessário.

  5. Para criar o projeto, clique em Criar.

  6. Verifique se a cobrança está ativada para o seu projeto do Google Cloud.

  7. Ative as APIs Cloud Build, Cloud Functions, and Cloud KMS.

    Ative as APIs

Ao concluir as tarefas descritas neste documento, é possível evitar o faturamento contínuo excluindo os recursos criados. Saiba mais em Limpeza.

Criar a conta de serviço

A conta de serviço do ambiente de execução padrão do Cloud Functions tem o papel de editor, que permite acesso amplo a muitos serviços do Google Cloud. Embora essa seja a maneira mais rápida de desenvolver funções, o Google recomenda usar a conta de serviço padrão somente para teste e desenvolvimento. Você 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:

  1. No Console do Google Cloud, acesse a página Contas de serviço.

    Acessar a página "Contas de serviço"

  2. Selecione o projeto.

  3. Clique em Criar conta de serviço.

  4. No campo Nome da conta de serviço, insira Tokenization Service User. O Console do Google Cloud preenche o campo ID da conta de serviço com base nesse nome.

  5. Opcional: preencha o campo Descrição da conta de serviço.

  6. Clique em Criar e continuar.

  7. Clique em Selecionar um papel e selecione Criptografador/Descriptografador do Cloud KMS CryptoKey.

  8. Para concluir a criação da conta de serviço, clique em Concluído.

    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_ID.iam.gserviceaccount.com

Configurar o Cloud KMS

  1. No Console do Google Cloud, abra o Gerenciamento de chaves.

    Acessar a página "Chaves criptográficas"

  2. Clique em **+ Criar keyring **. Na caixa de diálogo exibida, faça o seguinte:

    1. Nomeie o keyring como tokenization-service-kr.
    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. Nomeie a chave como cc-tokenization.
    2. Em 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

Criar Cloud Functions

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 Google Cloud CLI.

  1. No Console do Google Cloud, 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. Aplique a configuração do KMS. Copie o arquivo do modelo de configuração e abra-o para edição:

    cp config/default.json config/local.json
    nano config/local.json
    

    No ambiente de execução do Node.js, é necessário definir explicitamente o ID do projeto do Google Cloud:

    "project_id":              "YOUR_PROJECT_ID"
  4. Encontre a configuração do KMS e aplique os valores do KMS criados na seção anterior:

    "location":                "global",
    "key_ring":                "tokenization-service-kr",
    "key_name":                "cc-tokenization"
    
  5. Implante a função de tokenização.

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

    Essa função transforma as informações do cartão de crédito em um token.

  6. Procure o valor do URL em httpsTrigger na saída do comando gcloud functions deploy. Armazene o valor do URL na variável de ambiente TOK_URL:

    TOK_URL="TOK_URL"

    Use a variável de ambiente TOK_URL para chamar a função tokenize.

  7. Implante a função de detokenizaçã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=.
    

    Essa função reverte o processo de tokenização.

  8. Procure o valor do URL em httpsTrigger na saída do comando gcloud functions deploy. Armazene o valor do URL na variável de ambiente DETOK_URL:

    DETOK_URL="DETOK_URL"

    Use a variável de ambiente DETOK_URL para chamar a função de detokenização.

    Você criou 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 no arquivo index.js.

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

    Abrir o console do Cloud Functions

  10. 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 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 precisa apresentar um token de autenticação para declarar a identidade do autor da chamada. O autor da chamada precisa ter a permissão cloudfunctions.functions.invoke. Os seguintes papéis predefinidos têm essa permissão: invocador do Cloud Functions, administrador do Cloud Functions e desenvolvedor do Cloud Functions.

  • Crie o token de autenticação:

    AUTH_TOKEN=$(gcloud auth print-identity-token)
    echo $AUTH_TOKEN
    

Esses comandos geram uma string de token de autenticação, armazenam-na na variável de ambiente $AUTH_TOKEN e exibem o token. Posteriormente, você chamará o Cloud Functions implantado com o token.

Chamar o tokenizador

  1. 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
    
  2. Gere um token de autenticação conforme descrito na seção anterior e 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
    

    A string de tokenização que representa os dados do cartão de crédito é exibida. Essa string foi armazenada na variável de ambiente CC_TOK. É possível recuperar as informações do cartão invocando o detokenizador.

  3. Reverta a tokenização com o comando a seguir.

    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"
    

    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.

Expandir neste 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ê 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.

Limpeza

Para limpar os recursos individuais usados neste tutorial, exclua o projeto.

  1. No Console do Google Cloud, acesse a página Gerenciar recursos.

    Acessar "Gerenciar recursos"

  2. Na lista de projetos, selecione o projeto que você quer excluir e clique em Excluir .
  3. Na caixa de diálogo, digite o ID do projeto e clique em Encerrar para excluí-lo.

A seguir