Blog de Amazon Web Services (AWS)

Anonimice sus datos usando una máquina de estados

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

 

En el desarrollo de software los clientes suelen buscar apoyo para el despliegue o desarrollo de nuevas características de sus productores en un tercero como un partner de desarrollo en la nube o servicios profesionales. En el desarrollo de software es necesario probar la característica que se está desarrollando utilizando datos de producción ofuscados, lo que implica compartir con un externo a la organización o compañía del cliente datos sensibles.Los clientes siempre tienen la capacidad de compartir datos de producción para pruebas de software en la nube de AWS y el procedimiento de compartir no es difícil. Sin embargo, los clientes utilizan una gran cantidad de recursos y tiempo en enmascarar los datos confidenciales que no quieren compartir, comúnmente de manera manual o comparten una representación deficiente de los datos reales con el tercero.Siguiendo los estándares de seguridad, para realizar pruebas en entornos de desarrollo, no se deben utilizar datos confidenciales, ya que es una amenaza para la seguridad de los clientes. Dado lo anterior, nace la importancia de tener una solución para procesar automáticamente archivos que contienen datos confidenciales, esta es la solución presentada en este artículo. En esta solución los datos confidenciales se sustituyen por caracteres generados aleatoriamente (cadenas o números). Los datos de salida mantienen el mismo esquema del original y también respetan los valores nulos.

La solución se implementa utilizando AWS Step Functions, recibe como parámetros la ubicación de la carpeta o archivo en Amazon S3 que el cliente o el socio desea proteger y asigna las columnas que el cliente seleccionó como confidenciales y luego utiliza las funciones de AWS Lambda para procesar los campos en paralelo, reemplazando los valores originales por un carácter aleatorio o un número entero según el valor.

En este artículo, demostramos cómo usar AWS Step Functions y AWS Lambda para sustituir de forma automática los datos confidenciales de clientes, para ser usados en entornos de desarrollo para probar nuevas características de un proyecto.

Solución

Las compañías independiente de su tamaño, requieren el desarrollo de nuevos productos o proyectos, estos nuevos productos o características no siempre pueden ser desarrolladas por el equipo de la empresa, por lo que se contratan usualmente partner o empresas de terceros para que las desarrollen. Para un adecuado desarrollo de software es necesario contar con datos de prueba lo más parecidos a los datos que se usarán en producción, es por esto que anonimizar los datos que se comparten con terceras partes resulta crucial. Esta solución es una herramienta que permite a los usuarios automatizar sus datos de forma automática utilizando una máquina de estados.

La solución consta de dos funciones Lambda orquestadas por una máquina de estado. Recibe parámetros (explicados en la siguiente sección) que permiten identificar los archivos o carpetas que serán anomizados. La primera función Lambda llamada masking-routing-event tiene como objetivo generar un diccionario con cada uno de los elementos que se encuentran en el parámetro denominado «paths». La segunda función Lambda llamada masking-execute-anonymization realiza el enmascaramiento por columna de datos sensibles y genera un archivo nuevo anonimizado en la ruta de salida.

En esta publicación, vemos cómo podemos usar una máquina de estados de AWS para ayudar a los desarrolladores y empresas a realizar desarrollos de software de forma seguro anonimizando los datos que serán compartidos.

Arquitectura

Para desplegar la solución debemos utilizar la interfaz de consola de AWS para desplegar una plantilla de AWS CloudFormation con los recursos necesarios. Para la anonimización se utilizarán dos funciones lambda. La primera llamada masking-routing-event generará un diccionario con los archivos y columnas que serán anonimizadas. Luego con la segunda función lambda llamada masking-execute-data-anonymization se realizará la ofuscación de los datos y se guardará el resultado en el bucket de salida.

Para desplegar la solución es necesario contar con: el bucket donde se guardará los archivos anonimizados, los roles y permisos para ejecutar la máquina de estados. Utilizando una función lambda se generará un diccionario con los archivos. Luego por cada archivo la máquina de estado ejecutará la segunda lambda que cambiará los datos de las columnas seleccionadas por datos aleatorios. El resultado de la máquina de estados es un archivo con los datos ofuscados y se almacenará en la localización de salida en Amazon S3.

Requisitos

Para comenzar a crear las copias de seguridad se deben cumplir con los siguientes requisitos.

  • Cuenta de AWS
  • Usuario con acceso a la consola de AWS.
  • Bucket de Amazon S3 donde se almacenarán los archivos a procesar, el nombre de este bucket debe incluirse en los parámetros en el momento del despliegue.

En las siguientes secciones se demostrará como crear e instalar cada componente requerido en el ambiente de la nube de AWS.

Permisos

