O blog da AWS

Torne seus dados anônimos usando uma máquina de estado

Por Lesly Reyes, Telco Solutions Architect
e Maddyzeth Ariza, Data Architect

 

No desenvolvimento de software os clientes acostumam procurar terceiros para a implantação ou desenvolvimento de novas características de seus produtos, como um parceiro de desenvolvimento na nuvem ou serviços profissionais. No desenvolvimento de software é necessário provar a característica que está sendo desenvolvida utilizando dados de produção ofuscados, o que permite compartilhar dados sensíveis do cliente com estes terceiros externos à organização ou companhia.Os clientes tem sempre a capacidade de compartilhar seus dados de produção para testes de software na nuvem e o procedimento de compartilhar não é complicado. Porem, os clientes usam uma grande quantidade de recursos e tempo para mascarar os dados sigilosos que não querem compartilhar, comumente de maneira manual ou compartilham uma representação deficiente dos dados reais com o terceiro.

Seguindo com os estândares de segurança, para realizar provas em ambientes de desenvolvimento, não devem ser usados dados sigilosos, já é que isto é uma ameaça para a segurança dos clientes. Dito isto, nasce a importância de ter uma solução para processar automaticamente arquivos que contem dados sigilosos, esta é a solução a ser apresentada neste artigo. Nesta solução os dados sigilosos são substituídos por caracteres gerados de forma aleatória (sequencias de letras ou números). Os dados de saída mantêm o mesmo esquema da origem e também respeitam os valores nulos.

A solução é implementada usando AWS Step Functions, recebe como parâmetros a localização da pasta do arquivo no Amazon S3 que o cliente ou parceiro deseja proteger e atribui as colunas que o cliente selecionou como sigilosas e depois utiliza as funções de AWS Lambda para processar os campos em paralelo, substituindo os valores originais por caracteres aleatórios ou por um numero inteiro, segundo o valor.

Neste artigo, demonstraremos como usar o AWS Step Functions e AWS Lambda para substituir de forma automática os dados sigilosos do cliente, para serem usados em ambientes de desenvolvimento ou testar as novas características de um produto ou projeto.

Solução

As companhias independentes do seu tamanho, precisam de desenvolvimento de novos produtos ou projetos, estes novos produtos ou características não sempre podem ser desenvolvidas pelos times da empresa. Nestes casos contratam um parceiro ou empresa terceira para desenvolve-los. Para um adequado desenvolvimento de software é necessário contar com os dados de testes o mais próximo aos dados de produção (dados reais), é por isso que tornar os dados anônimos que serão compartilhados com terceiros resulta crucial. Esta solução é uma ferramenta que permite aos usuários transformar seus dados de forma automática utilizando maquina de estados.

A solução consiste de duas funções Lambda orquestradas por uma maquina de estados. Recebe parâmetros (que serão explicados na seguinte seção) que permitem identificar os arquivos ou carpetas que se tornaram anônimos.  A primeira função Lambda, chamada de masking-routing-event, tem como objetivo gerar um dicionário com cada um dos elementos que estão no parâmetro nomeado como “paths”. A segunda função Lambda, chamada de masking-execute-anonymization, realiza o mascaramento por coluna de dados sigilosos e gera um arquivo novo anônimo na rota de saída.

Nesta publicação, vemos como podemos usar uma maquina de estados da AWS para ajudar aos desenvolvedores e empresas a realizar desenvolvimentos de software de forma segura tornando anônimos os dados que serão compartilhados com terceiros ou fora da empresa.

Arquitetura

Para implantar a solução devemos utilizar a interface da Consola de AWS para executar um modelo de AWS CloudFormation com os recursos necessários. Para tornar anônimo os dados se utilizarão duas funções Lambda. A primeira, chamada masking-routing-event, vai gerar um dicionário com os arquivos e colunas que serão anonimizadas. Na sequencia com a segunda função Lambda, chamada masking-execute-data-anonymization, será realizada a ofuscação dos dados e será guardado o resultado num bucket de saída.

