View a markdown version of this page

配置 IAM - Amazon Aurora DSQL

配置 IAM

重要

此功能以 AWS 预览版形式提供,可能会发生变化。有关更多信息,请参阅 AWS Service Terms 中的第 2 部分“Betas and Previews”。要了解有关 CDC 流的定价的更多信息,请参阅 Aurora DSQL 定价页面

在正式发布之前,我们将向流有效载荷添加新的操作类型("op": "u" 表示更新)。要确保您的应用程序无需修改即可处理这些更改,请通过应用 after 有效载荷将任何无法识别的 op 值视为更新插入。有关详细信息,请参阅了解 CDC 记录

CDC 流需要两组单独的 IAM 权限:

  • 调用方权限:调用 CDC 流 API 操作(CreateStreamGetStreamDeleteStreamListStreams)的 IAM 主体需要拥有执行这些操作的权限以及 iam:PassRole 的权限。

  • 服务角色:一个 IAM 角色,Aurora DSQL 在运行时会代入此角色以将 CDC 记录写入您的目标。您可以创建此角色,附加一个信任策略来允许 Aurora DSQL 服务主体代入此角色,并附加一个权限策略来授予向目标进行写入的权限。

注意

CDC 服务角色独立于您的 Aurora DSQL 集群上的任何基于资源的策略。集群资源型策略控制哪些主体能够连接到集群并执行查询。CDC 服务角色控制 Aurora DSQL 可以将 CDC 记录写入哪个目标。

调用方权限

调用 CDC 流 API 操作的 IAM 主体需要拥有执行相关的 dsql 操作的权限以及 iam:PassRole 的权限。CreateStream 操作需要 iam:PassRole,因为它会将服务角色 ARN 传递给 Aurora DSQL。下面是一个策略示例:

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DSQLStreamActions", "Effect": "Allow", "Action": [ "dsql:CreateStream", "dsql:GetStream", "dsql:ListStreams", "dsql:DeleteStream" ], "Resource": [ "arn:aws:dsql:region:your-account-id:cluster/cluster-id", "arn:aws:dsql:region:your-account-id:cluster/cluster-id/stream/*" ] }, { "Sid": "PassServiceRole", "Effect": "Allow", "Action": "iam:PassRole", "Resource": "arn:aws:iam::your-account-id:role/dsql-cdc-role", "Condition": { "StringEquals": { "iam:PassedToService": "dsql.amazonaws.com" } } } ] }

Resource 元素包含集群 ARN(CreateStreamListStreams 所需)和流 ARN 模式(GetStreamDeleteStream 所需)。

有关每项操作所需权限的完整列表,请参阅《Amazon Aurora DSQL API 参考》中的 CreateStreamGetStreamDeleteStreamListStreams

服务角色

服务角色是 IAM 角色,Aurora DSQL 会代入此角色以将 CDC 记录写入您的目标。您可以创建此角色,并在调用 CreateStream 时在 targetDefinition.kinesis.roleArn 字段中传递其 ARN。此角色需要信任策略和权限策略。

服务角色信任策略

信任策略必须允许 Aurora DSQL 服务主体代入此角色。要防范混淆代理人问题攻击,请使用 aws:SourceAccountaws:SourceArn 条件键。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DSQLAssumeRole", "Effect": "Allow", "Principal": { "Service": "dsql.amazonaws.com" }, "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "aws:SourceAccount": "your-account-id" }, "ArnLike": { "aws:SourceArn": "arn:aws:dsql:region:your-account-id:cluster/cluster-id/stream/*" } } } ] }

aws:SourceArn 条件将角色限制为只能访问特定集群下的流。在创建流时,您必须使用通配符(stream/*),因为 Aurora DSQL 尚未分配流标识符。创建流后,如果该角色仅服务于单个流,则可以将条件收紧至精确的流 ARN(arn:aws:dsql:region:your-account-id:cluster/cluster-id/stream/stream-id)。

要将该角色用于您账户中任何集群上的流,请使用更广泛的通配符:arn:aws:dsql:region:your-account-id:cluster/*/stream/*

要了解有关防止混乱代理人问题的更多信息,请参阅本指南中的防止跨服务混淆座席

服务角色权限策略

权限策略向服务角色授予将记录写入 Kinesis 数据流的访问权限。以下策略包含 Kinesis 写入权限和 AWS KMS 权限。仅在您的 Kinesis 数据流使用 AWS KMS 客户自主管理型密钥时,才需要 KMSAccess 语句,但您可以提前包含该语句,这样后续添加客户自主管理型密钥时就不会导致 CDC 流中断。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "KinesisAccess", "Effect": "Allow", "Action": [ "kinesis:PutRecord", "kinesis:PutRecords", "kinesis:DescribeStreamSummary", "kinesis:ListShards" ], "Resource": "arn:aws:kinesis:region:your-account-id:stream/kinesis-stream-name" }, { "Sid": "KMSAccess", "Effect": "Allow", "Action": [ "kms:GenerateDataKey" ], "Resource": "arn:aws:kms:*:*:key/*", "Condition": { "StringEquals": { "kms:ViaService": "kinesis.region.amazonaws.com", "kms:EncryptionContext:aws:kinesis:arn": "arn:aws:kinesis:region:your-account-id:stream/kinesis-stream-name", "aws:ResourceAccount": "${aws:PrincipalAccount}" } } } ] }

AWS KMS 语句中的条件提供以下保护:

  • kms:ViaService:仅允许将密钥用于通过指定区域中的 Kinesis 服务发出的请求。

  • kms:EncryptionContext:aws:kinesis:arn:仅允许将密钥用于指定的 Kinesis 数据流的加密操作。

  • aws:ResourceAccount:密钥必须与调用主体属于同一个 AWS 账户,这可以防止跨账户使用密钥。

注意

此处引用的 AWS KMS 密钥是 Kinesis 数据流上的加密密钥,而不是集群的 AWS KMS 密钥。集群的加密密钥可保护 Aurora DSQL 边界内的 CDC 数据。在 Aurora DSQL 将 CDC 数据写入 Kinesis 数据流之后,Kinesis 加密密钥可保护该数据。

数据保护

Aurora DSQL 使用传输层安全性协议(TLS)加密 Aurora DSQL 与目标之间的传输中 CDC 数据。在 Aurora DSQL 边界内,Aurora DSQL 使用集群的加密密钥对静态 CDC 数据进行加密。

如果集群使用 AWS KMS 客户自主管理型密钥,并且该密钥变得无法访问,则 ACTIVEIMPAIRED 流会转换为 IMPAIRED 状态,并返回错误代码 CLUSTER_CMK_INACCESSIBLE。如果在创建完流之前,密钥变得无法访问,则流会直接转换为 FAILED 状态。

有关 Aurora DSQL 中加密的详细说明,请参阅本指南中的 Amazon Aurora DSQL 的数据加密