

# 在表存储桶中使用具有 AWS KMS 密钥的服务器端加密（SSE-KMS）
<a name="s3-tables-kms-encryption"></a>

**Topics**
+ [SSE-KMS 存储桶如何用于表和表存储桶](#kms-tables-how)
+ [对表和表存储桶强制使用 SSE-KMS 并确定其范围](tables-require-kms.md)
+ [监控和审计表和表存储桶的 SSE-KMS 加密](#kms-tables-audit)
+ [S3 表类数据存储服务 SSE-KMS 加密的权限要求](s3-tables-kms-permissions.md)
+ [在表存储桶中指定具有 AWS KMS 密钥的服务器端加密（SSE-KMS）](s3-tables-kms-specify.md)

表存储桶具有默认加密配置，该配置通过使用具有 Amazon S3 托管式密钥的服务器端加密（SSE-S3）来自动加密表。此加密适用于 S3 表存储桶中的所有表，而您无需支付任何费用。

如果您需要对加密密钥进行更多控制，例如管理密钥轮换和访问策略授予，则可以将表存储桶配置为使用具有 AWS Key Management Service（AWS KMS）密钥的服务器端加密（SSE-KMS）。AWS KMS 中的安全控制可帮助您满足与加密相关的合规性要求。有关 SSE-KMS 的更多信息，请参阅 [使用具有 AWS KMS 密钥的服务器端加密（SSE-KMS）](UsingKMSEncryption.md)。

## SSE-KMS 存储桶如何用于表和表存储桶
<a name="kms-tables-how"></a>

表存储桶中的 SSE-KMS 与通用存储桶中的 SSE-KMS 在以下几个方面有所不同：
+ 您可以为表存储桶和各个表指定加密设置。
+ 您只能将客户自主管理型密钥与 SSE-KMS 结合使用。不支持 AWS 托管式密钥。
+ 您必须向某些角色和 AWS 服务主体授予访问 AWS KMS 密钥的权限。有关更多信息，请参阅 [S3 表类数据存储服务 SSE-KMS 加密的权限要求](s3-tables-kms-permissions.md)。这包括向以下主体授予访问权限：
  + S3 维护主体：用于对加密的表执行表维护
  + S3 表类数据存储服务集成角色：用于在 AWS 分析服务中处理加密的表
  + 客户端访问角色：用于从 Apache Iceberg 客户端直接访问加密的表
  + S3 元数据主体：用于更新加密的 S3 元数据表
+ 加密的表使用表级别密钥，此类密钥可最大限度地减少向 AWS KMS 发出的请求数量，从而提高处理 SSE-KMS 加密表的成本效益。

**表存储桶的 SSE-KMS 加密**  
创建表存储桶时，可以选择 SSE-KMS 作为默认加密类型，并选择将用于加密的特定 KMS 密钥。在该存储桶中创建的任何表都将自动从其表存储桶继承这些加密设置。您可以随时使用 AWS CLI、S3 API 或 AWS SDK 来修改或移除表存储桶上的默认加密设置。当您修改表存储桶上的加密设置时，这些设置仅适用于在该存储桶中创建的新表。而不更改先前存在的表的加密设置。有关更多信息，请参阅 [为表存储桶指定加密](s3-tables-kms-specify.md#specify-kms-table-bucket)。

**表的 SSE-KMS 加密**  
您还可以选择使用不同的 KMS 密钥来加密单个表，而不管存储桶的默认加密配置如何。要为单个表设置加密，必须在创建表时指定所需的加密密钥。如果要更改现有表的加密，则需要使用所需密钥创建一个表，并将数据从旧表复制到新表。有关更多信息，请参阅 [为表指定加密](s3-tables-kms-specify.md#specify-kms-table)。

使用 AWS KMS 加密时，S3 表类数据存储服务会自动创建唯一的表级别数据密钥，用于加密与每个表关联的新对象。这些密钥在有限的时段内使用，最大限度地减少了在加密操作期间对额外 AWS KMS 请求的需求，并降低了加密成本。这类似于 [SSE-KMS 的 S3 存储桶密钥](bucket-key.md#bucket-key-overview)。

# 对表和表存储桶强制使用 SSE-KMS 并确定其范围
<a name="tables-require-kms"></a>

您可以使用 S3 表类数据存储服务基于资源的策略、KMS 密钥策略、基于 IAM 身份的策略或这些策略的任意组合，来强制对 S3 表和表存储桶使用 SSE-KMS。有关表的身份和资源策略的更多信息，请参阅 [S3 表类数据存储服务的访问管理](s3-tables-setting-up.md)。有关编写密钥策略的信息，请参阅《AWS Key Management Service Developer Guide》**中的 [Key policies](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html)。以下示例说明如何使用策略来强制执行 SSE-KMS。

## 使用表存储桶策略强制对所有表使用 SSE-KMS
<a name="w2aac20c35c15b3c11b5b1"></a>

这是表存储桶策略的示例，该策略禁止用户在特定的表存储桶中创建表，除非他们使用特定 AWS KMS 密钥对表进行加密。要使用此策略，请将*用户输入占位符*替换为您自己的信息：

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "EnforceKMSEncryption",
      "Effect": "Deny",
      "Principal": "*",
      "Action": [
        "s3tables:CreateTable"
      ],
      "Resource": [
        "arn:aws:s3tables:us-west-2:111122223333:bucket/example-table-bucket/*"
      ],
      "Condition": {
        "StringNotEquals": {
          "s3tables:sseAlgorithm": "aws:kms",
          "s3tables:kmsKeyArn": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
        }
      }
    }
  ]
}
```

------

## 要求用户将 SSE-KMS 加密与 IAM 策略结合使用
<a name="w2aac20c35c15b3c11b7b1"></a>

此 IAM 身份策略要求用户在创建或配置 S3 表类数据存储服务资源时使用特定的 AWS KMS 密钥进行加密。要使用此策略，请将*用户输入占位符*替换为您自己的信息：

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "RequireKMSKeyOnTables",
      "Action": [
          "s3tables:CreateTableBucket",
          "s3tables:PutTableBucketEncryption",
          "s3tables:CreateTable"
      ]
      "Effect": "Deny",
      "Resource": "*",
      "Condition": {
        "StringNotEquals": {
            "s3tables:sseAlgorithm": "aws:kms",
            "s3tables:kmsKeyArn": "<key_arn>"
        }
      }
    }
  ]
}
```

## 使用 KMS 密钥策略将密钥的使用限制为特定的表存储桶
<a name="w2aac20c35c15b3c11b9b1"></a>

此示例 KMS 密钥策略仅让特定用户将密钥用于特定表存储桶中的加密操作。这种类型的策略对于在跨账户场景中限制对密钥的访问非常有用。要使用此策略，请将*用户输入占位符*替换为您自己的信息：

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Id": "Id",
  "Statement": [
    {
      "Sid": "AllowPermissionsToKMS",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:root"
      },
      "Action": [
        "kms:GenerateDataKey",
        "kms:Decrypt"
      ],
      "Resource": "*",
      "Condition": {
        "StringLike": {
          "kms:EncryptionContext:aws:s3:arn": "<table-bucket-arn>/*"
        }
      }
    }
  ]
}
```

------

## 监控和审计表和表存储桶的 SSE-KMS 加密
<a name="kms-tables-audit"></a>

要审计为 SSE-KMS 加密数据使用 AWS KMS 密钥的情况，您可以使用 AWS CloudTrail 日志。您可以深入了解自己的[加密操作](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#cryptographic-operations)，例如 `GenerateDataKey` 和 `Decrypt`。CloudTrail 支持多种[属性值](https://docs.aws.amazon.com/awscloudtrail/latest/APIReference/API_LookupEvents.html)来筛选您的搜索，包括事件名称、用户名和事件源。

可以使用 CloudTrail 事件跟踪 Amazon S3 表和表存储桶的加密配置请求。CloudTrail 日志中使用以下 API 事件名称：
+ `s3tables:PutTableBucketEncryption`
+ `s3tables:GetTableBucketEncryption`
+ `s3tables:DeleteTableBucketEncryption`
+ `s3tables:GetTableEncryption`
+ `s3tables:CreateTable`
+ `s3tables:CreateTableBucket`

**注意**  
表存储桶不支持 EventBridge。

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

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

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

**其他权限**  
根据您的应用场景，需要以下附加权限：  
+ **AWS 分析服务集成的权限**：如果您在 AWS 分析服务中使用由 SSE-KMS 加密的表，则集成角色需要具有使用 KMS 密钥的权限。
+ **直接访问的权限**：如果您通过诸如 Amazon S3 表类数据存储服务 Iceberg REST 端点或适用于 Apache Iceberg 的 Amazon S3 表类数据存储服务目录之类的方法直接使用由 SSE-KMS 加密的表，则需要向客户端使用的 IAM 角色授予访问您的密钥的权限。
+ **S3 元数据表的权限**：如果您对 S3 元数据表使用 SSE-KMS 加密，则需要向 S3 元数据服务主体 (`metadata.s3.amazonaws.com`) 提供对 KMS 密钥的访问权限。这可让 S3 元数据更新加密的表，这样它们就能够反映您的最新数据更改。

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

**Topics**
+ [向 S3 表类数据存储服务维护服务主体授予对 KMS 密钥的权限](#tables-kms-maintenance-permissions)
+ [向 IAM 主体授予在集成的 AWS 分析服务中使用加密表的权限](#tables-kms-integration-permissions)
+ [向 IAM 主体授予直接使用加密表的权限](#tables-kms-direct-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 主体授予在集成的 AWS 分析服务中使用加密表的权限
<a name="tables-kms-integration-permissions"></a>

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

当您在这些服务中使用通过 SSE-KMS 加密的表时，您使用的角色需要拥有使用 AWS KMS 密钥进行加密操作的权限。您可以将这些权限应用于在集成期间创建的 `S3TablesRoleForLakeFormation` 角色或您自己的 IAM 角色。

以下内联 IAM 策略示例可用于向 `S3TablesRoleForLakeFormation` 服务角色授予使用您账户中的特定 KMS 密钥进行加密操作的权限。要使用此策略，请将*输入占位符值*替换为您自己的信息。

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

## 向 IAM 主体授予直接使用加密表的权限
<a name="tables-kms-direct-permissions"></a>

当您通过第三方或直接访问方法处理加密表时，必须向您使用的角色授予对 KMS 密钥的访问权限。以下示例说明如何通过 IAM 策略或 KMS 密钥策略授予访问权限。

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

将此内联策略附加到您的 IAM 角色，以支持访问 KMS 密钥。要使用此策略，请将*输入占位符值*替换为您自己的 KMS 密钥 arn。

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

****  

```
{
    "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 密钥，以让指定的 AWS KMS 角色使用该密钥。要使用此策略，请将*输入占位符值*替换为您的 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": "*"
}
```

------

## 向 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>/*"
                }
            }
        }
    ]
}
```