Para desplegar la plantilla con los recursos involucrados e inicializar la ofuscación de los datos es necesario contar con una serie de políticas de IAM con los permisos suficientes. A continuación se listan las políticas.

  • Política para creación de la pila de CloudFormation: El usuario que hará el despliegue de la plantilla de CloudFormation debe tener los siguientes permisos mínimos para crear los 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 la máquina de estados: El usuario que iniciará la máquina de estados encargada de ejecutar el proceso de anonimización debe tener los siguientes permisos mínimos:
{

  "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

Los parámetros se encuentran dentro del template de CloudFormation y son los requeridos para el despliegue de la solución.  Son los que se detallan a continuación.

  • masking_columns: lista de nombres de columnas con datos confidenciales para enmascarar.
  • path: ruta de S3 donde se encuentran los archivos a enmascarar; deben pertenecer al mismo formato.
  • paths: (Opcional) Si el parámetro path no está presente, puede ser reemplazado por este. Lista de rutas individuales de cada uno de los archivos a enmascarar
  • path_output: (Opcional) Ruta donde se guardará el archivo procesado. Por defecto, la misma ruta que el archivo original, se crea una carpeta llamada masked donde se almacenan los archivos procesados.
  • sep: (Opcional) Delimitador con el que se lee el archivo original. Por defecto se usa «,» .
  • encoding: (Opcional) Método de codificación para leer y escribir el archivo. Predeterminada: utf-8
  • dtype: (Opcional) Tipo de datos para las columnas del archivo a procesar. Predeterminado: objecto
  • compression: (Opcional) Método de compresión de archivos. Predeterminado: sin compresión.

Solución detallada

En la solución se desplegarán recursos como roles de IAM, una función Lambda para realizar la anonimizarán los datos, entre otros que se crearán de forma automática utilizando la plantilla del servicio de CloudFormation. Los permisos necesarios fueron listados en la sección anterior. Los recursos que se lanzarán en la cuenta son los siguientes:

  • AWSDataWrangler-Python39: Capa de Lambda que empaqueta las bibliotecas de aws data Wrangler utilizadas por la función de Lambda de anonimización.
  • masking-routing-event: Es la función Lambda que generá un diccionario con cada uno de los elementos que encuentra en la ruta que se les entregó en los parámetros.
  • masking-execute-data-anonymization: Es la función Lambda toma la columna a ofuscar y cambia los datos reales por datos random respetando los nulos. Luego de cambiar las columnas las guarda en la carpeta de destino dentro de la cubeta de salida.
  • masking-execute-data-processing-sm: es la máquina de estados que ejecuta las dos funciones lambdas. La función “masking-routing-event” se ejecutará solo una vez. La segunda función Lambda se ejecutará una vez por cada elemento del diccionario que generó la función Lambda anterior.

A continuación, se describen los pasos para implementar la solución.

  1. Descargue la plantilla de AWS CloudFormation usada para esta solución.
  2. Abra la consola de AWS, navegue al servicio AWS CloudFormation, seleccione Crear pila con recursos nuevos, seleccione cargar un archivo de plantilla, seleccione el archivo yaml y dé clic en Siguiente, como se muestra en la siguiente imagen.
  3. Añada un nombre para la pila, como data-anonymization-stack, y adicione los otros campos con los valores necesarios; el nombre del bucket de S3 donde se encuentran sus archivos en crudo es mandatorio, y si estos archivos están encriptados con una llave KMS, también debe añadir el ID de la llave. El bucket de salida solo es necesario en caso de que quiera guardar los resultados en un bucket diferente, de lo contrario, no es mandatorio. Luego seleccione Siguiente dos veces dejando el resto de configuraciones com sus valores por defecto.
  4. Una vez en la sección de revisión de CloudFormation (como se ve en la siguiente imagen), seleccione las casillas de verificación para reconocer que se pueden crear algunos recursos de IAM y haga clic en Enviar.
  5. Una vez se haya completado la creación de la pila en CloudFormation exitosamente, se podrán ver los recursos desplegados. Vaya a la máquina de estados de Step Functions seleccionando en arn del recurso creado.
  6. En la máquina de estados, seleccione Iniciar ejecución y añada los parámetros correspondientes para iniciar la anonimización en los datos previamente almacenados en su ubicación de S3.
  7. La máquina de estado finaliza las iteraciones por cada uno de los archivos encontrados en la ubicación de fuente. La máquina de estados habrá terminado con un estado exitoso. Podrá ver los archivos resultantes procesados en la ubicación de salida.

Los archivos conservarán el mismo nombre y formato del archivo de origen, y los campos especificados como sensibles estarán anonimizados con una cadena del mismo formato y largo del dato original.

Limpieza

Para evitar cargos continuos por recursos, elimine los recursos creados como parte de esta configuración:

  • Navegue a la consola de AWS CloudFormation y elimine la pila creada (data-anonymization-stack). Esto también eliminará la pila anidada creada para la capa de AWS Data Wrangler.

Conclusión

En está publicación hemos demostrado que con la ayuda de los servicios de AWS Lambda y Amazon S3 la anonimización de datos puede automatizarse en minutos. Las Step Functions son capaces de realizar el reemplazo de los datos en tan solo segundos de forma automática, reemplazando las columnas sensibles por caracteres aleatorios. Si deseas profundizar más sobre enmascarar de datos sensibles o como proteger tus datos, este artículo te proporcionará más información, además puedes seguir aprendiendo consultando los blogs de AWS.

Puede probar el despliegue de está solución en las región US-WEST (Oregon). Para obtener más información sobre como funcionan las Steps Functions y maquinas de estados, consulte la página de AWS Lambda.

 


Acerca de los autores

Lesly Reyes es Arquitecta de Soluciones en Amazon Web Services para la vertical de telecomunicaciones con experiencia en AI/ML.

 

 

 

 

Maddyzeth Ariza es Arquitecta de datos de Servicios Profesionales en Amazon Web Services, con experiencia en lagos de datos, gobierno de datos y servicios de analítica.