

# 配置 IAM
<a name="cdc-iam"></a>

CDC 流需要两组单独的 IAM 权限：
+ **调用方权限**：调用 CDC 流 API 操作（`CreateStream`、`GetStream`、`DeleteStream`、`ListStreams`）的 IAM 主体需要拥有执行这些操作的权限以及 `iam:PassRole` 的权限。
+ **服务角色**：一个 IAM 角色，Aurora DSQL 在运行时会代入此角色以将 CDC 记录写入您的目标。您可以创建此角色，附加一个信任策略来允许 Aurora DSQL 服务主体代入此角色，并附加一个权限策略来授予向目标进行写入的权限。

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

## 调用方权限
<a name="cdc-iam-caller-permissions"></a>

调用 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 参考》](https://docs.aws.amazon.com/aurora-dsql/latest/userguide/CHAP_api_reference.html)中的 [CreateStream](https://docs.aws.amazon.com/aurora-dsql/latest/APIReference/API_CreateStream.html)、[GetStream](https://docs.aws.amazon.com/aurora-dsql/latest/APIReference/API_GetStream.html)、[DeleteStream](https://docs.aws.amazon.com/aurora-dsql/latest/APIReference/API_DeleteStream.html) 和 [ListStreams](https://docs.aws.amazon.com/aurora-dsql/latest/APIReference/API_ListStreams.html)。

## 服务角色
<a name="cdc-iam-service-role"></a>

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

## 服务角色信任策略
<a name="cdc-iam-trust-policy"></a>

信任策略必须允许 Aurora DSQL 服务主体代入此角色。要防范[混淆代理人问题](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)攻击，请使用 `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/*`。

要了解有关防止混乱代理人问题的更多信息，请参阅本指南中的[防止跨服务混淆座席](cross-service-confused-deputy-prevention.md)。

## 服务角色权限策略
<a name="cdc-iam-permissions-policy"></a>

权限策略向服务角色授予将记录写入 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 加密密钥可保护该数据。

## 数据保护
<a name="cdc-data-protection"></a>

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 的数据加密](https://docs.aws.amazon.com/aurora-dsql/latest/userguide/data-encryption.html)。