Para implantar a solução é necessário contar com: um bucket onde serão guardados os arquivos anonimizados, os roles e permissões para executar a maquina de estados. Usando uma função Lambda será gerado um dicionário com os arquivos. Logo por cada arquivo, a maquina de estado executara a segunda Lambda que vai cambiar os dados das colunas selecionadas por dados aleatórios. O resultado da maquina de estados é um arquivo com os dados ofuscados que será armazenado na localização de saída em Amazon S3.

Requisitos

Para começar a criar as copias de segurança se devem cumprir com os seguintes requisitos:

  • Conta de AWS
  • Usuário com acesso à Consola de AWS.
  • Bucket de Amazon S3 onde se armazenarão os arquivos a processar, o nome deste bucket deve ser incluso nos parâmetros no momento da implantação.

Nas seguintes seções demonstraremos como criar e instalar cada componente requerido no ambiente da nuvem de AWS.

Permissos

Para implantar o modelo de recursos envolvidos e inicializar a ofuscação dos dados é necessário contar com uma serie de politicas de IAM com as permissões suficientes. A continuação será listada as politicas:

  • Política para criação da pilha de CloudFormation: O usuário que fará a implantação do modelo de CloudFormation deve ter as seguintes permissões mínimas para criar os recursos:
{

  "Version": "2012-10-17",

  "Statement": [

    {

      "Effect": "Allow",

      "Action": [

        "sns:ListTopics",

        "iam:ListRoles"

      ],

      "Resource": [

        "*"

      ]

    },

    {

      "Effect": "Allow",

      "Action": [

        "cloudformation:ListStacks",

        "cloudformation:DescribeStackEvents",

        "cloudformation:CreateStack",

        "cloudformation:DescribeStacks",

        "cloudformation:DescribeStackResource",

        "cloudformation:CreateChangeSet",

        "cloudformation:DescribeChangeSet",

        "cloudformation:ExecuteChangeSet",

        "cloudformation:ValidateTemplate",

        "cloudformation:CreateUploadBucket",

        "cloudformation:GetTemplateSummary"

      ],

      "Resource": "*"

    },

    {

      "Effect": "Allow",

      "Action": [

        "cloudformation:DeleteStack",

        "cloudformation:UpdateStack"

      ],

      "Resource": [

        "arn:aws:cloudformation:REGION:ACCOUNT_ID:stack/*/*"

      ]

    },

    {

      "Effect": "Allow",

      "Action": [

        "lambda:CreateFunction",

        "lambda:PublishLayerVersion",

        "lambda:DeleteFunction",

        "lambda:GetFunction",

        "lambda:GetLayerVersion",

        "lambda:DeleteLayerVersion"

      ],

      "Resource": [

        "arn:aws:lambda:REGION:ACCOUNT_ID:layer:AWSDataWrangler-Python39*",

        "arn:aws:lambda:REGION:ACCOUNT_ID:function:masking-routing-event",

        "arn:aws:lambda:REGION:ACCOUNT_ID:function:masking-execute-data-anonymization"

      ]

    },

    {

      "Effect": "Allow",

      "Action": [

        "states:CreateStateMachine",

        "states:DeleteStateMachine",

        "states:DescribeStateMachine"

      ],

      "Resource": [

        "arn:aws:states:REGION:ACCOUNT_ID:stateMachine:masking-execute-data-processing-sm"

      ]

    },

    {

      "Effect": "Allow",

      "Action": [

        "s3:CreateBucket",

        "s3:PutObject",

        "s3:GetObject",

        "s3:ListBucket"

      ],

      "Resource": [

        "arn:aws:s3:::cf-templates*",

        "arn:aws:s3:::awsserverlessrepo-changesets*"

      ]

    },

    {

      "Effect": "Allow",

      "Action": [

        "serverlessrepo:CreateCloudFormationTemplate",

        "serverlessrepo:GetCloudFormationTemplate",

        "serverlessrepo:CreateCloudFormationChangeSet"

      ],

      "Resource": [

        "*"

      ]

    },

    {

      "Effect": "Allow",

      "Action": [

        "iam:GetRole",

        "iam:CreateRole",

        "iam:DeleteRole",

        "iam:DeleteRolePolicy",

        "iam:PutRolePolicy",

        "iam:GetRolePolicy",

        "iam:PassRole"

      ],

      "Resource": [

        "arn:aws:iam::ACCOUNT_ID:role/masking-routing-event-role",

        "arn:aws:iam::ACCOUNT_ID:role/masking-anonymization-event-role",

        "arn:aws:iam::ACCOUNT_ID:role/masking-execute-processing-sm-role"

      ]

    }

  ]

}
  • Política para iniciar a máquina de estados: O usuário que iniciará a máquina de estados encarregada de executar o processo de anonimização deve ter as seguintes permissões mínimas:
{

  "Version": "2012-10-17",

  "Statement": [

    {

      "Effect": "Allow",

      "Action": [

        "states:DescribeStateMachine",

        "states:StopExecution",

        "states:StartExecution",

        "states:ListExecutions",

        "states:DescribeExecution",

        "states:GetExecutionHistory",

        "states:DescribeStateMachineForExecution",

        "states:ListMapRuns",

        "states:DescribeMapRun",

        "states:UpdateMapRun",

        "states:ListStateMachineAliases",

        "states:DescribeStateMachineAlias",

        "states:ListStateMachineVersions"

      ],

      "Resource": [

        "arn:aws:states:REGION:ACCOUNT_ID:stateMachine:masking-execute-data-processing-sm",

        "arn:aws:states:REGION:ACCOUNT_ID:mapRun:masking-execute-data-processing-sm:*",

        "arn:aws:states:REGION:ACCOUNT_ID:execution:masking-execute-data-processing-sm:*"

      ]

    },

    {

      "Effect": "Allow",

      "Action": [

        "states:ListStateMachines"

      ],

      "Resource": [

        "*"

      ]

    }

  ]

}

