数据掩码和基于粒度的访问控制,使用 Amazon Macie 和 AWS Lake Formatio
- 21
使用 Amazon Macie 和 AWS Lake Formation 的数据脱敏与细粒度访问控制
关键要点
数据敏感性:个人数据在不当使用下可能导致身份盗用,因此公司需遵循相关法律法规进行管理。解决方案架构:通过细粒度访问控制与数据匿名化策略,在不泄露敏感数据的情况下,支持数据科学家使用数据。多种技术:利用数据脱敏和数据加密来保护敏感信息。随着企业不断收集用户数据,目的是推出新产品、提供更符合用户档案的推荐,或者在金融机构的情况下,便于用户获取更高的信用额度或更低的利率。然而,个人数据非常敏感,其使用能识别出特定系统或应用程序使用者,在不当之手下,这些数据可能被用作未经授权的用途。因此,各国政府和组织如欧盟的《通用数据保护条例》(GDPR)、巴西的《通用数据保护法》(LGPD)、以及新加坡银行协会发布的《云计算实施指南》,都明确了什么是敏感数据以及企业应如何管理这些数据。一个共同要求是必须获得用户同意才能收集和使用个人数据,且所收集的数据应匿名化,以保护消费者免受数据泄露风险。
在本博文中,我们将介绍一个实现数据匿名化的建议架构,采用细粒度访问控制,以符合明确定义的规则。此架构涵盖了一种场景,即用户可能没有查看数据的权限,但应用程序却可以。该场景的典型用例为数据科学家,其使用敏感数据训练机器学习模型。训练算法可以访问数据,而数据科学家则无法访问。这种方法有助于降低数据泄露风险,同时在使用数据时能推动创新。
前提条件
要实现建议的解决方案,您需要一个有效的 AWS 账户,并具有使用以下服务的 AWS 身份与访问管理 (IAM) 权限:
服务名称Amazon AthenaAWS CloudFormationAWS 数据库迁移服务 (AWS DMS)Amazon Elastic Compute Cloud (EC2)AWS GlueAmazon EventBridgeAWS KMSAmazon Kinesis Data FirehoseAWS Lake FormationAWS LambdaAmazon MacieAmazon RDSAmazon S3AWS Secrets ManagerAmazon VPC注意:如果存在预先配置的 Lake Formation,可能会在测试该解决方案时遇到权限问题。建议在尚未激活 Lake Formation 的开发账户中测试该解决方案。如果无开发账户可借用,详细了解所需权限请参见 Lake Formation 文档。
您必须允许 AWS DMS 创建必要的资源,例如运行 DMS 任务的 EC2 实例。如果您以前已使用 DMS,则此权限应已存在。否则,可以使用 CloudFormation 创建必要的角色以部署解决方案。查看权限是否已经存在,您可以在 AWS 管理控制台中打开 IAM ,选择 Roles 并查看是否有名为 dmsvpcrole 的角色。如未存在,则在部署期间 必须创建该角色。
我们使用 Faker 库生成包含以下表格的虚拟数据:
CustomerBankCard解决方案概述
该架构允许多个数据源将信息发送到 AWS 的数据湖环境,其中 Amazon S3 是主要数据存储。数据存储在 S3 桶后,Macie 使用机器学习和模式匹配分析对象并识别敏感数据。随后,AWS Glue 依据这些信息运行工作流以便匿名化数据。
我们将在过程中描述两种技术:数据脱敏和数据加密。工作流运行后,数据将存储在另一个 S3 桶中。此桶的层次结构用于为不同用户角色隔离数据访问。
解决方案架构如下:
数据源为 Amazon RDS 数据库。数据可以存储在 EC2 实例的数据库中,或者在本地服务器中,甚至在不同的云提供商上进行部署。AWS DMS 使用全量加载,从源一个 Amazon RDS 数据库迁移数据到目标 S3 桶dcpmacie作为一次性迁移。上传到 S3 桶的新对象会自动使用 服务器端加密 (SSES3) 加密。新的 Amazon S3 对象上传后,会调用个人身份信息 (PII) 检测管道。Macie 将分析这些对象并识别出敏感值。用户可以手动识别文件中应被标记为敏感的字段与值,或使用 Macie 的自动敏感数据发现功能。Macie 识别的敏感值会发往 EventBridge,触发 Kinesis Data Firehose 将其存储在 dcpglue S3 桶中。AWS Glue 使用这些数据来了解应使用 AWS KMS 中存储的加密密钥掩盖或加密的字段。 使用 EventBridge 使得架构基于事件,作为 Macie 和 Kinesis Data Firehose 之间的桥梁,集成这些服务的功能。Kinesis Data Firehose 支持数据缓冲,减少因 Macie 发送数据时发生信息丢失的风险,同时降低存储数据在 Amazon S3 的总体成本。它还允许将数据发送到其他位置,如 Amazon Redshift 或 Splunk,以便供其他产品进行分析。这一环节结束后,将从 Lambda 函数触发 Amazon S3,启动 AWS Glue 工作流,掩盖并加密识别出的数据。 AWS Glue 在 S3 桶 dcpmacie (a) 和 dcpglue (b) 上启动爬虫,分别填充作为 AWS Glue 服务的一部分创建的两个表。然后运行 Python 脚本 (c),查询这两张表中的数据。使用这些信息对数据进行掩盖和加密,然后存储在 dcpathena 桶的 dcpmasked (d) 和 dcpencrypted (e) 中的前缀下。工作流的最后一步是在每个这些前缀 (f) 和 (g) 上执行爬虫,为它们在 AWS Glue 数据目录中创建各自的表。为了实现细粒度的访问控制,Lake Formation 将权限映射到您配置的标签。此部分的实施将在后文进一步描述。可以使用 Athena 查询数据。其他工具,如 Amazon Redshift 或 Amazon Quicksight,也能使用,甚至可以使用第三方工具。如果用户没有查看敏感数据的权限,但需要访问以进行机器学习模型训练,则可以使用 AWS KMS。AWS KMS 服务管理用于数据脱敏的加密密钥,以便为训练算法提供访问权限。用户可以查看模糊数据,但算法可以使用原始数据进行模型训练。
加速器一小时本解决方案使用三种角色:
securelfadmin 数据湖管理员,负责配置数据湖并向数据管理员分配权限。 securelfbusinessanalyst 商业分析师,无权访问某些机密信息。 securelfdatascientist 数据科学家,无权访问某些机密信息。解决方案实施
为便于实施,我们创建了一个 CloudFormation 模板。模型及其他生成的工件可以在本 GitHub 仓库中找到。您可以使用 CloudFormation 仪表板查看所有已部署功能的输出。
选择以下 Launch Stack 按钮以部署 CloudFormation 模板。
部署 CloudFormation 模板
要部署 CloudFormation 模板并在 AWS 账户中创建资源,请遵循以下步骤。
登录 AWS 账户,部署 CloudFormation 模板。在 创建堆栈 窗口中,选择 下一步。 在下一部分,为堆栈输入名称。在 TestUserPassword 字段中输入 Lake Formation 角色用于控制台登录的密码。完成字段填写后,选择 下一步。在下一个屏幕中,查看所选选项然后选择 下一步。在最后部分,审查信息并选中 我确认 AWS CloudFormation 可能创建带有自定义名称的 IAM 资源。选择 创建堆栈。 等待堆栈状态变更为 CREATECOMPLETE。部署过程预计将持续约 15 分钟。
运行 AWS DMS 任务
要从 Amazon RDS 实例中提取数据,您必须运行 AWS DMS 任务。这会使数据以 Parquet 格式在 S3 桶中可用。
打开 AWS DMS 控制台。在导航栏中,选择 迁移数据 选项,然后选择 数据库迁移任务。选择名称为 rdstos3task 的任务。选择 操作。选择 重启/恢复。加载过程应约需 1 分钟。当状态变更为 加载完成 时,您将能够在目标桶 (dcpmacie) 的数据集文件夹中看到迁移的数据。在每个前缀内将有一个遵循命名规则的 parquet 文件:LOAD00000001parquet。完成此步骤后,使用 Macie 扫描文件中的敏感信息。
使用 Macie 运行分类作业
您必须先创建数据分类作业,才能评估桶的内容。所创建的作业将运行并评估 S3 桶的完整内容,以判定其是否包含 PII。此作业使用 Macie 中的托管标识符和自定义标识符。
打开 Macie 控制台,在导航栏中选择 作业。选择 创建作业。选择 S3 桶 dcpmacie,该桶包含 AWS DMS 任务的输出。选择 下一步 继续。在 审核桶 页面,确认所选桶为 dcpmacie,然后选择 下一步。在 细化范围 中,创建具有以下范围的新作业:敏感数据发现选项:一次性作业为了演示,将进行单次发现作业。对于生产环境,建议选择 定期作业 选项,以便 Macie 可以按照计划分析对象。采样深度:100。将其他设置保持为默认值。在 托管数据标识符选项 中,选择 全部,以便 Macie 可以使用所有托管的数据标识符。这样可以启用一组内置的标准来侦测所有识别出的敏感数据类型。选择 下一步。在 自定义数据标识符 选项中,选择 accountnumber,然后选择 下一步。使用自定义标识符,您可以创建逻辑来查找存储在 Amazon S3 中文件中的特定模式。在此示例中,任务生成一个发现作业,查找包含以下正则表达式格式的数据:XYZ 后跟数字,这是数据集中生成虚假 accountnumber 的默认格式。创建自定义数据标识符的逻辑包含在 CloudFormation 模板文件中。在 选择允许列表 中,选择 下一步 继续。输入作业的名称和描述。选择 下一步 继续。在 审查并创建步骤 中,检查所创建作业的详细信息,并选择 提交。要扫描的数据量直接影响作业的运行时。您可以选择屏幕顶部的 更新 按钮如图 4 所示,查看作业的最新状态。该作业的完成时间约为 10 分钟,具体取决于测试数据集的大小。
运行 AWS Glue 数据转换管道
在 Macie 作业完成后,发现结果将被吸入到桶 dcpglue,触发 AWS Glue 工作流步骤dcpWorkflow,该步骤预计将花费约 11 分钟完成。
检查工作流进度的方法:
打开 AWS Glue 控制台,导航栏选择 工作流编排。选择 dcpworkflow。接着,选择 历史记录 以查看 dcpworkflow 的过往运行记录。作为工作流dcpworkflow一部分启动的 AWS Glue 作业会读取 Macie 发现,了解敏感数据的确切位置。例如,customer 表中有 name 和 birthdate。在 bank 表中有 accountnumber、iban 和 bban。在 card 表中有 cardnumber、cardexpiration 和 cardsecuritycode。找到这些数据后,作业会对信息进行掩盖和加密。
文本加密通过 AWS KMS 密钥执行。以下代码片段提供此功能:
pythondef encryptrows(r) encryptedentities = columnstobemaskedandencrypted try for entity in encryptedentities if entity in tablecolumns encryptedentity = getkmsencryption(r[entity]) r[entity encrypted] = encryptedentitydecode(utf8) del r[entity] except print(DEBUG sysexcinfo()) return r
def getkmsencryption(row) # 创建 KMS 客户端 session = boto3sessionSession() client = sessionclient(servicename=kms regionname=regionname)
try encryptionresult = clientencrypt(KeyId=keyid Plaintext=row) blob = encryptionresult[CiphertextBlob] encryptedrow = base64b64encode(blob) return encryptedrowexcept return Error on getkmsencryption function
如果您的应用需要访问未加密文本,并且具有访问 AWS KMS 加密密钥的权限,则可以使用以下示例代码访问信息:
pythonclientdecrypt(CiphertextBlob=base64b64decode(dataencrypted))print(decrypted[Plaintext])

完成所有上述步骤后,数据集已完全匿名化,已创建 Data Catalog 中的表,并将数据存储在各自的 S3 桶中。这些桶应用了通过 Lake Formation 的细粒度访问控制:
掩盖数据 s3//dcpathenaltAWSREGIONgtltACCOUNTIDgt/masked/加密数据 s3//dcpathenaltACCOUNT