在这篇文章中,我们探讨了如何在 Amazon DynamoDB 中实现细粒度访问控制FGAC及其与 AWS CloudTrail 的集成,以便更好地跟踪和控制 API 操作。我们展示了如何配置与条件相关的 IAM 策略,以实施最小权限原则,并提供了 Terraform 代码模板用于自动创建相关资源。
客户选择 Amazon DynamoDB 以提高应用程序的性能、可扩展性和可靠性。DynamoDB 的无服务器架构通过抽象硬件、扩展、补丁和维护来简化操作。DynamoDB 中的数据访问和安全管理与基于实例的数据库解决方案有所不同。DynamoDB 使用 AWS 身份与访问管理IAM来认证和授权对资源的访问,而关系数据库管理系统RDBMS解决方案则依赖于防火墙规则、密码认证和数据库连接管理。
在本文中,我们将讨论如何利用细粒度访问控制FGAC来实现对受信的 IAM 实体的最小权限访问控制。我们将演示如何通过条件基础的 IAM 策略在 DynamoDB 上配置 FGAC,并提供示例 AWS IAM 身份中心 权限集,基于 AWS 区域和标签等属性进行细粒度访问控制。我们还会展示如何将 DynamoDB 与 AWS CloudTrail 集成,以记录 DynamoDB 控制平面和数据平面 API 操作。例如,您可以在 CloudTrail 日志中记录 DeleteItem 事件,创建一个 Amazon CloudWatch 指标过滤器,并创建一个 CloudWatch 警报。同时,我们还提供了 HashiCorp Terraform 的基础设施即代码IaC模板,用于自动创建这些资源。

