

# S3 表类数据存储服务 SSE-KMS 加密的权限要求
<a name="s3-tables-kms-permissions"></a>

当您对 S3 表存储桶中的表使用具有 Amazon Key Management Service（Amazon KMS）密钥的服务器端加密（SSE-KMS）时，您需要为账户中的不同身份授予权限。您的访问身份和 S3 表类数据存储服务维护主体至少需要具有访问您的密钥的权限，所需的其它权限取决于您的应用场景。

**所需权限**   
要访问使用 KMS 密钥加密的表，您需要对该密钥具有以下权限：  
+ `kms:GenerateDataKey`
+ `kms:Decrypt`
要对表使用 SSE-KMS，Amazon S3 表类数据存储服务维护服务主体 (`maintenance.s3tables.amazonaws.com`) 需要对密钥具有 `kms:GenerateDataKey` 和 `kms:Decrypt` 权限。

**其他权限**  
根据您的应用场景，需要以下附加权限：  
+ **Amazon 分析服务的权限与直接访问**：如果您通过 Amazon 分析服务或直接访问 S3 表的第三方引擎来处理使用 SSE-KMS 加密的表，则您使用的 IAM 角色需要具有使用 KMS 密钥的权限。
+ **启用 Lake Formation 时的权限**：如果您选择加入 Amazon Lake Formation 来进行访问控制，那么 Lake Formation 服务角色需要具有使用您的 KMS 密钥的权限。
+ **S3 元数据表的权限**：如果您对 S3 元数据表使用 SSE-KMS 加密，则需要向 S3 元数据服务主体 (`metadata.s3.amazonaws.com`) 提供对 KMS 密钥的访问权限。这可让 S3 元数据更新加密的表，这样它们就能够反映您的最新数据更改。