------

# 在表存储桶中指定具有 AWS KMS 密钥的服务器端加密（SSE-KMS）
<a name="s3-tables-kms-specify"></a>

默认情况下，所有 Amazon S3 表存储桶都配置了加密，所有在表存储桶中创建的新表都会自动静态加密。具有 Amazon S3 托管式密钥的服务器端加密（SSE-S3）是每个表存储桶的默认加密配置。如果您要指定不同的加密类型，可以使用具有 AWS Key Management Service（AWS KMS）密钥的服务器端加密（SSE-KMS）。

 可以在 `CreateTableBucket` 或 `CreateTable` 请求中指定 SSE-KMS 加密，也可以在 `PutTableBucketEncryption` 请求中设置表存储桶中的默认加密配置。

**重要**  
要支持对通过 SSE-KMS 加密的表和表存储桶进行自动维护，您必须向 maintenance.s3tables.amazonaws.com 服务主体授予使用 KMS 密钥的权限。有关更多信息，请参阅 [S3 表类数据存储服务 SSE-KMS 加密的权限要求](s3-tables-kms-permissions.md)。

## 为表存储桶指定加密
<a name="specify-kms-table-bucket"></a>

在创建新的表存储桶时，您可以指定 SSE-KMS 作为默认加密类型，有关示例，请参阅[创建表存储桶](s3-tables-buckets-create.md)。创建表存储桶后，您可以使用 REST API 操作、AWS SDK 和 AWS Command Line Interface（AWS CLI）来指定将 SSE-KMS 用作默认加密设置。