Parâmetros

Os parâmetros estão dentro do modelo de CloudFormation e são os requeridos para a implantação da solução. Estes são detalhados a continuação:

  • masking_columns: Lista de nomes das colunas com dados sigilosos para mascarar.
  • path: Rota de S3 onde estão os arquivos a mascarar; devem pertencer ao mesmo formato.
  • paths: (Opcional) Se o parâmetro path não está presente, pode ser substituído por este. Lista de rotas individuais de cada um dos arquivos a mascarar
  • path_output: (Opcional) Rota onde será armazenado o arquivo processado. Por defeito, a mesma rota que o arquivo original, cria-se uma carpeta chamada masked onde se armazenam os arquivos processados.
  • sep: (Opcional) Delimitador com o qual o arquivo original é lido. Por defeito usa-se “,”.
  • encoding: (Opcional) Método de codificação para ler e escrever o arquivo. Predeterminada: utf-8.
  • dtype: (Opcional) Tipo de dado para as colunas do arquivo a processar. Predeterminado: objeto.
  • compression: (Opcional) Método de compressão de arquivos. Predeterminado: sem compressão.

Solução detalhada

Na solução será implantado recursos como roles de IAM, uma função Lambda para tornar os dados anônimos, entre outros que serão criados de forma automática utilizando o modelo de serviços de CloudFormation. As permissões necessárias foram listadas na seção anterior. Os recursos que serão lançados na conta são os seguintes:

  • AWSDataWrangler-Python39: Capa de Lambda que empacota as bibliotecas de AWS Data Wrangler utilizadas pela função Lambda de anonimização.
  • masking-routing-event: É a função Lambda que gera um dicionário com cada um dos elementos que estão na rota que se foi entregue nos parâmetros.
  • masking-execute-data-anonymization: É a função Lambda que toma a coluna a ofuscar e cambia os dados reais pelos dados random respeitando os nulos. Após cambiar as colunas, armazena elas na pasta de destino dentro do bucket de saída.
  • masking-execute-data-processing-sm: É a maquina de estados que executa as duas funções Lambda. A função “masking-routing-event” será executada somente uma única vez. A segunda função Lambda será executada uma vez por cada elemento do dicionário que gerou a função Lambda anterior.

