配置 IAM
重要
此功能以 AWS 预览版形式提供,可能会发生变化。有关更多信息,请参阅 AWS Service Terms
在正式发布之前,我们将向流有效载荷添加新的操作类型("op": "u" 表示更新)。要确保您的应用程序无需修改即可处理这些更改,请通过应用 after 有效载荷将任何无法识别的 op 值视为更新插入。有关详细信息,请参阅了解 CDC 记录。
CDC 流需要两组单独的 IAM 权限:
-
调用方权限:调用 CDC 流 API 操作(
CreateStream、GetStream、DeleteStream、ListStreams)的 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(CreateStream 和 ListStreams 所需)和流 ARN 模式(GetStream 和 DeleteStream 所需)。
有关每项操作所需权限的完整列表,请参阅《Amazon Aurora DSQL API 参考》中的 CreateStream、GetStream、DeleteStream 和 ListStreams。
服务角色
服务角色是 IAM 角色,Aurora DSQL 会代入此角色以将 CDC 记录写入您的目标。您可以创建此角色,并在调用 CreateStream 时在 targetDefinition.kinesis.roleArn 字段中传递其 ARN。此角色需要信任策略和权限策略。
服务角色信任策略
信任策略必须允许 Aurora DSQL 服务主体代入此角色。要防范混淆代理人问题攻击,请使用 aws:SourceAccount 或 aws: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 客户自主管理型密钥,并且该密钥变得无法访问,则 ACTIVE 或 IMPAIRED 流会转换为 IMPAIRED 状态,并返回错误代码 CLUSTER_CMK_INACCESSIBLE。如果在创建完流之前,密钥变得无法访问,则流会直接转换为 FAILED 状态。
有关 Aurora DSQL 中加密的详细说明,请参阅本指南中的 Amazon Aurora DSQL 的数据加密。