

# 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 アイデンティティセンター または AWS Identity and Access Management (IAM) を使用して個々のユーザーをセットアップすることをお勧めします。この方法により、それぞれのジョブを遂行するために必要な権限のみが各ユーザーに付与されます。また、次の方法でデータを保護することもお勧めします:
+ 各アカウントで多要素認証 (MFA) を使用します。
+ SSL/TLS を使用して AWS リソースと通信します。TLS 1.2 は必須ですが、TLS 1.3 を推奨します。
+ AWS CloudTrail で API とユーザーアクティビティロギングを設定します。CloudTrail 証跡を使用して AWS アクティビティをキャプチャする方法については、「**AWS CloudTrail ユーザーガイド」の「[CloudTrail 証跡の使用](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-trails.html)」を参照してください。
+ AWS のサービス内のすべてのデフォルトセキュリティコントロールに加え、AWS 暗号化ソリューションを使用します。
+ Amazon Macie などの高度な管理されたセキュリティサービスを使用します。これらは、Amazon S3 に保存されている機密データの検出と保護を支援します。
+ コマンドラインインターフェイスまたは API を使用して AWS にアクセスする際に FIPS 140-3 検証済みの暗号化モジュールが必要な場合は、FIPS エンドポイントを使用します。利用可能な FIPS エンドポイントの詳細については、「[連邦情報処理規格 (FIPS) 140-3](https://aws.amazon.com/compliance/fips/)」を参照してください。

お客様の E メールアドレスなどの極秘または機密情報を、タグ、または **[名前]** フィールドなどの自由形式のテキストフィールドに含めないことを強くお勧めします。これは、コンソール、API、AWS CLI、または AWS‬ SDK を使用して他の ‭AWS のサービス‬ 操作する場合も同様です。タグ、または名前に使用される自由形式のテキストフィールドに入力されるデータは、請求または診断ログに使用される場合があります。外部サーバーに 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)」を参照してください。ソースデータへのアクセスはユーザーが制御し、ソースデータは Amazon S3 で暗号化できます。Athena を使用して、[Amazon S3 で暗号化されたデータセットに基づくテーブルを作成できます](creating-tables-based-on-encrypted-datasets-in-s3.md)。
+ **データベースとテーブルのメタデータ (スキーマ)** – Athena はスキーマオンリード (schema-on-read) テクノロジーを使用します。これは、Athena がクエリを実行するときに、テーブル定義が Amazon S3 のデータに適用されることを意味します。定義したスキーマは、明示的に削除しない限り、自動的に保存されます。Athena では、DDL ステートメントを使用してデータカタログメタデータを変更できます。テーブルの定義とスキーマは、Amazon S3 に保存されている基盤となるデータに影響を及ぼすことなく削除することもできます。Athena で使用するデータベースとテーブルのメタデータは AWS Glue Data Catalog に保存されます。

  AWS Identity and Access Management (IAM) を使用して、AWS Glue Data Catalog に登録された[データベースとテーブルにきめ細かなアクセスポリシーを定義](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)を使用します。
+ **保存されたクエリを含むクエリ結果とクエリ履歴** – クエリ結果は Amazon S3 の場所に保存されます。この場所は、グローバルに指定することも、ワークグループごとに指定することも可能です。指定しない場合、Athena はその都度デフォルトの場所を使用します。クエリ結果と保存されたクエリを格納する Amazon S3 バケットへのアクセスは、ユーザーが制御します。さらに、Amazon S3 に保存するクエリ結果の暗号化を選択することもできます。ユーザーには、Amazon S3 の場所にアクセスして、ファイルを復号化するための適切な許可が必要です。詳細については、本書の「[Amazon S3 に保存された Athena クエリ結果を暗号化する](encrypting-query-results-stored-in-s3.md)」を参照してください。

  Athena では、クエリ履歴が 45 日間保持されます。[クエリ履歴を表示](queries-viewing-history.md)するには、Athena API、コンソール、および 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 では、同じリージョン内、および限られた数のリージョン間で Amazon S3 内の暗号化されたデータに対するクエリを実行できます。Amazon S3 内のクエリ結果、および AWS Glue データカタログ内のデータを暗号化することもできます。