**注意**  
对于跨账户 KMS 密钥，您的 IAM 角色在密钥策略中同时需要密钥访问权限和显式授权。有关 KMS 密钥的跨账户权限的更多信息，请参阅《Amazon Key Management Service Service Developer Guide》**中的 [Allowing external Amazon accounts to use a KMS key](https://docs.amazonaws.cn/kms/latest/developerguide/key-policy-modifying-external-accounts.html#cross-account-console)。

**Topics**
+ [向 S3 表类数据存储服务维护服务主体授予对 KMS 密钥的权限](#tables-kms-maintenance-permissions)
+ [向 IAM 主体授予在集成的 Amazon 分析服务中使用加密表的权限](#tables-kms-integration-permissions)
+ [当启用 Lake Formation 时向 IAM 主体授予使用加密表的权限](#tables-kms-lf-permissions)
+ [向 S3 元数据服务主体授予使用您的 KMS 密钥的权限](#tables-kms-metadata-permissions)

## 向 S3 表类数据存储服务维护服务主体授予对 KMS 密钥的权限
<a name="tables-kms-maintenance-permissions"></a>

需要此权限才能创建通过 SSE-KMS 加密的表，并支持对加密的表进行自动表维护，例如压缩、快照管理和未引用文件移除。

**注意**  
每当您发出请求来创建通过 SSE-KMS 加密的表时，S3 表类数据存储服务都会进行检查，以确保 `maintenance.s3tables.amazonaws.com` 主体有权访问您的 KMS 密钥。要执行此检查，需要在表存储桶中临时创建一个零字节对象，而[未引用文件移除](s3-table-buckets-maintenance.md#s3-table-bucket-maintenance-unreferenced)维护操作将自动移除该对象。如果您为加密指定的 KMS 密钥没有维护访问权限，则 createTable 操作将失败。

要授予对通过 SSE-KMS 加密的表的维护访问权限，您可以使用以下示例密钥策略。在此策略中，向 `maintenance.s3tables.amazonaws.com` 服务主体授予使用特定 KMS 密钥对特定表存储桶中的表进行加密和解密的权限。要使用此策略，请将{{用户输入占位符}}替换为您自己的信息：

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "EnableKeyUsage",
            "Effect": "Allow",
            "Principal": {
                "Service": "maintenance.s3tables.amazonaws.com"            
            },
            "Action": [
                "kms:GenerateDataKey",
                "kms:Decrypt"
            ],
            "Resource": "arn:aws:kms:{{us-east-1}}:{{111122223333}}:key/{{key-id}}",
            "Condition": {
                "StringLike": {
                    "kms:EncryptionContext:aws:s3:arn":"{{<table-or-table-bucket-arn>}}/*"
                }
            }
        }
    ]
}
```

------

## 向 IAM 主体授予在集成的 Amazon 分析服务中使用加密表的权限
<a name="tables-kms-integration-permissions"></a>

要在 Amazon 分析服务中使用 S3 表，可以将表存储桶与 Amazon Glue Data Catalog 集成。这种集成支持 Amazon 分析服务自动发现和访问表数据。有关集成的更多信息，请参阅[将 Amazon S3 表类数据存储服务与 Amazon 分析服务集成](s3-tables-integrating-aws.md)。

当您通过 Amazon 分析服务或直接访问 S3 表的第三方和开源引擎来处理使用 SSE-KMS 加密的表时，您使用的 IAM 角色需要具有使用 Amazon KMS 密钥进行加密操作的权限。

您可以通过附加到您的角色的 IAM 策略或 KMS 密钥策略来授予 KMS 密钥访问权限。

------
#### [ IAM policy ]

将此内联策略附加到您用于查询的 IAM 角色，以支持访问 KMS 密钥。将 KMS 密钥 ARN 替换为您自己的 ARN。

```
{
    "Version":"2012-10-17",		 	 	 ,                    
    "Statement": [
        {
            "Sid": "AllowKMSKeyUsage",
            "Effect": "Allow",
            "Action": [
                "kms:Decrypt",
                "kms:GenerateDataKey"
            ],
            "Resource": "arn:aws:kms:us-west-2:{{111122223333}}:key/{{1234abcd-12ab-34cd-56ef-1234567890ab}}"
        }
    ]
}
```

------
#### [ KMS key policy ]

或者，将此语句附加到您的 KMS 密钥策略，以支持指定的 IAM 角色使用密钥。将角色 ARN 替换为您用于查询的 IAM 角色。

```
{
    "Sid": "Allow use of the key",
    "Effect": "Allow",
    "Principal": {
        "AWS": [
            "arn:aws:iam::{{<catalog-account-id>}}:role/{{<role-name>}}"
        ]
    },
    "Action": [
        "kms:Decrypt",
        "kms:GenerateDataKey",
    ],
    "Resource": "*"
}
```

------

## 当启用 Lake Formation 时向 IAM 主体授予使用加密表的权限
<a name="tables-kms-lf-permissions"></a>

如果您已选择加入 Amazon Lake Formation 以实现对 S3 表类数据存储服务集成的访问控制，那么 Lake Formation 服务角色需要具有使用 Amazon KMS 密钥进行加密操作的权限。Lake Formation 使用此角色代表访问表的主体提供凭证。

以下 KMS 密钥策略示例向 Lake Formation 服务角色授予权限，以便在您的账户中使用特定的 KMS 密钥进行加密操作。请将占位符值替换为您自己的值。

```
{
  "Sid": "AllowTableRoleAccess",
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::{{111122223333}}:role/service-role/S3TablesRoleForLakeFormation"
  },
  "Action": [
      "kms:GenerateDataKey", 
      "kms:Decrypt"
  ],
  "Resource": "{{<kms-key-arn>}}"
}
```

## 向 S3 元数据服务主体授予使用您的 KMS 密钥的权限
<a name="tables-kms-metadata-permissions"></a>

要支持 Amazon S3 更新通过 SSE-KMS 加密的元数据表并对这些元数据表执行维护，您可以使用以下示例密钥策略。在此策略中，您可以让 `metadata.s3.amazonaws.com` 和 `maintenance.s3tables.amazonaws.com` 服务主体使用特定密钥对特定表存储桶中的表进行加密和解密。要使用此策略，请将{{用户输入占位符}}替换为您自己的信息：

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "EnableKeyUsage",
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "maintenance.s3tables.amazonaws.com",
                    "metadata.s3.amazonaws.com"
                ]           
            },
            "Action": [
                "kms:GenerateDataKey",
                "kms:Decrypt"
            ],
            "Resource": "{{arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab}}",
            "Condition": {
                "StringLike": {
                    "kms:EncryptionContext:aws:s3:arn":"{{<table-or-table-bucket-arn>}}/*"
                }
            }
        }
    ]
}
```

------