

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 在資料表儲存貯體中使用伺服器端加密與 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 Tables 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 managed 金鑰搭配使用。
+ 您必須授予特定角色 AWS 和服務主體存取 AWS KMS 金鑰的許可。如需詳細資訊，請參閱[S3 Tables SSE-KMS 加密的許可要求](s3-tables-kms-permissions.md)。這包括將存取權授予：
  + S3 維護主體 – 用於對加密的資料表執行資料表維護
  + 您的 S3 Tables 整合角色 – 用於在 AWS 分析服務中使用加密的資料表
  + 您的用戶端存取角色 – 用於從 Apache Iceberg 用戶端直接存取加密的資料表
  + S3 Metadata 主體 – 用於更新加密的 S3 Metadata 資料表
+ 加密的資料表使用資料表層級金鑰，可將對 提出的請求數量降至最低 AWS KMS ，讓使用 SSE-KMS 加密的資料表更具成本效益。

**資料表儲存貯體的 SSE-KMS 加密**  
建立資料表儲存貯體時，您可以選擇 SSE-KMS 做為預設加密類型，然後選取將用於加密的特定 KMS 金鑰。在該儲存貯體中建立的任何資料表，都會自動從其資料表儲存貯體繼承這些加密設定。您可以隨時使用 AWS CLI、S3 API 或 AWS SDKs 來修改或移除資料表儲存貯體上的預設加密設定。當您修改資料表儲存貯體上的加密設定時，這些設定僅適用於在該儲存貯體中建立的新資料表。預先存在資料表的加密設定不會變更。如需詳細資訊，請參閱[指定資料表儲存貯體的加密](s3-tables-kms-specify.md#specify-kms-table-bucket)。

**資料表的 SSE-KMS 加密**  
您也可以選擇使用不同的 KMS 金鑰來加密個別資料表，無論儲存貯體的預設加密組態為何。若要設定個別資料表的加密，您必須在建立資料表時，指定所需的加密金鑰。如果您想要變更現有資料表的加密，您需要使用所需的金鑰建立資料表，並將資料從舊資料表複製到新資料表。如需詳細資訊，請參閱[指定資料表加密](s3-tables-kms-specify.md#specify-kms-table)。

使用 AWS KMS 加密時，S3 Tables 會自動建立唯一的資料表層級資料金鑰，以加密與每個資料表相關聯的新物件。這些金鑰在有限的期間內使用，在加密操作期間將額外 AWS KMS 請求的需求降至最低，並降低加密成本。此類似於 [適用於 SSE-KMS 的 S3 儲存貯體金鑰](bucket-key.md#bucket-key-overview)。

# 針對資料表和資料表儲存貯體強制執行和調整 SSE-KMS 使用範圍
<a name="tables-require-kms"></a>

您可以使用 S3 Tables 資源型政策、KMS 金鑰政策、IAM 身分型政策，或這些政策的任意組合，強制使用 S3 資料表和資料表儲存貯體的 SSE-KMS。如需資料表的身分和資源政策的詳細資訊，請參閱 [S3 Tables 的存取管理](s3-tables-setting-up.md)。如需關於寫入金鑰政策的詳細資訊，請參閱《AWS Key Management Service 開發人員指南》**中的[金鑰政策](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": "EnforceKMSEncryptionAlgorithm",
      "Effect": "Deny",
      "Principal": "*",
      "Action": [
        "s3tables:CreateTable"
      ],
      "Resource": [
        "arn:aws:s3tables:us-west-2:111122223333:bucket/example-table-bucket/*"
      ],
      "Condition": {
        "StringNotEquals": {
          "s3tables:sseAlgorithm": "aws:kms"
        }
      }
    },
    {
      "Sid": "EnforceKMSEncryptionKey",
      "Effect": "Deny",
      "Principal": "*",
      "Action": [
        "s3tables:CreateTable"
      ],
      "Resource": [
        "arn:aws:s3tables:us-west-2:111122223333:bucket/example-table-bucket/*"
      ],
      "Condition": {
        "StringNotEquals": {
          "s3tables:kmsKeyArn": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
        }
      }
    }
  ]
}
```

------

## 要求使用者搭配 IAM 政策使用 SSE-KMS 加密
<a name="w2aac20c35c15b3c11b7b1"></a>

此 IAM 身分政策要求使用者在建立或設定 S3 Tables 資源時使用特定 AWS KMS 金鑰進行加密。若要使用此政策，請以您自己的資訊取代*使用者輸入預留位置*。

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "RequireSSEKMSOnTables",
      "Action": [
          "s3tables:CreateTableBucket",
          "s3tables:PutTableBucketEncryption",
          "s3tables:CreateTable"
      ],
      "Effect": "Deny",
      "Resource": "*",
      "Condition": {
        "StringNotEquals": {
            "s3tables:sseAlgorithm": "aws:kms"
        }
      }
    },
    {
      "Sid": "RequireKMSKeyOnTables",
      "Action": [
          "s3tables:CreateTableBucket",
          "s3tables:PutTableBucketEncryption",
          "s3tables:CreateTable"
      ],
      "Effect": "Deny",
      "Resource": "*",
      "Condition": {
        "StringNotEquals": {
            "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 Tables 和資料表儲存貯體的加密組態請求。CloudTrail 日誌使用下列 API 事件名稱：
+ `s3tables:PutTableBucketEncryption`
+ `s3tables:GetTableBucketEncryption`
+ `s3tables:DeleteTableBucketEncryption`
+ `s3tables:GetTableEncryption`
+ `s3tables:CreateTable`
+ `s3tables:CreateTableBucket`

**注意**  
資料表儲存貯體不支援 EventBridge。

# S3 Tables SSE-KMS 加密的許可要求
<a name="s3-tables-kms-permissions"></a>

當您對 S3 資料表儲存貯體中的資料表使用伺服器端加密搭配 AWS Key Management Service (AWS KMS) 金鑰 (SSE-KMS) 時，您需要授予帳戶中不同身分的許可。至少您的存取身分和 S3 Tables 維護主體需要您的金鑰存取權，所需的其他權限取決於您的使用案例。

**必要許可**   
若要存取使用 KMS 金鑰進行加密的資料表，您需要該金鑰的這些使用權限：  
+ `kms:GenerateDataKey`
+ `kms:Decrypt`
若要在資料表上使用 SSE-KMS，Amazon S3 Tables 維護服務主體 (`maintenance.s3tables.amazonaws.com`) 需要金鑰的 `kms:GenerateDataKey` 和 `kms:Decrypt` 權限。

**額外許可**  
根據您的使用案例，需要這些額外的權限：  
+ ** AWS 分析服務和直接存取的許可** – 如果您透過 AWS 分析服務或第三方引擎直接存取 S3 資料表來使用 SSE-KMS 加密資料表，則您使用的 IAM 角色需要許可才能使用 KMS 金鑰。
+ **已啟用 Lake Formation 的許可** – 如果您已選擇加入 AWS Lake Formation 進行存取控制，Lake Formation 服務角色需要許可才能使用 KMS 金鑰。
+ **S3 Metadata 資料表的權限** – 如果您針對 S3 Metadata 資料表使用 SSE-KMS 加密，您需要提供 S3 Metadata 服務主體 (`metadata.s3.amazonaws.com`) 存取 KMS 金鑰的權限。這可讓 S3 Metadata 更新加密的資料表，以便反映您最新的資料變更。

**注意**  
對於跨帳戶 KMS 金鑰，您的 IAM 角色需要金鑰存取權，和金鑰政策中的明確授權。如需 KMS 金鑰跨帳戶許可的詳細資訊，請參閱*AWS Key Management Service 《服務開發人員指南*》中的[允許外部 AWS 帳戶使用 KMS 金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-modifying-external-accounts.html#cross-account-console)。

**Topics**
+ [將 S3 Tables 維護服務主體權限授予 KMS 金鑰](#tables-kms-maintenance-permissions)
+ [授予 IAM 主體在整合 AWS 分析服務中使用加密資料表的許可](#tables-kms-integration-permissions)
+ [啟用 Lake Formation 時，授予 IAM 主體使用加密資料表的許可](#tables-kms-lf-permissions)
+ [授予 S3 Metadata 服務主體使用您的 KMS 金鑰的權限](#tables-kms-metadata-permissions)

## 將 S3 Tables 維護服務主體權限授予 KMS 金鑰
<a name="tables-kms-maintenance-permissions"></a>

需要此權限才能建立 SSE-KMS 加密資料表，並允許自動維護資料表，例如壓縮、快照管理，以及加密資料表上未參照的檔案移除。

**注意**  
每當您提出建立 SSE-KMS 加密資料表的請求時，S3 Tables 會檢查以確保 `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 資料表，您可以將資料表儲存貯體與 整合 AWS Glue Data Catalog。此整合可讓 AWS 分析服務自動探索和存取資料表資料。如需有關整合的詳細資訊，請參閱 [將 Amazon S3 Tables 與 AWS 分析服務整合](s3-tables-integrating-aws.md)。

當您透過 AWS 分析服務或第三方和開放原始碼引擎直接存取 S3 資料表來使用 SSE-KMS 加密資料表時，您使用的 IAM 角色需要許可，才能將 AWS KMS 金鑰用於加密操作。

您可以透過連接到角色的 IAM 政策或透過 KMS 金鑰政策授予 KMS 金鑰存取權。

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

將此內嵌政策連接至您用於查詢以允許 KMS 金鑰存取的 IAM 角色。將 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>

如果您已選擇加入 AWS Lake Formation S3 Tables 整合的存取控制，Lake Formation 服務角色需要許可，才能使用 AWS 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 Metadata 服務主體使用您的 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) 使用伺服器端加密 (SSE-KMS)。

 您可以在 `CreateTableBucket` 或 `CreateTable` 請求中指定 SSE-KMS 加密，也可以在 `PutTableBucketEncryption` 請求中的資料表儲存貯體中設定預設加密組態。

