

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

# 靜態加密
<a name="encryption"></a>

您可以在 Amazon Athena 中，針對同一區域和有限數量區域的 Simple Storage Service (Amazon S3) 中的加密資料執行查詢。您也可以加密 Amazon S3 中的查詢結果和 AWS Glue Data Catalog 中的資料。

您可以加密 Athena 中的以下資產：
+ Simple Storage Service (Amazon S3) 中所有查詢的結果，Athena 會將其存放在稱為 Simple Storage Service (Amazon S3) 結果位置的位置。您可以加密存放在 Simple Storage Service (Amazon S3) 中的查詢結果，而不論 Simple Storage Service (Amazon S3) 中的基礎資料集是否加密。如需相關資訊，請參閱[加密 Amazon S3 中存放的 Athena 查詢結果](encrypting-query-results-stored-in-s3.md)。
+ Data Catalog 中的 AWS Glue 資料。如需相關資訊，請參閱[AWS Glue Data Catalog 中加密中繼資料的許可](#glue-encryption)。

**注意**  
當您使用 Athena 讀取加密資料表時，Athena 會使用為資料表資料指定的加密選項，而不是針對查詢結果的加密選項。如果針對查詢結果和資料表資料設定不同的加密方法或金鑰，則 Athena 讀取資料表資料時，不會使用用於加密或解密查詢結果的加密選項和金鑰。  
不過，如果您使用 Athena 將資料插入具有加密資料的資料表，Athena 會使用為查詢結果指定的加密組態來加密插入的資料。例如，如果您為查詢結果指定`CSE_KMS`加密，Athena 會使用您用於查詢結果加密的相同 AWS KMS 金鑰 ID，以使用 加密插入的資料表資料`CSE_KMS`。

**Topics**
+ [支援的 Amazon S3 加密選項](#encryption-options-S3-and-Athena)
+ [Amazon S3 中加密資料的許可](#permissions-for-encrypting-and-decrypting-data)
+ [AWS Glue Data Catalog 中加密中繼資料的許可](#glue-encryption)
+ [從 CSE-KMS 移轉至 SSE-KMS](migrating-csekms-ssekms.md)
+ [加密 Amazon S3 中存放的 Athena 查詢結果](encrypting-query-results-stored-in-s3.md)
+ [根據 Amazon S3 中加密的資料集建立資料表](creating-tables-based-on-encrypted-datasets-in-s3.md)

## 支援的 Amazon S3 加密選項
<a name="encryption-options-S3-and-Athena"></a>

Athena 支援下列 Simple Storage Service (Amazon S3) 中資料集和查詢結果的加密選項。


| 加密類型 | Description | 跨區域支援 | 
| --- | --- | --- | 
| [SSE-S3 (SSE-S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingServerSideEncryption.html) | 使用 Simple Storage Service (Amazon S3) 受管金鑰的伺服器端加密 (SSE)。 | 是 | 
| [SSE-KMS](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html) (建議) | 使用 AWS Key Management Service 客戶受管金鑰的伺服器端加密 (SSE)。 | 是 | 
| [CSE-KMS](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingClientSideEncryption.html#client-side-encryption-kms-managed-master-key-intro) |  使用 AWS KMS 客戶受管金鑰的用戶端加密 (CSE)。在 Athena 中，此選項要求您使用 `CREATE TABLE`陳述式搭配指定 `'has_encrypted_data'='true'`或 `'encryption_option'='CSE_KMS'` 的 `TBLPROPERTIES` 子句`'kms_key'='kms_key_arn'`。如需詳細資訊，請參閱[根據 Amazon S3 中加密的資料集建立資料表](creating-tables-based-on-encrypted-datasets-in-s3.md)。  | 否 | 

如需使用 Amazon S3 AWS KMS 加密的詳細資訊，請參閱《 *AWS Key Management Service 開發人員指南*》中的[什麼是 AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html) 和 [Amazon Simple Storage Service (Amazon S3) 如何使用 AWS KMS](https://docs.aws.amazon.com/kms/latest/developerguide/services-s3.html) 。如需有關搭配 Athena 使用 SSE-KMS 或 CSE-KMS 的詳細資訊，請參閱 *AWS 大數據部落格*的[啟動：Amazon Athena 新增對查詢加密資料的支援](https://aws.amazon.com/blogs/aws/launch-amazon-athena-adds-support-for-querying-encrypted-data/)。

### 加密建議
<a name="encryption-recommendation"></a>

當您使用客戶受管 KMS 金鑰加密和解密資料表資料和查詢結果時，我們建議您使用 SSE-KMS 加密，而非 SSE-S3 或 CSE-KMS 加密方法。SSE-KMS 實現了控制、簡單性和效能的平衡，因此當您使用受管 KMS 金鑰進行資料加密時，建議使用此方法。

**與 SSE-S3 相比，SSE-KMS 的優勢**
+ SSE-KMS 可讓您指定和管理自己的金鑰，以便增強控制。您可以定義金鑰政策、監督金鑰生命週期，以及監控金鑰用量。

**與 CSE-KMS 相比，SSE-KMS 的優勢**
+ CSE-KMS 需要持續維護 S3 加密用戶端，而與此不同的是，SSE-KMS 不需要額外的基礎設施來加密和解密資料。
+ 由於加密演算法不斷發展演進，CSE-KMS 可能會面臨新舊 S3 加密用戶端之間的相容性問題，而 SSE-KMS 則可避免這一問題。
+ 在加密和解密程序期間，為進行金鑰擷取，SSE-KMS 對 KMS 服務發出的 API 呼叫較少，因此相較於 CSE-KMS，可提供更好的效能。

### 不支援的選項
<a name="encryption-unsupported-options"></a>

不支援下列加密選項：
+ 使用客戶提供金鑰的 SSE (SSE-C)。
+ 使用用戶端受管金鑰的用戶端加密。
+ 非對稱金鑰。

若要比較 Amazon S3 加密選項，請參閱《Amazon Simple Storage Service 使用者指南》**中的[使用加密保護資料](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingEncryption.html)。

### 用戶端加密工具
<a name="encryption-client-side-tools"></a>

 對於用戶端加密，請注意有兩種工具可用：
+ [Amazon S3 加密用戶端](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/AmazonS3EncryptionClient.html) – 這只會為 Amazon S3 加密資料，並由 Athena 支援。
+ [AWS Encryption SDK](https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/introduction.html) – 開發套件可用於跨任何地方加密資料， AWS 但 Athena 不支援。

這些工具不相容，而且使用一個工具加密的資料無法由另一個工具解密。Athena 僅直接支援 Simple Storage Service (Amazon S3) 加密用戶端。如果您使用軟體開發套件來加密資料，您可以從 Athena 執行查詢，但資料會以加密文字傳回。

如果您想要使用 Athena 來查詢已使用 AWS Encryption 軟體開發套件加密的資料，您必須先下載並解密資料，然後使用 Simple Storage Service (Amazon S3) 加密用戶端再次加密資料。

## Amazon S3 中加密資料的許可
<a name="permissions-for-encrypting-and-decrypting-data"></a>

根據您在 Amazon S3 中使用的加密類型，您可能需要針對在 Athena 中使用的政策新增許可 (也稱為「允許」動作)：
+ **SSE-S3** – 如果您使用 SSE-S3 進行加密，Athena 使用者在他們的政策中不需要額外的許可。有適當 Simple Storage Service (Amazon S3) 位置和 Athena 動作的適當 Simple Storage Service (Amazon S3) 許可即已足夠。如需有關允許適當 Athena 和 Simple Storage Service (Amazon S3) 許可的政策的詳細資訊，請參閱[AWS Amazon Athena 的 受管政策](security-iam-awsmanpol.md)和[透過 Athena 控制 Amazon S3 的存取權](s3-permissions.md)。
+ **AWS KMS** – 如果您使用 AWS KMS 進行加密，除了 Athena 和 Amazon S3 許可之外，還必須允許 Athena 使用者執行特定 AWS KMS 動作。您可以透過編輯用於在 Amazon S3 中加密資料的客戶自管金鑰的金鑰政策，來允許這些動作。若要將金鑰使用者新增至適當的 AWS KMS 金鑰政策，您可以使用位於 https：//[https://console.aws.amazon.com/kms](https://console.aws.amazon.com/kms) 的 AWS KMS 主控台。如需如何將使用者新增至 AWS KMS 金鑰政策的資訊，請參閱《 *AWS Key Management Service 開發人員指南*》中的[允許金鑰使用者使用客戶受管金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html#key-policy-default-allow-users)。
**注意**  
進階金鑰政策管理員可以調整金鑰政策。`kms:Decrypt` 是允許 Athena 使用者使用加密的資料集的最低允許動作。若要使用加密的查詢結果，允許的最低動作為 `kms:GenerateDataKey` 和 `kms:Decrypt`。

  使用 Athena 以大量使用 加密的物件查詢 Amazon S3 中的資料集時 AWS KMS， AWS KMS 可能會調節查詢結果。當存在大量小型物件時，這種情況更有可能發生。Athena 會退回重試請求，但仍可能發生調節錯誤。如果您正在使用大量加密物件且遭遇此問題，一個方法是啟用 Simple Storage Service (Amazon S3) 儲存貯體金鑰以減少對 KMS 的呼叫次數。如需詳細資訊，請參閱《Amazon Simple Storage Service 使用者指南》**中的[使用 Amazon S3 儲存貯體金鑰降低 SSE-KMS 的成本](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucket-key.html)。另一種方式是提高您 AWS KMS的服務配額。如需詳細資訊，請參閱《AWS Key Management Service 開發人員指南》**中的[配額](https://docs.aws.amazon.com/kms/latest/developerguide/limits.html#requests-per-second)。

如需有關搭配 Athena 使用 Simple Storage Service (Amazon S3) 時許可的疑難排解資訊，請參閱[對 Athena 中的問題進行疑難排解](troubleshooting-athena.md) 主題的 [許可](troubleshooting-athena.md#troubleshooting-athena-permissions) 一節。

## AWS Glue Data Catalog 中加密中繼資料的許可
<a name="glue-encryption"></a>

如果您在 [中加密中繼資料 AWS Glue Data Catalog](https://docs.aws.amazon.com/glue/latest/dg/encrypt-glue-data-catalog.html)，則必須將 `"kms:GenerateDataKey"`、 `"kms:Decrypt"`和 `"kms:Encrypt"`動作新增至您用於存取 Athena 的政策。如需相關資訊，請參閱[在 中設定從 Athena 到加密中繼資料的存取權 AWS Glue Data Catalog](access-encrypted-data-glue-data-catalog.md)。

# 從 CSE-KMS 移轉至 SSE-KMS
<a name="migrating-csekms-ssekms"></a>

您可以透過兩種方式來指定 CSE-KMS 加密：在工作群組查詢結果加密組態期間以及用戶端設定中。如需詳細資訊，請參閱[加密 Amazon S3 中存放的 Athena 查詢結果](encrypting-query-results-stored-in-s3.md)。在移轉程序期間，請務必稽核讀取和寫入 CSE-KMS 資料的現有工作流程、識別已設定 CSE-KMS 的工作群組，以及找到透過用戶端參數設定 CSE-KMS 的執行個體。

## 更新工作群組查詢結果加密設定
<a name="migrating-updating-workgroup-query-results-encryption"></a>

------
#### [ Console ]

**在 Athena 主控台中更新加密設定**

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/) 開啟 Athena 主控台。

1. 在 Athena 主控台導覽窗格中，選擇 **Workgroups** (工作群組)。

1. 在 **Workgroups** (工作群組) 頁面上，選取您要編輯的工作群組的按鈕。

1. 選擇 **Actions** (動作)、**Edit** (編輯)。

1. 開啟**查詢結果組態**，然後選擇**加密查詢結果**。

1. 對於**加密類型**區段，選擇 **SSE\$1KMS** 加密選項。

1. 在**選擇不同的 AWS KMS 金鑰 (進階)** 下，輸入您的 KMS 金鑰。

1. 選擇**儲存變更**。更新的工作群組會出現在 **Workgroups** (工作群組) 頁面上的清單。

------
#### [ CLI ]

執行下列命令，將工作群組中的查詢結果加密組態更新為 SSE-KMS。

```
aws athena update-work-group \
    --work-group "my-workgroup" \
    --configuration-updates '{
        "ResultConfigurationUpdates": {
            "EncryptionConfiguration": {
                "EncryptionOption": "SSE_KMS",
                "KmsKey": "<my-kms-key>"
            }
        }
    }'
```

------

## 更新用戶端查詢結果加密設定
<a name="migrating-updating-clientside-query-results-encryption"></a>

------
#### [ Console ]

要將查詢結果加密的用戶端設定從 CSE-KMS 更新為 SSE-KMS，請參閱 [加密 Amazon S3 中存放的 Athena 查詢結果](encrypting-query-results-stored-in-s3.md)。

------
#### [ CLI ]

您只能使用 `start-query-execution` 命令在用戶端設定中指定查詢結果加密組態。如果您執行此 CLI 命令，並使用 CSE-KMS 覆寫您在工作群組中指定的查詢結果加密組態，請變更命令以使用 `SSE_KMS` 加密查詢結果，如下所示。

```
aws athena start-query-execution \
    --query-string "SELECT * FROM <my-table>;" \
    --query-execution-context "Database=<my-database>,Catalog=<my-catalog>" \
    --result-configuration '{
        "EncryptionConfiguration": {
            "EncryptionOption": "SSE_KMS",
            "KmsKey": "<my-kms-key>"
        }
    }' \
    --work-group "<my-workgroup>"
```

------

**注意**  
更新工作群組或用戶端設定後，您透過寫入查詢插入的任何新資料都會使用 SSE-KMS 加密而不是 CSE-KMS。這是因為查詢結果加密組態也適用於新插入的資料表資料。Athena 查詢結果、中繼資料和資訊清單檔案也會使用 SSE-KMS 進行加密。
即使混合使用了 CSE-KMS 加密物件和 SSE-S3/SSE-KMS 物件，Athena 仍然可以讀取具有 `has_encrypted_data` 資料表屬性的資料表。

# 將 CSE-KMS 資料表資料轉換為 SSE-KMS
<a name="convert-csekms-table-ssekms"></a>

如果您的工作流程目前使用 CSE-KMS 來進行資料表資料加密，則請依照下列步驟轉換至 SSE-KMS。

## 先決條件
<a name="convert-csekms-table-ssekms-preq"></a>

如果您仍然使用 CSE-KMS 工作群組或用戶端設定寫入資料，則請遵循 [從 CSE-KMS 移轉至 SSE-KMS](migrating-csekms-ssekms.md) 中的步驟，將其更新為 SSE-KMS。這可避免在移轉程序期間從可能寫入資料表的任何其他工作流程中新增新的 CSE-KMS 加密資料。

## 資料遷移
<a name="convert-csekms-table-ssekms-migrat"></a>

1. 檢查資料表是否已將 `has_encrypted_data` 屬性設定為 `true`。此屬性會指定該資料表可能包含 CSE-KMS 加密資料。不過，請務必注意，即使資料表上沒有任何實際 CSE-KMS 加密資料，也可能存在此屬性。

------
#### [ Console ]

   1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/) 開啟 Athena 主控台。

   1. 選擇**啟動查詢編輯器**。

   1. 在編輯器左側的**資料庫**下，選擇您要查詢的資料庫。

   1. 在查詢編輯器中，執行下列查詢以查看 `has_encrypted_data table` 屬性所設定的值。

      ```
      SHOW TBLPROPERTIES <table_name>('has_encrypted_data');
      ```

------
#### [ CLI ]

   啟動 Athena 查詢，其中會顯示資料表上 `has_encrypted_data` 屬性的值，如下列範例所示。

   ```
   aws athena start-query-execution \
       --query-string "SHOW TBLPROPERTIES <table-name>('has_encrypted_data');" \
       --work-group "<my-workgroup>"
   ```

   擷取查詢結果，以檢查資料表的 `has_encrypted_data` 資料表屬性的值，如下列範例所示。

   ```
   aws athena get-query-results --query-execution-id <query-execution-id-from-previous-step>
   ```

------

1. 適用於資料表中的每個 CSE-KMS 加密物件。

   1. 使用 S3 加密用戶端從 S3 下載物件並將其解密。以下是 AWS Java SDK V2 的範例。

      **匯入**

      ```
      import software.amazon.awssdk.core.ResponseInputStream;
      import software.amazon.awssdk.services.s3.model.GetObjectRequest;
      import software.amazon.awssdk.services.s3.model.GetObjectResponse;
      import software.amazon.encryption.s3.S3EncryptionClient;
      import software.amazon.encryption.s3.materials.Keyring;
      import software.amazon.encryption.s3.materials.KmsDiscoveryKeyring;
      ```

      Code

      ```
      final Keyring kmsDiscoveryKeyRing = KmsDiscoveryKeyring.builder()
              .enableLegacyWrappingAlgorithms(true)
              .build();
      final S3EncryptionClient s3EncryptionClient = S3EncryptionClient.builder()
              .enableLegacyUnauthenticatedModes(true)
              .keyring(kmsDiscoveryKeyRing)
              .build();
      
      GetObjectRequest getObjectRequest = GetObjectRequest.builder()
              .bucket("amzn-s3-demo-bucket")
              .key("<my-key>")
              .build();
      
      ResponseInputStream<GetObjectResponse> s3Object = s3EncryptionClient.getObject(getObjectRequest);
      ```

   1. 以相同的名稱和 SSE-KMS 加密的方式，將物件上傳至 S3。以下是 AWS Java SDK V2 的範例。

      **匯入**

      ```
      import software.amazon.awssdk.core.ResponseInputStream;
      import software.amazon.awssdk.core.sync.RequestBody;
      import software.amazon.awssdk.services.s3.S3Client;
      import software.amazon.awssdk.services.s3.model.PutObjectRequest;
      import software.amazon.awssdk.services.s3.model.ServerSideEncryption;
      ```

      **Code**

      ```
      final S3Client s3Client = S3Client.builder()
              .build();
                  
      PutObjectRequest putObjectRequest = PutObjectRequest.builder()
              .bucket("amzn-s3-demo-bucket")
              .key("<my-key>")
              .serverSideEncryption(ServerSideEncryption.AWS_KMS)
              .ssekmsKeyId("<my-kms-key>")
              .build();
      
      s3Client.putObject(putObjectRequest, RequestBody.fromBytes(s3Object.readAllBytes()));
      ```

## 移轉後
<a name="convert-csekms-table-ssekms-post-migrat"></a>

成功重新加密資料表中的所有 CSE-KMS 檔案後，請執行下列步驟。

1. 從資料表中移除 `has_encrypted_data` 屬性。

------
#### [ Console ]

   1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/) 開啟 Athena 主控台。

   1. 選擇**啟動查詢編輯器**。

   1. 在編輯器左側的**資料庫**下，選擇您要查詢的資料庫。

   1. 在查詢編輯器中，為您的資料表執行下列查詢。

      ```
      ALTER TABLE <database-name>.<table-name> UNSET TBLPROPERTIES ('has_encrypted_data')
      ```

------
#### [ CLI ]

   執行下列命令，從資料表移除 `has_encrypted_data` 屬性。

   ```
   aws athena start-query-execution \
       --query-string "ALTER TABLE <database-name>.<table-name> UNSET TBLPROPERTIES ('has_encrypted_data');" \
       --work-group "<my-workgroup>"
   ```

------

1. 更新工作流程以使用基本 S3 用戶端而非 S3 加密用戶端，然後為資料寫入指定 SSE-KMS 加密。

# 加密 Amazon S3 中存放的 Athena 查詢結果
<a name="encrypting-query-results-stored-in-s3"></a>

您使用 Athena 主控台或在使用 JDBC 或 ODBC 時設定查詢結果加密。工作群組可讓您強制加密查詢結果。

**注意**  
加密查詢結果時，Athena 會加密查詢寫入的所有物件。這包括陳述式 (例如 `INSERT INTO`、`UPDATE`) 的結果，以及採用 Iceberg 或其他格式的資料查詢。

在主控台中，您透過兩種方式設定查詢結果的加密設定：
+ **用戶端設定** – 當您使用主控台的 **Settings** (設定) 或 API 操作指出您想要加密查詢結果時，這稱為使用用戶端設定。用戶端設定包括查詢結果的位置和加密。如果您指定這些設定，就會派上用場，除非被群組設定所覆寫。
+ **工作群組設定** – 當您[建立或編輯工作群組](creating-workgroups.md)，並選取 **Override client-side settings** (覆寫用戶端設定) 欄位時，在此工作群組中執行的所有查詢會使用工作群組加密和查詢結果位置設定。如需詳細資訊，請參閱[Override client-side settings (覆寫用戶端設定)](workgroups-settings-override.md)。

**若要使用主控台加密存放在 Simple Storage Service (Amazon S3) 中的查詢結果**
**重要**  
如果您的工作群組選取 **Override client-side settings** (覆寫用戶端設定) 欄位，則工作群組中的所有查詢均會使用工作群組設定。不會使用在 Athena 主控台中的**設定**索引標籤上指定，或由 API 操作與 JDBC 和 ODBC 驅動器指定的加密組態和查詢結果位置。如需詳細資訊，請參閱[Override client-side settings (覆寫用戶端設定)](workgroups-settings-override.md)。

1. 在 Athena 主控台中，選擇 **Settings** (設定)。  
![\[Athena 查詢編輯器的設定索引標籤。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/settings.png)

1. 選擇**管理**。

1. 針對 **Location of query result** (查詢結果的位置)，輸入或選擇 Simple Storage Service (Amazon S3) 路徑。這是儲存查詢結果的 Simple Storage Service (Amazon S3) 位置。

1. 選擇 **Encrypt query results** (加密查詢結果)。  
![\[Athena 主控台管理設定頁面上的加密查詢結果選項。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/encrypt-query-results.png)

1. 對於 **Encryption type** (加密類型)，選擇 **CSE-KMS**、**SSE-KMS** 或 **SSE-S3**。在這三個中，**CSE-KMS** 提供了最高級別的加密，而 **SSE-S3** 是最低的。

1. 如果您選擇 **SSE-KMS** 或 **CSE-KMS**，請指定 AWS KMS 金鑰。
   + 針對**選擇 AWS KMS 金鑰**，如果您的帳戶可存取現有的 AWS KMS 客戶受管金鑰，請選擇其別名或輸入 AWS KMS 金鑰 ARN。
   +  如果您的帳戶無法存取現有的客戶受管金鑰，請選擇**建立 AWS KMS 金鑰**，然後開啟[AWS KMS 主控台](https://console.aws.amazon.com/kms)。如需詳細資訊，請參閱《AWS Key Management Service 開發人員指南》**中的[建立金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html)。
**注意**  
Athena 僅支援用於讀取和寫入資料的對稱金鑰。

1. 返回 Athena 主控台，選擇您透過別名或 ARN 建立的索引鍵。

1. 選擇**儲存**。

## 使用 JDBC 或 ODBC 時加密 Athena 查詢結果
<a name="encrypting-query-results-stored-in-s3-jdbc-odbc"></a>

如果您使用 ODBC 或 JDBC 驅動器連接，您需設定驅動器選項，以指定要使用的加密類型，以及 Amazon S3 臨時目錄位置。若要設定 JDBC 或 ODBC 驅動器，以使用 Athena 支援的任何加密通訊協定來加密您的查詢結果，請參閱 [使用 ODBC 和 JDBC 驅動器連接至 Amazon Athena](athena-bi-tools-jdbc-odbc.md)。

# 根據 Amazon S3 中加密的資料集建立資料表
<a name="creating-tables-based-on-encrypted-datasets-in-s3"></a>

Athena 可以讀取和寫入基礎資料集為 SSE-S3、SSE-KMS 或 CSE-KMS 加密的資料表。根據用於資料表資料的加密選項和執行的查詢類型，您可能需要指定一些額外的資料表屬性，才能讀取和寫入加密的資料。

## 讀取 SSE-S3/SSE-KMS 加密資料表
<a name="reading-sse-s3-sse-kms-encrypted-tables"></a>

建立資料表時不需要指定其他資料表屬性，即可讀取 SSE-S3/SSE-KMS 加密資料集。Amazon S3 會自動處理 SSE 物件的解密。

## 讀取 CSE-KMS 加密資料表
<a name="reading-cse-kms-encrypted-tables"></a>

可以指定兩組不同的資料表屬性，以便 Athena 讀取 CSE-KMS 加密資料集。
+ 使用 `encryption_option`和 `kms_key` 資料表屬性 （建議）
+ 使用`has_encrypted_data`資料表屬性

**重要**  
如果您使用 Amazon EMR 搭配 EMRFS 上傳 CSE-KMS 加密 Parquet 檔案，您必須將 `fs.s3n.multipart.uploads.enabled`設定為 來停用分段上傳`false`。如果您不執行此操作，則 Athena 無法判斷 Parquet 檔案長度，並且會發生 **HIVE\$1CANNOT\$1OPEN\$1SPLIT** 錯誤。如需詳細資訊，請參閱《Amazon EMR 管理指南》**中的[設定適用於 Amazon S3 的分段上傳](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-plan-upload-s3.html#Config_Multipart)。

### 使用 encryption\$1option 和 kms\$1key 資料表屬性
<a name="using-encryption-option-and-kms-key-table-properties"></a>

在 [CREATE TABLE](create-table.md) 陳述式中，使用指定 `encryption_option='CSE_KMS'`和 的`TBLPROPERTIES`子句`kms_key='aws_kms_key_arn'`，如下列範例所示。

```
CREATE EXTERNAL TABLE 'my_encrypted_data' (
   `n_nationkey` int,
   `n_name` string,
   `n_regionkey` int,
   `n_comment` string)
ROW FORMAT SERDE
   'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS INPUTFORMAT
   'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
LOCATION
   's3://amzn-s3-demo-bucket/folder_with_my_encrypted_data/'
TBLPROPERTIES (
    'encryption_option' = 'CSE_KMS',
    'kms_key' = 'arn:aws:kms:us-east-1:012345678901:key/my_kms_key')
```

設定這些屬性時，
+ Athena 可以讀取 V1, V2 或 V3 Amazon S3 加密用戶端建立的 CSE-KMS 加密物件。
+ Athena 將使用 中的 AWS KMS 金鑰`kms_key`來解密 CSE-KMS 資料。如果任何物件使用不同的 AWS KMS 金鑰加密，查詢將會失敗。
+ Athena 仍然可以讀取 SSE-S3 和 SSE-KMS 加密物件，但不建議混合伺服器端和用戶端加密物件。

### 使用 has\$1encrypted\$1data 資料表屬性
<a name="using-has-encrypted-data-table-property"></a>

在 [CREATE TABLE](create-table.md) 陳述式中，請使用指定 `has_encrypted_data='true'` 的 `TBLPROPERTIES` 子句，如以下範例所示。

```
CREATE EXTERNAL TABLE 'my_encrypted_data' (
   `n_nationkey` int,
   `n_name` string,
   `n_regionkey` int,
   `n_comment` string)
ROW FORMAT SERDE
   'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS INPUTFORMAT
   'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
LOCATION
   's3://amzn-s3-demo-bucket/folder_with_my_encrypted_data/'
TBLPROPERTIES (
    'has_encrypted_data' = 'true')
```

指定 has\$1encrypted\$1data 資料表屬性時，
+ Athena 只能讀取 V1 Amazon S3 加密用戶端建立的 CSE-KMS 加密物件。
+ Athena 會推斷用於從物件中繼資料加密 CSE-KMS 物件的 AWS KMS 金鑰，然後使用該金鑰解密物件。
+ Athena 仍然可以讀取 SSE-S3 和 SSE-KMS 加密物件，但不建議混合伺服器端和用戶端加密物件。

**注意**  
當 `kms_key` `encryption_option`和 與 一起指定時`has_encrypted_data`， `encryption_option`和 `kms_key`資料表屬性會優先，且`has_encrypted_data`會被忽略。

當您使用 Athena 主控台使用[表單建立資料表](data-sources-glue-manual-table.md)並指定資料表位置時，請選取**加密的資料集**選項，將 `has_encrypted_data='true'` 屬性新增至資料表。

![\[在新增資料表表格中選取 Encrypted data set (加密的資料集)\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/add-table-form-encrypted-option.png)


在 Athena 主控台的資料表清單中，具有 的 CSE-KMS 加密資料表`has_encrypted_data='true'`會顯示金鑰形狀圖示。

![\[已加密資料表圖示\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/tables-list-encrypted-table-icon.png)


## 寫入 SSE-S3/SSE-KMS/CSE-KMS 加密資料
<a name="writing-sse-s3-sse-kms-cse-kms-encrypted-data"></a>

根據預設，新插入的資料檔案將使用 Athena 工作群組中指定的查詢結果的加密組態進行加密。為了使用與查詢結果的加密組態不同的加密組態來寫入資料表資料，您必須新增一些額外的資料表屬性。

在 [CREATE TABLE](create-table.md) 陳述式中，使用指定 `encryption_option='SSE_S3 | SSE_KMS | CSE_KMS'`和 的`TBLPROPERTIES`子句`kms_key='aws_kms_key_arn'`，如下列範例所示。

```
CREATE EXTERNAL TABLE 'my_encrypted_data' (
   `n_nationkey` int,
   `n_name` string,
   `n_regionkey` int,
   `n_comment` string)
ROW FORMAT SERDE
   'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS INPUTFORMAT
   'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
LOCATION
   's3://amzn-s3-demo-bucket/folder_with_my_encrypted_data/'
TBLPROPERTIES (
    'encryption_option' = 'SSE_KMS',
    'kms_key' = 'arn:aws:kms:us-east-1:012345678901:key/my_kms_key')
```

所有新插入的資料都會使用資料表屬性指定的加密組態來加密，而不是使用工作群組中查詢的加密組態。

## 考量事項與限制
<a name="considerations-and-limitations"></a>

寫入和讀取加密的資料集時，請考慮下列事項。
+ `has_encrypted_data`、 `encryption_option`和 `kms_key`資料表屬性只能與 Hive 資料表搭配使用。
+ 使用 CSE-KMS 加密資料建立資料表時，建議您確保所有資料都使用相同的 AWS KMS 金鑰加密。
+ 使用 CSE-KMS 加密資料建立資料表時，建議您確保所有資料都經過 CSE-KMS 加密，而且不會混合non-CSE-KMS 和 CSE-KMS 加密物件。