A continuação será descrita os passos para implementar a solução:

  1. Descarregue o modelo de AWS CloudFormation usada para esta solução.
  2. Abra a Consola de AWS, navegue até o serviço AWS CloudFormation, selecione Criar Pilha com novos recursos, selecione Fazer upload de um arquivo de modelo, selecione o arquivo yaml e dê clique em Próximo, como se mostra na seguinte imagem.
  3. Agregue um nome para a pilha, como data-anonymization-stack, e adicione os outros campos com os valores necessários; o nome do bucket de Amazon S3 onde estão seus arquivos é mandatório, e se estes arquivos estão criptografados com uma chave KMS, também deve-se adicionar o ID da chave. O bucket de saída só é necessário no caso de que queira guardar os resultados num bucket diferente, caso contrario, não é mandatório. Logo selecione Seguinte duas vezes deixando o resto de configurações com seus valores por defeito.
  4. Uma vez na seção de revisão de CloudFormation (como se vê na seguinte imagem), selecione os campos de verificação para reconhecer que podem ser criados alguns recursos de IAM e faça clique na opção de Enviar.
  5. Uma vez completada com sucesso a criação da pilha no CloudFormation, se poderá ver os recursos implantados. Na máquina de estados de Step Functions selecionando o ARN do recurso criado.
  6. Na máquina de estados, selecione Iniciar execução e inclua os parâmetros correspondentes para iniciar a anonimização nos dados previamente armazenados no Amazon S3.
  7. A máquina de estado finaliza as iterações por cada um dos arquivos encontrados na localização de origem. A máquina de estados terá terminado com um estado exitoso. Poderá ver os arquivos resultantes processados na localização de saída.

Os arquivos manterão o mesmo nome e formato do arquivo origem, e os campo especificados como sensíveis (sigilosos), estarão anonimizados com uma sequencias de caracteres do mesmo formato e tamanho do dado original.

Limpeza

Para evitar cobranças continuas por recursos, elimine os recursos criados como parte desta configuração:

  • Navegue até a Consola de AWS CloudFormation e elimine a pilha criada (data-anonymization-stack). Isto também vai eliminar a pilha aninhada criada para a capa de AWS Data Wrangler.

Conclusão

Nesta publicação demostramos que com a ajuda dos serviços de AWS Lambda e Amazon S3 é possível automatizar a anonimização dos dados em minutos. Os Step Functions é capaz de realizar a substituição dos dados em segundos de forma automática, substituindo as colunas sensíveis (sigilosas) por caracteres aleatórios. Se você deseja se aprofundar mais no mascaramento de dados sensíveis ou como proteger seus dados, este artigo lhe proporcionará mais informação, além disso, você pode seguir aprendendo através da consulta dos blogs de AWS.

Pode testar a implantação desta solução na região US-WEST (Oregon). Para obter mais informação sobre como funcionam os Step Functions e maquinas de estados, consulte a página de AWS Lambda.

 

Este artigo foi traduzido do Blog da AWS em Espanhol.


Sobre os autores

Lesly Reyes é Arquiteta de Soluções na Amazon Web Services para a vertical de telecomunicações com experiencia em AI/ML.

 

 

 

 

Maddyzeth Ariza é Arquiteta de dados de Serviços Profissionais na Amazon Web Services, com experiencia em datalake, governança de dados e serviços de analytics.

 

 

 

 

Tradutor

Marlon Fuentes é Arquiteto de Soluções na Amazon Web Services, com foco na criação de ofertas para escalar vendas.