**重要**  
若要允許自動維護 SSE-KMS 加密資料表和資料表儲存貯體，您必須授予 maintenance.s3tables.amazonaws.com 服務主體許可權，才能使用 KMS 金鑰。如需詳細資訊，請參閱[S3 Tables SSE-KMS 加密的許可要求](s3-tables-kms-permissions.md)。

## 指定資料表儲存貯體的加密
<a name="specify-kms-table-bucket"></a>

您可以在建立新資料表儲存貯體時，將 SSE-KMS 指定為預設加密類型。如需範例，請參閱 [建立資料表儲存貯體](s3-tables-buckets-create.md)。建立資料表儲存貯體之後，您可以使用 REST API 操作、 AWS SDKs 和 AWS Command Line Interface ()，指定使用 SSE-KMS 做為預設加密設定AWS CLI。

**注意**  
 當您將 SSE-KMS 指定為預設加密類型時，用於加密的金鑰必須允許存取 S3 Tables 維護服務主體。如果維護服務主體無法存取，便無法在該資料表儲存貯體中建立資料表。如需詳細資訊，請參閱[將 S3 Tables 維護服務主體權限授予 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 SDKs，您可以將 SSE-KMS 加密套用至新資料表AWS CLI。 AWS Command Line Interface 您在建立資料表時指定的加密設定，優先於資料表儲存貯體的預設加密設定。

**注意**  
當您對資料表使用 SSE-KMS 加密時，必須允許 S3 Tables 維護服務主體存取用於加密的金鑰。如果維護服務主體無法存取，便無法建立資料表。如需詳細資訊，請參閱[將 S3 Tables 維護服務主體權限授予 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
          }
        ]
      }
    }
  }'
```