Athena では、以下のアセットを暗号化できます。
+ Amazon S3 内にあるすべてのクエリ結果。Athena は、これらを Amazon S3 の結果の場所と呼ばれる場所に保存します。Amazon S3 に保存されたクエリ結果は、基盤となるデータセットが Amazon S3 で暗号化されているかどうかにかかわらず、暗号化できます。詳細については、「[Amazon S3 に保存された Athena クエリ結果を暗号化する](encrypting-query-results-stored-in-s3.md)」を参照してください。
+ AWS Glue データカタログのデータ。詳細については、「[AWS Glue データカタログの暗号化されたメタデータに対するアクセス許可](#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 データカタログの暗号化されたメタデータに対するアクセス許可](#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 は、Amazon S3 内のデータセットとクエリ結果について、以下の暗号化オプションをサポートしています。


| 暗号化タイプ | 説明 | クロスリージョンサポート | 
| --- | --- | --- | 
| [SSE-S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingServerSideEncryption.html) | 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 では、このオプションには、`'has_encrypted_data'='true'` または `'encryption_option'='CSE_KMS'` と `'kms_key'='kms_key_arn'`を指定する `TBLPROPERTIES` 句を含む `CREATE TABLE` ステートメントの使用が必要になります。詳細については、「[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-S3 や CSE-KMS 暗号化方法ではなく SSE-KMS 暗号化を使用することをお勧めします。SSE-KMS は、制御、シンプルさ、パフォーマンスのバランスを備えているため、データ暗号化にマネージド KMS キーを使用する場合に推奨される方法です。

**SSE-S3 と比較した場合の SSE-KMS のメリット**
+ SSE-KMS では、独自のキーを指定および管理できるため、よりきめ細かい制御が可能です。キーポリシーの定義、キーライフサイクルの監督、キーの使用状況のモニタリングを行うことができます。

**CSE-KMS と比較した場合の SSE-KMS のメリット**
+ S3 暗号化クライアントの継続的なメンテナンスを必要とする CSE-KMS とは異なり、SSE-KMS では、データを暗号化および復号するための追加のインフラストラクチャは必要ありません。
+ 進化する暗号化アルゴリズムが原因で、SSE-KMS では、新しい S3 暗号化クライアントと古い 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>

 クライアント側の暗号化には、以下の 2 つのツールを利用できることに留意してください。
+ [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) – この SDK は、AWS のどこでもデータを暗号化するために使用できますが、Athena では直接サポートされていません。

これらのツールには互換性がなく、一方のツールで暗号化されたデータをもう一方のツールで復号化することはできません。Athena が直接サポートするのは Amazon S3 暗号化クライアントのみです。SDK を使用してデータを暗号化する場合、Athena からクエリを実行することはできますが、データが暗号化されたテキストとして返されます。

AWS Encryption SDK で暗号化されたデータを Athena を使用してクエリする場合は、データをダウンロードして復号化してから、Amazon S3 暗号化クライアントを使用して再度暗号化する必要があります。

## Amazon S3 の暗号化されたデータに対する許可
<a name="permissions-for-encrypting-and-decrypting-data"></a>

Amazon S3 で使用する暗号化のタイプに応じて、Athena で使用されるポリシーに「Allow」アクションとしても知られる許可を追加することが必要になることがあります。
+ **SSE-S3** – 暗号化に SSE-S3 を使用する場合、Athena ユーザーのポリシーに追加の許可は必要ありません。適切な Amazon S3 の場所、および Athena のアクションに対する適切な Amazon S3 許可を持っているだけで十分です。適切な Athena および Amazon S3 の許可を可能にするポリシーの詳細については、「[AWSAmazon Athena の 管理ポリシー](security-iam-awsmanpol.md)」および「[Athena から Amazon S3 へのアクセスを制御する](s3-permissions.md)」を参照してください。
+ **AWS KMS** – 暗号化に AWS KMS を使用する場合、Athena ユーザーには、Athena と Amazon S3 へのアクセス許可に加えて、特定の AWS KMS アクションの実行が許可されている必要があります。これらのアクションは、Amazon S3 内のデータの暗号化に使用されるカスタマーマネージドキーのキーポリシーを編集することによって許可します。適切な AWS KMS キーポリシーにキーユーザーを追加するには、AWS KMS コンソール ([https://console.aws.amazon.com/kms](https://console.aws.amazon.com/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 への呼び出し数を減らすのも 1 つの方法です。詳細については、「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 で Amazon S3 を使用する場合の許可に関するトラブルシューティング情報については、「[Athena の問題をトラブルシューティングする](troubleshooting-athena.md)」トピックの「[アクセス許可](troubleshooting-athena.md#troubleshooting-athena-permissions)」セクションを参照してください。

## AWS Glue データカタログの暗号化されたメタデータに対するアクセス許可
<a name="glue-encryption"></a>

[AWS Glue Data Catalog のメタデータを暗号化](https://docs.aws.amazon.com/glue/latest/dg/encrypt-glue-data-catalog.html)する場合は、Athena へのアクセスに使用する ポリシーに `"kms:GenerateDataKey"`、`"kms:Decrypt"`、および `"kms:Encrypt"` アクションを追加する必要があります。詳細については、「[AWS Glue Data Catalog で Athena から暗号化されたメタデータへのアクセスを構成する](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. **[Save changes]** (変更の保存) を選択します。更新されたワークグループが **[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>"
```

------

**注記**  
ワークグループまたはクライアント側の設定を更新すると、書き込みクエリで挿入する新しいデータでは、CSE-KMS ではなく SSE-KMS 暗号化が使用されます。これは、新しく挿入されるテーブルデータにもクエリ結果の暗号化設定が適用されるためです。Athena のクエリ結果、メタデータ、マニフェストファイルも SSE-KMS で暗号化されます。
Athena は、CSE-KMS 暗号化オブジェクトと SSE-S3/SSE-KMS オブジェクトが混在している場合でも、`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 ]

   次の例に示すように、テーブルの `has_encrypted_data` プロパティの値を示す Athena クエリを開始します。

   ```
   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;
      ```

      コード

      ```
      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;
      ```

      **コード**

      ```
      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 はクエリによって書き込まれたすべてのオブジェクトを暗号化します。これには、Iceberg やその他の形式のデータの `INSERT INTO`、`UPDATE`、および クエリなどのステートメントの結果が含まれます。

コンソールでは、クエリ結果の暗号化は次の 2 つの方法で設定できます。
+ **クライアント側の設定** – クエリ結果を暗号化することを指定するためのコンソールの **[Settings]** (設定)、または API オペレーションの使用は、クライアント側の設定の使用として知られています。クライアント側設定には、クエリ結果の場所と暗号化が含まれます。指定した場合は、ワークグループの設定によって上書きされない限り、それらの設定が使用されます。
+ **ワークグループ設定** — [ワークグループを作成または編集](creating-workgroups.md)して **[Override client-side settings]** (クライアント側の設定を上書きする) フィールドを選択すると、このワークグループで実行されるすべてのクエリでワークグループの暗号化およびクエリ結果の場所の設定が使用されます。詳細については、「[[Override client-side settings (クライアント側設定の上書き)]](workgroups-settings-override.md)」を参照してください。

**コンソールを使用して Amazon S3 に保存されているクエリ結果を暗号化する**
**重要**  
ワークグループで **[Override client-side settings]** (クライアント側の設定を上書きする) フィールドを選択している場合、ワークグループのすべてのクエリではこのワークグループ設定が使用されます。API オペレーション、JDBC および ODBCドライバーにより Athena コンソールの **[設定]** タブで指定されている暗号化設定およびクエリ結果の場所は使用されません。詳細については、「[[Override client-side settings (クライアント側設定の上書き)]](workgroups-settings-override.md)」を参照してください。

1. Athena コンソールで **[Settings]** (設定) を選択します。  
![\[Athena クエリエディタの [設定] タブ。\]](http://docs.aws.amazon.com/ja_jp/athena/latest/ug/images/settings.png)

1. **[Manage]** (管理) を選択します。

1. **[Location of query result]** (クエリ結果の場所) で、Amazon S3 パスを入力または選択します。これは、クエリ結果が保存される Amazon S3 内の場所です。

1. [**Encrypt query results**] を選択します。  
![\[Athena コンソールの [設定の管理] ページの [クエリ結果の暗号化] オプション。\]](http://docs.aws.amazon.com/ja_jp/athena/latest/ug/images/encrypt-query-results.png)

1. [**Encryption type**] で、[**CSE-KMS**]、[**SSE-KMS**]、[**SSE-S3**] のいずれかを選択します。これら 3 つのうち、**[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. **[Save]** (保存) を選択します。

## JDBC または ODBC を使用する場合の Athena のクエリ結果の暗号化
<a name="encrypting-query-results-stored-in-s3-jdbc-odbc"></a>

JDBC または ODBC ドライバーを使用して接続する場合は、ドライバーオプションを設定して、使用する暗号化のタイプと、Amazon S3 のステージングディレクトリの場所を指定します。Athena がサポートする暗号化プロトコルのいずれかを使用してクエリ結果を暗号化するように JDBC または ODBC ドライバーを設定する場合は、「[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 暗号化データセットを読み取るために指定できるテーブルプロパティは 2 セットあります。
+ テーブルプロパティ `encryption_option` と `kms_key` の使用（推奨）
+ テーブルプロパティ `has_encrypted_data` の使用

**重要**  
暗号化された Parquet ファイルのアップロードに Amazon EMR と EMRFS 併用する場合は、`fs.s3n.multipart.uploads.enabled` を `false` に設定してマルチパートアップロードを無効にする必要があります。これを行わないと、Athena は Parquet ファイルの長さを判断できず、**HIVE\$1CANNOT\$1OPEN\$1SPLIT** エラーが発生します。詳細については、「[Amazon EMR 管理ガイド](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-plan-upload-s3.html#Config_Multipart)」の「*Amazon S3 用のマルチパートアップロードを設定する*」を参照してください。

### テーブルプロパティ encryption\$1option と kms\$1key の使用
<a name="using-encryption-option-and-kms-key-table-properties"></a>

次の例のように、[CREATE TABLE](create-table.md) ステートメントで、`encryption_option='CSE_KMS'` と `kms_key='aws_kms_key_arn'` を指定する `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 (
    'encryption_option' = 'CSE_KMS',
    'kms_key' = 'arn:aws:kms:us-east-1:012345678901:key/my_kms_key')
```

これらのプロパティを設定すると、次のようになります。
+ Athena は、Amazon S3 暗号化クライアント V1、V2または V3 によって作成された CSE-KMS 暗号化オブジェクトを読み取ることができます。
+ Athena は CSE-KMS データの復号に `kms_key` の AWS 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 は、Amazon S3 暗号化クライアント V1 によって作成された CSE-KMS 暗号化オブジェクトしか読み取ることができません。
+ Athena は、オブジェクトメタデータから CSE-KMS オブジェクトを暗号化するために使用される AWS KMS キーを推測し、オブジェクトの複合にそのキーを使用します。
+ Athena は引き続き SSE-S3 と SSE-KMS の暗号化オブジェクトを読み取ることができますが、サーバー側とクライアント側の暗号化オブジェクトを混在させることは推奨されません。

**注記**  
`encryption_option` と `kms_key` を `has_encrypted_data` と一緒に指定すると、テーブルプロパティ `encryption_option` と `kms_key` が優先され、`has_encrypted_data` は無視されます。

Athena コンソールを使用して、[フォームを使用したテーブルの作成](data-sources-glue-manual-table.md)およびテーブルの場所の指定を行う場合、**[暗号化データセット]** オプションを選択して `has_encrypted_data='true'` プロパティをテーブルに追加します。

![\[テーブルの追加フォームで暗号化されたデータセットを選択する\]](http://docs.aws.amazon.com/ja_jp/athena/latest/ug/images/add-table-form-encrypted-option.png)


Athena コンソールのテーブルのリストでは、`has_encrypted_data='true'` を含む CSE-KMS 暗号化テーブルにはキー型のアイコンが表示されます。

![\[暗号化テーブルのアイコン\]](http://docs.aws.amazon.com/ja_jp/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'` と `kms_key='aws_kms_key_arn'` を指定する `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 (
    '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 で暗号化されていること、および、非 CSE-KMS 暗号化オブジェクトと CSE-KMS 暗号化オブジェクトが混在していないことを確認しておきましょう。

# 転送中の暗号化
<a name="encryption-in-transit"></a>

Amazon S3 での保管時のデータの暗号化に加えて、Amazon Athena は、Athena と Amazon S3 間、および Athena とそれにアクセスするカスタマーアプリケーション間での転送されるデータに Transport Layer Security (TLS) 暗号化を使用します。

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 では、Amazon S3 のデータセットと Athena のクエリ結果を暗号化する AWS Key Management Service (AWS KMS) がサポートされています。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 は、データの読み書きに対称キーのみをサポートします。

詳細については、「[Amazon Simple Storage Service が AWS KMS を使用する方法](https://docs.aws.amazon.com/kms/latest/developerguide/services-s3.html)」と「AWS Key Management Service デベロッパーガイド」の「[AWS Key Management Service とは](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html)」を参照してください。AWS によって作成および管理されるアカウントのキーを表示するには、ナビゲーションペインで [**AWS マネージドキー**] を選択します。

SSE-KMS で暗号化されたオブジェクトをアップロードしたり、それらへアクセスしたりする場合は、セキュリティを強化するために AWS 署名バージョン 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 と Amazon S3 間の両方で保護されます。Athena と他のサービス (AWS Glue や AWS Key Management Service など) 間のトラフィックでは、デフォルトで HTTPS が使用されます。
+ **Athena とオンプレミスのクライアントおよびアプリケーション間のトラフィックについては**、JDBC または ODBC クライアントにストリーミングされるクエリ結果が Transport Layer Security (TLS) を使用して暗号化されます。

  プライベートネットワークと AWS 間の接続オプションのいずれかを使用できます。
  + Site-to-Site VPN Site-to-Site VPN 接続。詳細については、「*AWS Site-to-Site VPN ユーザーガイド*」の「[Site-to-Site VPNSite-to-Site VPN とは](https://docs.aws.amazon.com/vpn/latest/s2svpn/VPC_VPN.html)」を参照してください。
  + Direct Connect 接続。詳細については、「[Direct Connect ユーザーガイド](https://docs.aws.amazon.com/directconnect/latest/UserGuide/Welcome.html)」の「*Direct Connect とは?*」を参照してください。
+ **Athena と Amazon S3 バケット間のトラフィックについては**、Transport Layer Security (TLS) が Athena と Amazon S3 間、および Athena とそれにアクセスするカスタマーアプリケーション間で転送されるデータを暗号化します。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 は、SOC、PCI、FedRAMP など複数の AWS コンプライアンスプログラムに準拠しています。詳細については、「[コンプライアンスプログラムによる対象範囲内の AWS のサービス](https://aws.amazon.com/compliance/services-in-scope/)」を参照してください。