

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

# Athena 中的資料保護
<a name="security-data-protection"></a>

 AWS [共同責任模型](https://aws.amazon.com/compliance/shared-responsibility-model/)適用於 中的資料保護。如此模型所述， AWS 負責保護執行所有 的全域基礎設施 AWS 雲端。您負責維護在此基礎設施上託管內容的控制權。您也同時負責所使用 AWS 服務 的安全組態和管理任務。如需資料隱私權的詳細資訊，請參閱[資料隱私權常見問答集](https://aws.amazon.com/compliance/data-privacy-faq/)。如需有關歐洲資料保護的相關資訊，請參閱*AWS 安全性部落格*上的[AWS 共同責任模型和 GDPR](https://aws.amazon.com/blogs/security/the-aws-shared-responsibility-model-and-gdpr/) 部落格文章。

基於資料保護目的，我們建議您保護 AWS 帳戶 登入資料，並使用 AWS IAM Identity Center 或 AWS Identity and Access Management (IAM) 設定個別使用者。如此一來，每個使用者都只會獲得授與完成其任務所必須的許可。我們也建議您採用下列方式保護資料：
+ 每個帳戶均要使用多重要素驗證 (MFA)。
+ 使用 SSL/TLS 與 AWS 資源通訊。我們需要 TLS 1.2 並建議使用 TLS 1.3。
+ 使用 設定 API 和使用者活動記錄 AWS CloudTrail。如需有關使用 CloudTrail 追蹤擷取 AWS 活動的資訊，請參閱*AWS CloudTrail 《 使用者指南*》中的[使用 CloudTrail 追蹤](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-trails.html)。
+ 使用 AWS 加密解決方案，以及其中的所有預設安全控制 AWS 服務。
+ 使用進階的受管安全服務 (例如 Amazon Macie)，協助探索和保護儲存在 Amazon S3 的敏感資料。
+ 如果您在 AWS 透過命令列界面或 API 存取 時需要 FIPS 140-3 驗證的密碼編譯模組，請使用 FIPS 端點。如需有關 FIPS 和 FIPS 端點的更多相關資訊，請參閱[聯邦資訊處理標準 (FIPS) 140-3](https://aws.amazon.com/compliance/fips/)。

我們強烈建議您絕對不要將客戶的電子郵件地址等機密或敏感資訊，放在標籤或自由格式的文字欄位中，例如**名稱**欄位。這包括當您使用 或使用主控台、API AWS CLI或其他 AWS 服務 AWS SDKs 時。您在標籤或自由格式文字欄位中輸入的任何資料都可能用於計費或診斷日誌。如果您提供外部伺服器的 URL，我們強烈建議請勿在驗證您對該伺服器請求的 URL 中包含憑證資訊。

作為額外的安全步驟，您也能使用 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-calledvia](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-calledvia) 全域條件內容索引鍵來限制僅能有從 Athena 進行的請求。如需詳細資訊，請參閱[針對 Athena 使用 CalledVia 內容索引鍵](security-iam-athena-calledvia.md)。

## 保護多種資料類型
<a name="security-data-protection-types-of-data"></a>

使用 Athena 建立資料庫和資料表時，涉及多種類型的資料。這些資料類型包括存放在 Amazon S3 中的來源資料、執行查詢時建立之資料庫和資料表的中繼資料，或用於探索資料、查詢結果資料和查詢歷史記錄的 AWS Glue 爬蟲程式。本節討論每個類型的資料，並提供如何保護它的相關指導。
+ **來源資料** – 您將資料庫和資料表的資料存放在 Amazon S3 中，而且 Athena 不會修改它。如需詳細資訊，請參閱《Amazon Simple Storage Service 使用者指南》**中的 [Amazon S3 中的資料保護](https://docs.aws.amazon.com/AmazonS3/latest/userguide/DataDurability.html)。您可以控制來源資料的存取，並可在 Simple Storage Service (Amazon S3) 中將其加密。您可以使用 Athena，[根據 Simple Storage Service (Amazon S3) 中的加密資料集建立資料表](creating-tables-based-on-encrypted-datasets-in-s3.md)。
+ **Database and table metadata (schema)** (資料庫和資料表中繼資料 (結構描述)) – Athena 使用讀取時定義結構描述的技術，也就是在 Athena 執行查詢時，您的資料表定義會套用至您在 Simple Storage Service (Amazon S3) 中的資料。您定義的所有結構描述都會自動儲存，除非您確實將其刪除。在 Athena 中，您可以使用 DDL 陳述式來修改資料目錄中繼資料。您也可以刪除資料表定義和結構描述，不會影響存放在 Simple Storage Service (Amazon S3) 中的基礎資料。您在 Athena 中使用之資料庫和資料表的中繼資料會存放在 AWS Glue Data Catalog中。

  您可以使用 AWS Glue Data Catalog AWS Identity and Access Management (IAM) [定義在 中註冊的資料庫和資料表的精細存取政策](fine-grained-access-to-glue-resources.md)。您也可以[加密 AWS Glue Data Catalog的中繼資料](https://docs.aws.amazon.com/glue/latest/dg/encrypt-glue-data-catalog.html)。如果您加密中繼資料，請使用[加密中繼資料的許可](encryption.md#glue-encryption)進行存取。
+ **查詢結果和查詢歷史記錄，包括儲存的查詢** – 查詢結果存放在 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)。

  Athena 會將查詢歷史記錄保留 45 天。您可以使用 Athena APIs、主控台和 來[檢視查詢歷史記錄](queries-viewing-history.md) AWS CLI。若要存放查詢超過 45 天，請將其儲存。若要保護對已儲存查詢的存取權限，請在 Athena 中[使用工作群組](workgroups-manage-queries-control-costs.md)，限制僅有權檢視已儲存查詢的使用者可存取這些查詢。

**Topics**
+ [保護多種資料類型](#security-data-protection-types-of-data)
+ [靜態加密](encryption.md)
+ [傳輸中加密](encryption-in-transit.md)
+ [金鑰管理](key-management.md)
+ [網際網路流量隱私權](internetwork-traffic-privacy.md)

# 靜態加密
<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 加密物件。

# 傳輸中加密
<a name="encryption-in-transit"></a>

除了在 Simple Storage Service (Amazon S3) 中加密靜態資料外，Amazon Athena 還會在 Athena 與 Simple Storage Service (Amazon S3) 之間，以及 Athena 與存取它的客戶應用程式之間，對傳輸中資料使用 Transport Layer Security (TLS) 加密。

您應該使用 Simple Storage Service (Amazon S3) 儲存貯體 IAM 政策上的 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_Boolean](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_Boolean)，僅允許透過 HTTPS (TLS) 進行加密連線。

串流至 JDBC 或 ODBC 用戶端的查詢結果會使用 TLS 來加密。如需最新版 JDBC 和 ODBC 驅動程式及其文件的詳細資訊，請參閱[使用 JDBC 連接到 Amazon Athena](connect-with-jdbc.md)和[使用 ODBC 連接到 Amazon Athena](connect-with-odbc.md)。

對於 Athena 聯合資料來源連接器，支援使用 TLS 加密進行傳輸中加密取決於各個連接器。如需相關資訊，請參閱個別[資料來源連接器](connectors-available.md)的文件。

# 金鑰管理
<a name="key-management"></a>

Amazon Athena 支援 AWS Key Management Service (AWS KMS) 加密 Amazon S3 和 Athena 查詢結果中的資料集。 AWS KMS 使用客戶受管金鑰來加密 Amazon S3 物件，並依賴[信封加密](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#enveloping)。

在 中 AWS KMS，您可以執行下列動作：
+  [建立金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html) 
+  [為新的客戶自管金鑰匯入您自己的金鑰材料](https://docs.aws.amazon.com/kms/latest/developerguide/importing-keys.html) 

**注意**  
Athena 僅支援用於讀取和寫入資料的對稱金鑰。

如需詳細資訊，請參閱《AWS Key Management Service 開發人員指南》**中的[什麼是 AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html)，以及 [Amazon Simple Storage Service 如何使用 AWS KMS](https://docs.aws.amazon.com/kms/latest/developerguide/services-s3.html)。若要檢視您帳戶中為您 AWS 建立和管理的金鑰，請在導覽窗格中選擇**AWS 受管金鑰**。

如果您要上傳或存取 SSE-KMS 加密的物件，請使用 AWS Signature 第 4 版來提高安全性。如需詳細資訊，請參閱《Amazon Simple Storage Service 使用者指南》**中的[指定請求身分驗證中的簽章版本](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingAWSSDK.html#specify-signature-version)。

如果 Athena 工作負載會加密大量資料，您可以使用 Amazon S3 儲存貯體金鑰來降低成本。如需詳細資訊，請參閱《Amazon Simple Storage Service 使用者指南》**中的[使用 Amazon S3 儲存貯體金鑰降低 SSE-KMS 的成本](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucket-key.html)。

# 網際網路流量隱私權
<a name="internetwork-traffic-privacy"></a>

同時保護 Athena 與內部部署應用程式之間的流量，以及 Athena 與 Simple Storage Service (Amazon S3) 之間的流量。Athena 與其他 服務之間的流量，例如 AWS Glue 和 AWS Key Management Service，預設會使用 HTTPS。
+ **對於 Athena 與內部部署用戶端和應用程式之間的流量**，串流至 JDBC 或 ODBC 用戶端的查詢結果會使用 Transport Layer Security (TLS) 來加密。

  您可以在私有網路與 AWS之間使用其中一個連線選項：
  + Site-to-Site Site-to-Site VPN 連接。如需詳細資訊，請參閱《 Site-to-Site VPN使用者指南》[https://docs.aws.amazon.com/vpn/latest/s2svpn/VPC_VPN.html](https://docs.aws.amazon.com/vpn/latest/s2svpn/VPC_VPN.html)中的*什麼是 Site-to-Site VPN AWS Site-to-Site VPN *。
  +  Direct Connect 連線。如需詳細資訊，請參閱《Direct Connect 使用者指南》**中的[什麼是 Direct Connect](https://docs.aws.amazon.com/directconnect/latest/UserGuide/Welcome.html)。
+ **對於 Athena 和 Simple Storage Service (Amazon S3) 儲存貯體之間的流量**，Transport Layer Security (TLS) 會在 Athena 和 Simple Storage Service (Amazon S3) 之間，以及在 Athena 和存取該物件的客戶應用程式之間加密傳輸中的物件，且您應使用 Simple Storage Service (Amazon S3) 儲存貯體 IAM 政策上的 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_Boolean](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_Boolean)，僅允許透過 HTTPS (TLS) 的加密連線。儘管 Athena 目前使用公有端點存取 Amazon S3 儲存貯體中的資料，但這並不意味著資料會周遊公有網際網路。Athena 和 Amazon S3 之間的所有流量都會透過 AWS 網路路由，並使用 TLS 加密。
+ **合規計劃** – Amazon Athena 符合多個 AWS 合規計劃，包括 SOC、PCI、FedRAMP 等。如需詳細資訊，請參閱[合規計劃的AWS 服務 範圍](https://aws.amazon.com/compliance/services-in-scope/)。