**注意**  
 当您将 SSE-KMS 指定为默认加密类型时，用于加密的密钥必须支持访问 S3 表类数据存储服务维护服务主体。如果维护服务主体没有访问权限，您将无法在该表存储桶中创建表。有关更多信息，请参阅 [向 S3 表类数据存储服务维护服务主体授予对 KMS 密钥的权限](s3-tables-kms-permissions.md#tables-kms-maintenance-permissions)。

### 使用 AWS CLI
<a name="w2aac20c35c15b3c17b9b9b1"></a>

要使用以下示例 AWS CLI 命令，请将*用户输入占位符*替换为您自己的信息。

```
aws s3tables put-table-bucket-encryption \
    --table-bucket-arn arn:aws:s3tables:us-east-1:111122223333:bucket/amzn-s3-demo-table-bucket; \
    --encryption-configuration '{
        "sseAlgorithm": "aws:kms",
        "kmsKeyArn": "arn:aws:kms:us-east-1:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
    }' \
    --region us-east-1
```

您可以使用 [DeleteTableBucketEncryption](https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3TableBuckets_DeleteTableBucketEncryption.html) API 操作移除表存储桶的默认加密设置。移除加密设置后，在表存储桶中创建的新表将使用默认的 SSE-S3 加密。

## 为表指定加密
<a name="specify-kms-table"></a>

在使用查询引擎、REST API 操作、AWS SDK 和 AWS Command Line Interface（AWS CLI）创建新表时，可以对该表应用 SSE-KMS 加密。您在创建表时指定的加密设置优先于表存储桶的默认加密设置。

**注意**  
对表使用 SSE-KMS 加密时，用于加密的密钥必须支持 S3 表类数据存储服务维护服务主体访问该表。如果维护服务主体没有访问权限，您将无法创建表。有关更多信息，请参阅 [向 S3 表类数据存储服务维护服务主体授予对 KMS 密钥的权限](s3-tables-kms-permissions.md#tables-kms-maintenance-permissions)。

****所需的权限****

创建加密表需要以下权限
+ `s3tables:CreateTable`
+ `s3tables:PutTableEncryption`

## 使用 AWS CLI
<a name="w2aac20c35c15b3c17c13b1"></a>

以下 AWS CLI 示例使用基本架构创建一个新表，并使用客户自主管理型 AWS KMS 密钥对其进行加密。要使用该命令，请将*用户输入占位符* 替换为您自己的信息。

```
aws s3tables create-table \
  --table-bucket-arn "arn:aws:s3tables:Region:ownerAccountId:bucket/amzn-s3-demo-table-bucket" \
  --namespace "mydataset" \
  --name "orders" \
  --format "ICEBERG" \
  --encryption-configuration '{
    "sseAlgorithm": "aws:kms",
    "kmsKeyArn": "arn:aws:kms:Region:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
  }' \
  --metadata '{
    "iceberg": {
      "schema": {
        "fields": [
          {
            "name": "order_id",
            "type": "string",
            "required": true
          },
          {
            "name": "order_date",
            "type": "timestamp",
            "required": true
          },
          {
            "name": "total_amount",
            "type": "decimal(10,2)",
            "required": true
          }
        ]
      }
    }
  }'
```