

# DynamoDB 全局表安全性
安全性

全局表副本是 DynamoDB 表，因此，您可以使用与控制单区域表的访问权限相同的方法，来控制副本的访问权限，包括使用 Amazon Identity and Access Management（IAM）身份策略和基于资源的策略。

本主题介绍如何使用 IAM 权限和 Amazon Key Management Service（Amazon KMS）加密来保护 DynamoDB 全局表。您将了解用于实现跨区域复制和自动扩缩的服务相关角色（SLR），创建、更新和删除全局表所需的 IAM 权限，以及多区域最终一致性（MREC）与多区域强一致性（MRSC）表之间的区别。您还将学习用于安全地管理跨区域复制的 Amazon KMS 加密密钥。

## 全局表的服务相关角色
全局表服务相关角色

DynamoDB 全局表依靠服务相关角色（SLR）来管理跨区域复制和自动扩缩功能。

您只需为每个 Amazon 账户设置一次这些角色。创建后，同一个角色将用于您的账户中的所有全局表。有关服务相关角色的更多信息，请参见 *IAM 用户指南*中的[使用服务相关角色](https://docs.amazonaws.cn/IAM/latest/UserGuide/using-service-linked-roles.html)。

### 复制服务相关角色
复制 SLR

当您首次创建全局表时，Amazon DynamoDB 会自动为您创建一个 `AWSServiceRoleForDynamoDBReplication` 服务相关角色（SLR）。此角色为您管理跨区域复制。

在将基于资源的策略应用于副本时，请确保不要拒绝向 SLR 主体授予在 `AWSServiceRoleForDynamoDBReplicationPolicy` 中定义的任何权限，因为这会中断复制。如果您拒绝所需的 SLR 权限，则与受影响副本之间的复制将停止，副本表的状态将更改为 `REPLICATION_NOT_AUTHORIZED`。
+ 对于多区域最终一致性（MREC）全局表，如果副本保持在 `REPLICATION_NOT_AUTHORIZED` 状态的时间超过 20 小时，则该副本将不可逆地转换为单区域 DynamoDB 表。
+ 对于多区域强一致性（MRSC）全局表，拒绝所需权限将导致写入和强一致性读取操作的 `AccessDeniedException`。如果副本保持 `REPLICATION_NOT_AUTHORIZED` 状态的时间超过七天，则该副本将变为永久无法访问，并且写入和强一致性读取操作将继续失败并出现错误。某些管理操作（例如副本删除）将获得成功。

### 自动扩缩服务相关角色
自动扩缩 SLR

在将全局表配置为调配容量模式时，必须为全局表配置自动扩缩。DynamoDB 自动扩缩功能使用 Amazon Application Auto Scaling 服务来动态调整全局表副本上的预调配吞吐能力。Application Auto Scaling 服务创建名为 [https://docs.amazonaws.cn/autoscaling/application/userguide/application-auto-scaling-service-linked-roles.html](https://docs.amazonaws.cn/autoscaling/application/userguide/application-auto-scaling-service-linked-roles.html) 的服务相关角色（SLR）。当您首次为 DynamoDB 表配置自动扩缩时，将在您的 Amazon 账户中自动创建此服务相关角色。此角色允许 Application Auto Scaling 管理预调配的表容量并创建 CloudWatch 警报。

 在将基于资源的策略应用于副本时，请确保不要拒绝向 Application Auto Scaling SLR 主体授予在 [https://docs.amazonaws.cn/aws-managed-policy/latest/reference/AWSApplicationAutoscalingDynamoDBTablePolicy.html](https://docs.amazonaws.cn/aws-managed-policy/latest/reference/AWSApplicationAutoscalingDynamoDBTablePolicy.html) 中定义的任何权限，因为这将中断自动扩缩功能。

### 服务相关角色的 IAM 策略示例


符合以下条件的 IAM 策略不会影响对 DynamoDB 复制 SLR 和 Amazon 自动扩缩 SLR 所需的权限。此条件可以添加到原本限制性较宽泛的其他策略中，以避免无意间中断复制或自动扩缩。

#### 从拒绝策略中排除所需的 SLR 权限


以下示例说明如何从拒绝语句中排除服务相关角色主体：

```
"Condition": {
    "StringNotEquals": {
        "aws:PrincipalArn": [
            "arn:aws::iam::111122223333:role/aws-service-role/replication.dynamodb.amazonaws.com/AWSServiceRoleForDynamoDBReplication",
            "arn:aws::iam::111122223333:role/aws-service-role/dynamodb.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_DynamoDBTable"
        ]
    }
}
```

## 全局表如何使用 Amazon IAM
全局表 IAM 权限

以下各节介绍不同全局表操作所需的权限，并提供了策略示例，以帮助您为用户和应用程序配置适当的访问权限。

**注意**  
描述的所有权限都必须应用于受影响区域中的特定表资源 ARN。表资源 ARN 采用格式 `arn:aws:dynamodb:region:account-id:table/table-name`，您需要指定实际区域、账户 ID 和表名值。

**Topics**
+ [

### 创建全局表和添加副本
](#globaltables-creation-iam)
+ [

### 更新全局表
](#globaltables-update-iam)
+ [

### 删除全局表和移除副本
](#globaltables-delete-iam)

### 创建全局表和添加副本
创建全局表和添加副本

DynamoDB 全局表支持两种一致性模式：多区域最终一致性（MREC）和多区域强一致性（MRSC）。MREC 全局表可以在任意数量的区域中有多个副本，并提供最终的一致性。MRSC 全局表则必须部署在三个区域（三个副本，或两个副本和一个见证者），且提供强一致性，并实现零恢复点目标（RPO）。

创建全局表所需的权限取决于您创建的全局表是否具有见证者。

#### 创建全局表的权限
创建权限

初始全局表创建和以后添加副本都需要以下权限。这些权限适用于多区域最终一致性（MREC）和多区域强一致性（MRSC）全局表。
+ 全局表需要跨区域复制，DynamoDB 通过 [`AWSServiceRoleForDynamoDBReplication`](#globaltables-replication-slr) 服务相关角色（SLR）进行管理。以下权限允许 DynamoDB 在您首次创建全局表时自动创建此角色：
  + `iam:CreateServiceLinkedRole`
+ 要使用 [https://docs.amazonaws.cn/amazondynamodb/latest/APIReference/API_UpdateTable.html](https://docs.amazonaws.cn/amazondynamodb/latest/APIReference/API_UpdateTable.html) API 创建全局表或添加副本，您必须具有对源表资源的以下权限：
  + `dynamodb:UpdateTable`
+ 要添加副本，您必须具有对区域中表资源的以下权限：
  + `dynamodb:CreateTable`
  + `dynamodb:CreateTableReplica`
  + `dynamodb:Query`
  + `dynamodb:Scan`
  + `dynamodb:UpdateItem`
  + `dynamodb:PutItem`
  + `dynamodb:GetItem`
  + `dynamodb:DeleteItem`
  + `dynamodb:BatchWriteItem`

#### 使用见证者的 MRSC 全局表的其他权限
MRSC 见证者权限

在创建带有见证者区域的多区域强一致性（MRSC）全局表时，对于所有参与区域（包括副本区域和见证者区域）的表资源，您必须具有以下权限：
+ `dynamodb:CreateGlobalTableWitness`

#### 用于创建全局表的 IAM 策略示例


##### 创建跨三个区域的 MREC 或 MRSC 全局表


以下基于身份的策略让您可以在三个区域中创建名为“users”的 MREC 或 MRSC 全局表，包括创建所需的 DynamoDB 复制服务相关角色。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowCreatingUsersGlobalTable",
      "Effect": "Allow",
      "Action": [
        "dynamodb:CreateTable",
        "dynamodb:CreateTableReplica",
        "dynamodb:UpdateTable",
        "dynamodb:Query",
        "dynamodb:Scan",
        "dynamodb:UpdateItem",
        "dynamodb:PutItem",
        "dynamodb:GetItem",
        "dynamodb:DeleteItem",
        "dynamodb:BatchWriteItem"
      ],
      "Resource": [
        "arn:aws:dynamodb:us-east-1:123456789012:table/users",
        "arn:aws:dynamodb:us-east-2:123456789012:table/users",
        "arn:aws:dynamodb:us-west-2:123456789012:table/users"
      ]
    },
    {
      "Sid": "AllowCreatingSLR",
      "Effect": "Allow",
      "Action": [
        "iam:CreateServiceLinkedRole"
      ],
      "Resource": [
        "arn:aws:iam::123456789012:role/aws-service-role/replication.dynamodb.amazonaws.com/AWSServiceRoleForDynamoDBReplication"
      ]
    }
  ]
}
```

------

##### 将 MREC 或 MRSC 全局表的创建限制在特定区域


以下基于身份的策略让您可以使用 [aws:RequestedRegion](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requestedregion) 条件键，跨特定区域创建 DynamoDB 全局表副本，包括创建所需的 DynamoDB 复制服务相关角色。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowAddingReplicasToSourceTable",
      "Effect": "Allow",
      "Action": [
        "dynamodb:UpdateTable"
      ],
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "aws:RequestedRegion": [
            "us-east-1"
          ]
        }
      }
    },
    {
      "Sid": "AllowCreatingReplicas",
      "Effect": "Allow",
      "Action": [
        "dynamodb:CreateTable",
        "dynamodb:CreateTableReplica",
        "dynamodb:UpdateTable",
        "dynamodb:Query",
        "dynamodb:Scan",
        "dynamodb:UpdateItem",
        "dynamodb:PutItem",
        "dynamodb:GetItem",
        "dynamodb:DeleteItem",
        "dynamodb:BatchWriteItem"
      ],
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "aws:RequestedRegion": [
            "us-east-2",
            "us-west-2"
          ]
        }
      }
    },
    {
      "Sid": "AllowCreatingSLR",
      "Effect": "Allow",
      "Action": [
        "iam:CreateServiceLinkedRole"
      ],
      "Resource": [
        "arn:aws:iam::123456789012:role/aws-service-role/replication.dynamodb.amazonaws.com/AWSServiceRoleForDynamoDBReplication"
      ]
    }
  ]
}
```

------

##### 创建具有见证者的 MRSC 全局表


以下基于身份的策略让您可以创建一个名为“users”的 DynamoDB MRSC 全局表（包括创建所需的 DynamoDB 复制服务相关角色），其副本位于 us-east-1 和 us-east-2 中，见证者位于 us-west-2 中。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowCreatingUsersGlobalTableWithWitness",
      "Effect": "Allow",
      "Action": [
        "dynamodb:CreateTable",
        "dynamodb:CreateTableReplica",
        "dynamodb:CreateGlobalTableWitness",
        "dynamodb:UpdateTable",
        "dynamodb:Query",
        "dynamodb:Scan",
        "dynamodb:UpdateItem",
        "dynamodb:PutItem",
        "dynamodb:GetItem",
        "dynamodb:DeleteItem",
        "dynamodb:BatchWriteItem"
      ],
      "Resource": [
        "arn:aws:dynamodb:us-east-1:123456789012:table/users",
        "arn:aws:dynamodb:us-east-2:123456789012:table/users"
      ]
    },
    {
      "Sid": "AllowCreatingSLR",
      "Effect": "Allow",
      "Action": [
        "iam:CreateServiceLinkedRole"
      ],
      "Resource": [
        "arn:aws:iam::123456789012:role/aws-service-role/replication.dynamodb.amazonaws.com/AWSServiceRoleForDynamoDBReplication"
      ]
    }
  ]
}
```

------

##### 将创建 MRSC 见证者限制在特定区域


此基于身份的策略让您可以使用 [aws:RequestedRegion](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requestedregion) 条件键创建 MRSC 全局表（包括创建所需的 DynamoDB 复制服务相关角色），并将副本限制在特定区域，而不限制可在所有区域上的创建见证者。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowCreatingReplicas",
      "Effect": "Allow",
      "Action": [
        "dynamodb:CreateTable",
        "dynamodb:CreateTableReplica",
        "dynamodb:UpdateTable",
        "dynamodb:Query",
        "dynamodb:Scan",
        "dynamodb:UpdateItem",
        "dynamodb:PutItem",
        "dynamodb:GetItem",
        "dynamodb:DeleteItem",
        "dynamodb:BatchWriteItem"
      ],
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "aws:RequestedRegion": [
            "us-east-1",
            "us-east-2"
          ]
        }
      }
    },
    {
      "Sid": "AllowCreatingWitness",
      "Effect": "Allow",
      "Action": [
        "dynamodb:CreateGlobalTableWitness"
      ],
      "Resource": "*"
    },
    {
      "Sid": "AllowCreatingSLR",
      "Effect": "Allow",
      "Action": [
        "iam:CreateServiceLinkedRole"
      ],
      "Resource": [
        "arn:aws:iam::123456789012:role/aws-service-role/replication.dynamodb.amazonaws.com/AWSServiceRoleForDynamoDBReplication"
      ]
    }
  ]
}
```

------

### 更新全局表
更新全局表

要使用 [https://docs.amazonaws.cn/amazondynamodb/latest/APIReference/API_UpdateTable.html](https://docs.amazonaws.cn/amazondynamodb/latest/APIReference/API_UpdateTable.html) API 修改现有全局表的副本设置，对于进行 API 调用的区域中的表资源，您需要具有以下权限：
+ `dynamodb:UpdateTable`

此外，您还可以更新其他全局表配置，例如自动扩缩策略和生存时间设置。这些额外的更新操作需要以下权限：
+ 要通过 [https://docs.amazonaws.cn/amazondynamodb/latest/APIReference/API_UpdateTableReplicaAutoScaling.html](https://docs.amazonaws.cn/amazondynamodb/latest/APIReference/API_UpdateTableReplicaAutoScaling.html) API 更新副本自动扩缩策略，对于包含副本的所有区域中的表资源，您必须具有以下权限：
  + `application-autoscaling:DeleteScalingPolicy`
  + `application-autoscaling:DeleteScheduledAction`
  + `application-autoscaling:DeregisterScalableTarget`
  + `application-autoscaling:DescribeScalableTargets`
  + `application-autoscaling:DescribeScalingActivities`
  + `application-autoscaling:DescribeScalingPolicies`
  + `application-autoscaling:DescribeScheduledActions`
  + `application-autoscaling:PutScalingPolicy`
  + `application-autoscaling:PutScheduledAction`
  + `application-autoscaling:RegisterScalableTarget`
+ 要使用 [https://docs.amazonaws.cn/amazondynamodb/latest/APIReference/API_UpdateTimeToLive.html](https://docs.amazonaws.cn/amazondynamodb/latest/APIReference/API_UpdateTimeToLive.html) API 更新生存时间设置，对于包含副本的所有区域中的表资源，您必须具有以下权限：
  + `dynamodb:UpdateTimeToLive`

  请注意，只有配置了多区域最终一致性（MREC）的全局表支持生存时间（TTL）。有关全局表与 TTL 结合使用的更多信息，请参阅 [DynamoDB 全局表工作原理](https://docs.amazonaws.cn/amazondynamodb/latest/developerguide/V2globaltables_HowItWorks.html)。

### 删除全局表和移除副本
删除全局表和移除副本

要删除全局表，您必须移除所有副本。根据您删除的是带还是不带见证者区域的全局表，此操作所需的权限会有所不同。

#### 删除全局表和移除副本的权限
删除表和移除副本的权限

删除单个副本和完全删除全局表均需要以下权限。删除全局表配置只会移除不同区域中表之间的复制关系。它不会删除剩下的最后一个区域中的基础 DynamoDB 表。最后一个区域中的表会作为标准 DynamoDB 表继续存在，具有相同的数据和设置。这些权限适用于多区域最终一致性（MREC）和多区域强一致性（MRSC）全局表。
+ 要使用 [https://docs.amazonaws.cn/amazondynamodb/latest/APIReference/API_UpdateTable.html](https://docs.amazonaws.cn/amazondynamodb/latest/APIReference/API_UpdateTable.html) API 从全局表中移除副本，对于进行 API 调用的区域中的表资源，您需要具有以下权限：
  + `dynamodb:UpdateTable`
+ 在要移除副本的每个区域，您需要具有对表资源的以下权限：
  + `dynamodb:DeleteTable`
  + `dynamodb:DeleteTableReplica`

#### 使用见证者的 MRSC 全局表的其他权限
MRSC 见证者删除权限

要删除带有见证者的多区域强一致性（MRSC）全局表，对于所有参与区域（包括副本区域和见证者区域）的表资源，您必须具有以下权限：
+ `dynamodb:DeleteGlobalTableWitness`

#### 删除全局表副本的 IAM 策略示例


##### 删除全局表副本


此基于身份的策略让您可以删除名为“users”的 DynamoDB 全局表及其跨三个区域的副本：

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "dynamodb:UpdateTable",
        "dynamodb:DeleteTable",
        "dynamodb:DeleteTableReplica"
      ],
      "Resource": [
        "arn:aws:dynamodb:us-east-1:123456789012:table/users",
        "arn:aws:dynamodb:us-east-2:123456789012:table/users",
        "arn:aws:dynamodb:us-west-2:123456789012:table/users"
      ]
    }
  ]
}
```

------

##### 删除带有见证者的 MRSC 全局表


此基于身份的策略让您可以删除名为“users”的 MRSC 全局表的副本和见证者：

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "dynamodb:UpdateTable",
        "dynamodb:DeleteTable",
        "dynamodb:DeleteTableReplica",
        "dynamodb:DeleteGlobalTableWitness"
      ],
      "Resource": [
        "arn:aws:dynamodb:us-east-1:123456789012:table/users",
        "arn:aws:dynamodb:us-east-2:123456789012:table/users"
      ]
    }
  ]
}
```

------

## 全局表如何使用 Amazon KMS
全局表 Amazon KMS 加密

与所有 DynamoDB 表一样，全局表副本始终使用存储在 Amazon Key Management Service（Amazon KMS）中的加密密钥对静态数据进行加密。

全局表中的所有副本都必须配置为使用相同类型的 KMS 密钥（Amazon 拥有的密钥、Amazon 托管式密钥或客户自主管理型密钥）。

**重要**  
DynamoDB 需要访问副本的加密密钥才能删除副本。如果您因删除副本而想要禁用或删除用于加密该副本的客户自主管理型密钥，则应先删除该副本，等待剩余副本之一的表状态更改为 `ACTIVE`，然后再禁用或删除该密钥。

对于配置为多区域最终一致性（MREC）的全局表，如果您禁用或撤销 DynamoDB 对用于加密副本的客户自主管理型密钥的访问权限，则复制到副本和从副本进行复制的过程将停止，而副本状态将更改为 `INACCESSIBLE_ENCRYPTION_CREDENTIALS`。如果 MREC 全局表中的副本保持 `INACCESSIBLE_ENCRYPTION_CREDENTIALS` 状态的时间超过 20 小时，则该副本将不可逆地转换为单区域 DynamoDB 表。

对于配置为多区域强一致性（MRSC）的全局表，如果您禁用或撤销 DynamoDB 对用于加密副本的客户自主管理型密钥的访问权限，则复制到副本和从副本进行复制的过程将停止，尝试对副本执行写入或强一致性读取操作将返回错误，而副本状态将更改为 `INACCESSIBLE_ENCRYPTION_CREDENTIALS`。如果 MRSC 全局表中的副本保持 `INACCESSIBLE_ENCRYPTION_CREDENTIALS` 状态的时间超过七天，则根据撤销的特定权限，该副本将归档或变得永久无法访问。