从高层次来看,实施细粒度访问控制的步骤如下:
创建 IAM 身份中心权限集,通过在 IAM 策略中使用条件和前缀来实施最小权限访问。在 IAM 身份中心中选择 AWS 帐号,指定用户和组,并分配权限集。DynamoDB 是一个完全托管的数据库服务,使您能够减轻操作和扩展托管数据库的管理负担。然而,为确保已授权的用户和应用程序可以访问 DynamoDB 中创建和修改数据,您需要借助 AWS 服务有效地实施访问控制。在深入具体细节之前,了解基本概念非常重要。
IAM 是 AWS 安全的基础。它允许您控制谁可以在您的 AWS 资源上执行什么操作。您可以拒绝或授予 IAM 用户、组或角色权限。
除了 IAM 之外,DynamoDB 还支持 基于资源的策略。基于资源的策略允许您通过指定谁可以访问每个资源以及他们被允许对每个资源执行的操作来定义访问权限。这些策略还支持与 IAM 访问分析器 和 阻止公共访问BPA功能的集成。基于资源的策略大大简化了 跨帐户访问控制。要探索不同的 DynamoDB 授权场景以及如何实施基于资源的策略来解决这些问题,请参阅 使用基于资源的策略简化跨账户访问控制
DynamoDB 使您能够在每个表的级别实施细粒度访问控制。请按照以下步骤操作:
确定哪些人应该访问您的 DynamoDB 表,以及他们所需的访问级别。确定他们需要执行的读取和写入操作。为需要访问 DynamoDB 的服务和个人创建 IAM 用户、组或角色。创建 IAM 策略并将其附加到 IAM 用户或角色。以下是一个示例策略,拒绝从名为 TestTable 的特定表中删除标签的操作:
json{ Version 20121017 Statement [ { Sid DenyDeleteTag2 Effect Deny Action [ dynamodbUntagResource ] Resource [ arnawsdynamodbuseast1123456789012table/TestTable ] } ]}
以下策略允许对 TestTable 的所有 DynamoDB 操作进行访问:
json{ Version 20121017 Statement [ { Sid AllowedResourcesWithPrefixApp Effect Allow Action [ dynamodb ] Resource [ arnawsdynamodbuseast1123456789012table/TestTable ] } ]}
DynamoDB 支持条件表达式,允许您在表内定义细粒度的访问控制。您可以指定必须满足的条件,以使操作成功。以下示例策略允许用户访问特定属性,其中分区键值与其用户 ID 匹配,表名为 TestTable。此 ID {wwwamazoncomuserid} 是一个替代变量。
json{ Version20121017 Statement[ { SidAllowAccessToOnlyItemsMatchingUserID EffectAllow Action[ dynamodbGetItem dynamodbBatchGetItem dynamodbQuery dynamodbPutItem dynamodbUpdateItem dynamodbDeleteItem dynamodbBatchWriteItem ] Resource[ arnawsdynamodbuseast1123456789012table/TestTable ] Condition{ ForAllValuesStringEquals{ dynamodbLeadingKeys[ {wwwamazoncomuserid} ] dynamodbAttributes[ attribute1 attribute2 attribute3 ] } StringEqualsIfExists{ dynamodbSelectSPECIFICATTRIBUTES } } } ]}
DynamoDB 与 CloudTrail 集成。通过创建跟踪,您可以将 DynamoDB 控制平面 API 操作记录为 CloudTrail 日志中的事件。要在 CloudTrail 文件中启用数据平面 API 操作的日志记录,您需要在 CloudTrail 中启用数据事件的日志记录。数据平面事件可以按资源类型进行过滤,以便对希望选择性记录到 CloudTrail 的 DynamoDB API 调用进行细粒度控制。
从高层次来看,步骤如下:
启用 CloudTrail 以记录 DynamoDB API 操作。使用 CloudWatch 指标过滤器捕获所需的 API 操作并将其转换为数值 CloudWatch 指标。使用自定义指标创建 CloudWatch 警报。使用 Amazon 简单通知服务 (Amazon SNS) 向订阅的端点或客户端发送电子邮件通知,当您创建的警报状态变化时。以下图示展示了该架构的不同组成部分。
在本操作指南中,您需要以下条件:
一个 AWS 账户拥有必要权限的 IAM 用户或角色访问 DynamoDB、CloudTrail、CloudWatch 和 Amazon SNS在本解决方案中,您创建数据事件以将 API 操作记录到 CloudWatch 日志组。这样您可以快速确定哪些 DynamoDB 项目被创建、读取、更新或删除,并识别 API 调用的来源。如果您检测到未经授权的 DynamoDB 活动,您还可以立即采取措施限制访问。
以下截图显示了如何创建数据事件,并使用高级事件选择器设置来捕获 CloudTrail 中的数据平面操作 DeleteItem。
以下示例显示了如何使用 AWS 命令行界面AWS CLI使用高级事件选择器:
bashaws cloudtrail puteventselectors trailname TrailName advancedeventselectors [ { name findDeleteItems fieldSelectors [ { field eventCategory equals [ Data ] } { field resourcestype equals [ AWSDynamoDBTable ] } { field eventName equals [ DeleteItem ] } ] } ]
您可以通过 创建项 在 DynamoDB 表中进行测试,然后删除它。这将导致 CloudTrail 中生成一个 DeleteItem API 操作。在生成流量后,您可以登录 CloudWatch Logs 控制台,选择日志组,并搜索事件 DeleteItem,如以下截图所示。
以下是您可以在 CloudWatch Logs 控制台上运行的两个示例查询:
查找 AccessDenied 操作 filter (errorCode =AccessDenied and eventSource=dynamodbamazonawscom and eventName =DescribeGlobalTable)查找 Unauthorized 操作 filter (errorCode =UnauthorizedOperation and eventSource=dynamodbamazonawscom and eventName =DescribeGlobalTable)您可以使用指标过滤器将日志数据转换为可操作的指标并创建警报。过滤器可以是单词、确切短语或数字值。您可以使用正则表达式regex创建独立的过滤器模式,或将它们与 JSON 和空格分隔的过滤器模式结合使用。
要为事件 DeleteItem 创建指标过滤器,请参考 为日志组创建指标过滤器。
创建指标过滤器后,您可以创建 CloudWatch 警报。有关说明,请查看 为 CloudTrail 事件创建 CloudWatch 警报的示例。在 配置操作 页面上,选择 通知,然后选择 处于警报中,表示当阈值被突破时,将采取发送通知到 SNS 主题的操作。
要创建 SNS 主题,请遵循 创建 Amazon SNS 主题 的步骤。当您的警报状态变化时,Amazon SNS 会向订阅的端点或客户端发送电子邮件通知。
我们提供了以下 代码 来自动创建 DynamoDB API 操作的 CloudTrail 日志、CloudWatch 指标过滤器和 CloudWatch 警报。然后,您可以使用您首选的通知渠道创建 SNS 主题。
您可以使用 CloudWatch Contributor Insights 来分析日志数据并创建显示贡献者数据的时间序列。贡献者洞察提供内置规则,分析 DynamoDB 的性能指标。它记录频繁访问的键和超阈值的键,帮助您找到最常用的主键,并了解谁或什么正在影响系统性能。您必须明确信息开启贡献者洞察以支持您的 DynamoDB 表。
您还可以使用 Amazon EventBridge 规则来监控 DynamoDB 数据定义语言DDL操作,如 CreateTable、DeleteTable 和 UpdateTable,以便通过 SNS 主题接收通知。EventBridge 规则监控特定类型的事件,当发生匹配事件时,该事件将路由到与规则关联的目标。
为避免您 AWS 帐户中持续收费,请删除您在本文章中创建的 DynamoDB、CloudTrail、CloudWatch、Amazon SNS 及其他所有资源。
在这篇文章中,我们提供了关于如何在 DynamoDB 中使用条件基础的 IAM 策略设置细粒度访问控制的指南。我们还提供了一个 Terraform IaC 模板,以将 DynamoDB 集成到 CloudTrail 中,记录 DynamoDB 控制与数据平面 API 操作作为 CloudTrail 日志中的事件,创建 CloudWatch 指标过滤器,并创建 CloudWatch 警报。
通过这个解决方案,您可以实施前瞻性和可反应的监控最佳实践,以便为 DynamoDB 应用正确的安全控制。有关细粒度访问控制的更多信息,请查看视频 Amazon DynamoDB 中的细粒度访问控制。欲了解进一步的阅读,请参考 AWS WellArchitected Framework、DynamoDB 设计与架构的最佳实践 和 优化 DynamoDB 表的成本。
Arun Chandapillai 是一名高级架构师,同时也是多样性和包容性的倡导者。他热衷于帮助客户通过以业务为先的云采用策略加速 IT 现代化,并成功构建、部署和管理云中的应用程序和基础设施。Arun 也是一名汽车爱好者,热心演讲者和慈善家,相信“你付出多少,就会收回多少”。
Parag Nagwekar 是 AWS Proserv 的高级云基础设施架构师。他与客户合作,设计并构建解决方案,帮助他们实现云迁移和 IT 现代化。他的热情是在云中为应用程序提供可扩展和高可用的服务。他在多个领域拥有丰富经验,包括系统管理、DevOps、分布式架构和云架构设计。
加速器国内ip地址标签:可观测性、terraform