

# Amazon Athena 安全性
<a name="security"></a>

AWS 十分重视云安全性。作为 AWS 客户，您将从专为满足大多数安全敏感型企业的要求而打造的数据中心和网络架构中受益。

安全性是 AWS 和您的共同责任。[责任共担模式](https://aws.amazon.com/compliance/shared-responsibility-model/)将其描述为云*的* 安全性和云*中* 的安全性：
+ **云的安全性** – AWS 负责保护在 AWS 云中运行 AWS 服务 的基础设施。AWS 还向您提供可安全使用的服务。作为 [AWS 合规性计划](https://aws.amazon.com/compliance/programs/)的一部分，我们的安全措施的有效性定期由第三方审计员进行测试和验证。要了解适用于 Athena 的合规性计划，请参阅 [合规性计划范围内的 AWS 服务](https://aws.amazon.com/compliance/services-in-scope/)。
+ **云中的安全性** – 您的责任由您使用的 AWS 服务 决定。您还需要对其他因素负责，包括您的数据的敏感性、您组织的要求以及适用的法律法规。

此文档将帮助您了解如何在使用 Amazon Athena 时应用责任共担模型。以下主题说明如何配置 Athena 以实现您的安全性和合规性目标。您还将了解如何使用其他 AWS 服务 来帮助您监控和保护您的 Athena 资源。

**Topics**
+ [Athena 的数据保护](security-data-protection.md)
+ [Athena 中的 Identity and Access Management](security-iam-athena.md)
+ [记录和监控 Athena](security-logging-monitoring.md)
+ [的合规性验证](security-compliance-validation.md)
+ [Athena 中的故障恢复能力](security-resilience.md)
+ [Athena 中的基础设施安全性](security-infrastructure.md)
+ [Athena 中的配置和漏洞分析](security-vulnerability-management.md)
+ [使用 Athena 查询注册到 AWS Lake Formation 的数据](security-athena-lake-formation.md)

# 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 Security Blog* 上的 [AWS Shared Responsibility Model and 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。
+ 使用 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/](https://aws.amazon.com/compliance/fips/)。

强烈建议您切勿将机密信息或敏感信息（如您客户的电子邮件地址）放入标签或自由格式文本字段（如**名称**字段）。这包括使用控制台、API、AWS CLI 或 AWS SDK 处理或其他 AWS 服务 时。在用于名称的标签或自由格式文本字段中输入的任何数据都可能会用于计费或诊断日志。如果您向外部服务器提供 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 Crawler 以发现数据时创建的数据库和表的元数据、查询结果数据，以及查询历史记录。本部分介绍每种类型的数据并提供有关保护数据的指导。
+ **源数据** – 您在 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 使用基于读取的架构技术，这意味着当 Athena 运行查询时，表定义将应用于 Amazon S3 中的数据。您定义的任何架构都会自动保存，除非明确将其删除。在 Athena 中，您可以使用 DDL 语句修改 Data Catalog 元数据。您还可以删除表定义和架构，这不会影响存储在 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 天。您可以在控制台中使用 Athena API [查看查询历史记录](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 中针对同一区域或有限数量的区域中 Amazon S3 中的加密数据运行查询。您还可以加密 Amazon S3 中的查询结果以及 AWS Glue Data Catalog 中的数据。

您可以对 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 中，此选项要求您使用带有 `TBLPROPERTIES` 子句的 `CREATE TABLE` 语句，指定 `'has_encrypted_data'='true'` 或 `'encryption_option'='CSE_KMS'` 及 `'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-KMS 相比 SSE-S3 的优势**
+ SSE-KMS 允许您指定和管理自己的密钥，从而让您拥有更大的控制力。您可以定义密钥策略、监督密钥生命周期和监控密钥使用情况。

**SSE-KMS 相比 CSE-KMS 的优势**
+ 与 CSE-KMS 需要持续维护 S3 加密客户端不同，SSE-KMS 无需额外的基础设施来加密和解密数据。
+ 由于加密算法的不断发展，CSE-KMS 可能会面临新旧 S3 加密客户端之间的兼容性问题，而 SSE-KMS 则避免了这一问题。
+ 与 CSE-KMS 相比，SSE-KMS 在加密和解密过程中对 KMS 服务进行密钥检索的 API 调用更少，因此性能更高。

### 不支持的选项
<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 仅能直接支持 Amazon S3 加密客户端。如果您使用软件开发工具包对数据进行加密，则可以从 Athena 运行查询，但数据将作为加密文本返回。

如果要使用 Athena 查询已使用 AWS 加密软件开发工具包加密的数据，您必须下载并解密您的数据，然后使用 Amazon S3 加密客户端再次对其加密。

## Amazon S3 中加密数据的权限
<a name="permissions-for-encrypting-and-decrypting-data"></a>

根据在 Amazon S3 中使用的加密类型，可能需要向 Athena 中使用的策略添加权限（也称为“允许”操作）：
+ **SSE-S3** - 如果使用 SSE-S3 加密，则 Athena 用户无需在其策略中添加权限。对相应的 Amazon S3 位置和 Athena 操作具有适当的 Amazon S3 权限就足够了。要详细了解允许适当 Athena 和 Amazon S3 权限的策略，请参阅[Amazon Athena 的 AWS 托管策略](security-iam-awsmanpol.md)和 [控制从 Athena 对 Amazon S3 的访问](s3-permissions.md)。
+ **AWS KMS** - 如果使用 AWS KMS 加密，则除了 Athena 和 Amazon S3 权限之外，还必须允许 Athena 用户执行特定 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)。
**注意**  
高级密钥策略管理员可以调整密钥策略。要处理加密数据集，最少应允许 Athena 用户执行 `kms:Decrypt` 操作。要使用加密的查询结果，则最小允许操作是 `kms:GenerateDataKey` 和 `kms:Decrypt`。

  使用 Athena 查询 Amazon S3 中数据集时，如果该数据集具有大量使用 AWS KMS 加密的对象，则 AWS KMS 可能会对查询结果进行节流。当有大量的小对象时，这种可能性更大。Athena 已停止重试请求，但可能仍会发生节流错误。如果您在处理大量加密对象时遇到此问题，则可以选择启用 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)。

有关将 Amazon S3 与 Athena 结合使用时的权限疑难解答信息，请参阅 [在 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"` 操作。有关信息，请参阅[从 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 ]

   启动将显示表中 `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 会加密由查询写入的所有对象。这包括 `INSERT INTO` 和 `UPDATE` 等语句以及对 Iceberg 或其他格式数据的查询结果。

在控制台中，您可以通过两种方式配置对查询结果加密的设置：
+ **客户端设置** - 当您在控制台中使用 **Settings**（设置） 或者 API 操作来指示您希望加密查询结果时，这称为使用客户端设置。客户端设置包括查询结果位置和加密。如果您指定这些内容，则除非工作组设置进行覆盖，否则将使用它们。
+ **Workgroup settings**（工作组设置）– 当您[创建或编辑工作组](creating-workgroups.md)并选择 **Override client-side settings**（覆盖客户端设置）字段时，此工作组中运行的所有查询均使用工作组设置和查询结果位置设置。有关更多信息，请参阅 [Override client-side settings (覆盖客户端设置)](workgroups-settings-override.md)。

**使用控制台加密在 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_cn/athena/latest/ug/images/settings.png)

1. 选择**管理**。

1. 在 **Location of query result**（查询结果位置）中，输入或选择 Amazon S3 路径。这是存储查询结果的 Amazon S3 位置。

1. 选择 **Encrypt query results**。  
![\[Athena 控制台管理设置页面上的加密查询结果选项。\]](http://docs.aws.amazon.com/zh_cn/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>

如果您使用 JDBC 或 ODBC 驱动程序进行连接，请配置驱动程序选项来指定要使用的加密类型以及 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) 语句中，请使用 `TBLPROPERTIES` 子句指定 `encryption_option='CSE_KMS'` 和 `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 将使用 `kms_key` 中的 AWS KMS 密钥来解密 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) 语句，请使用 `TBLPROPERTIES` 子句指定 `has_encrypted_data='true'`，如以下示例所示。

```
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 加密对象，但不建议混合使用服务器端和客户端加密对象。

**注意**  
当 `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'` 属性添加到表格。

![\[在添加表单项中选择 Encrypted data set（加密的数据集）\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/add-table-form-encrypted-option.png)


在 Athena 控制台的表列表中，CSE-KMS 加密的表含有 `has_encrypted_data='true'`，显示钥匙形图标。

![\[加密表图标\]](http://docs.aws.amazon.com/zh_cn/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) 语句中，请使用 `TBLPROPERTIES` 子句指定 `encryption_option='SSE_S3 | SSE_KMS | CSE_KMS'` 和 `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 加密，不混合使用非 CSE-KMS 和 CSE-KMS 加密对象。

# 传输中加密
<a name="encryption-in-transit"></a>

除了对 Amazon S3 中的数据静态加密，Amazon Athena 还对 Athena 与 Amazon S3 之间、以及 Athena 与访问它的客户应用程序之间的传输中数据使用传输层安全性 (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 支持使用 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 签名版本 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 客户端的查询结果使用传输层安全性 (TLS) 进行加密。

  您可以在私有网络与 AWS 之间使用以下连接选项之一：
  + 一个 Site-to-Site VPN Site-to-Site VPN 连接。有关更多信息，请参阅《*AWS Site-to-Site VPN 用户指南*》中的[什么是 Site-to-Site VPN Site-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 存储桶之间的流量**，传输层安全性 (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 遵守多个 AWS 合规性计划，其中包括 SOC、PCI、FedRAMP 及其他计划。有关更多信息，请参阅[合规性计划范围内的 AWS 服务](https://aws.amazon.com/compliance/services-in-scope/)。

# Athena 中的 Identity and Access Management
<a name="security-iam-athena"></a>

Amazon Athena 使用 [AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) 策略来限制对 Athena 操作的访问。有关 Athena 的完整权限列表，请参阅《服务授权参考**》中的 [Amazon Athena 的操作、资源和条件键](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonathena.html)。

每当您使用 IAM 策略时，请确保遵循 IAM 最佳实践。有关更多信息，请参阅《[IAM 用户指南](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)》中的 *IAM 安全最佳实践*。

运行 Athena 查询所需的权限包含以下内容：
+ 存储查询底层数据的 Amazon S3 位置。有关更多信息，请参阅《*Amazon Simple Storage Service 用户指南*》中的 [Amazon S3 中的身份和访问管理](https://docs.aws.amazon.com/AmazonS3/latest/dev/s3-access-control.html)。
+ 在 AWS Glue Data Catalog 中存储的元数据和资源，例如数据库和表，包括加密元数据的其他操作。有关更多信息，请参阅《AWS Glue 开发人员指南**》中的[为 AWS Glue 设置 IAM 权限](https://docs.aws.amazon.com/glue/latest/dg/getting-started-access.html)和[在 AWS Glue 中设置加密](https://docs.aws.amazon.com/glue/latest/dg/set-up-encryption.html)。
+ Athena API 操作。有关 Athena 中 API 操作的完整列表，请参阅 *Amazon Athena API 参考*中的[操作](https://docs.aws.amazon.com/athena/latest/APIReference/API_Operations.html)。

以下主题提供了有关 Athena 的特定区域权限的更多信息。

**Topics**
+ [AWS 托管策略](security-iam-awsmanpol.md)
+ [数据边界](data-perimeters.md)
+ [通过 JDBC 和 ODBC 连接访问](policy-actions.md)
+ [控制从 Athena 对 Amazon S3 的访问](s3-permissions.md)
+ [对 S3 存储桶的跨账户访问](cross-account-permissions.md)
+ [对 AWS Glue 中数据库和表的访问](fine-grained-access-to-glue-resources.md)
+ [授予 AWS Glue 数据目录跨账户访问权限](security-iam-cross-account-glue-catalog-access.md)
+ [针对数据目录中加密元数据的访问权限](access-encrypted-data-glue-data-catalog.md)
+ [对工作组和标签的访问](workgroups-access.md)
+ [使用 IAM 策略控制工作组访问](workgroups-iam-policy.md)
+ [已启用 IAM Identy Center 的工作组](workgroups-identity-center.md)
+ [配置最低加密](workgroups-minimum-encryption.md)
+ [配置对于预编译语句的访问](security-iam-athena-prepared-statements.md)
+ [使用 CalledVia 上下文密钥](security-iam-athena-calledvia.md)
+ [允许访问适用于外部配置 Hive 元存储的 Athena 数据连接器](hive-metastore-iam-access.md)
+ [允许 Lambda 函数访问外部 Hive 元存储](hive-metastore-iam-access-lambda.md)
+ [创建连接器和 Athena 目录所需的权限](athena-catalog-access.md)
+ [允许访问 Athena 联合查询](federated-query-iam-access.md)
+ [允许访问 UDF](udf-iam-access.md)
+ [允许使用 Athena 访问机器学习](machine-learning-iam-access.md)
+ [启用对 Athena API 的联合访问](access-federation-saml.md)

# Amazon Athena 的 AWS 托管策略
<a name="security-iam-awsmanpol"></a>

AWS 托管式策略是由 AWS 创建和管理的独立策略。AWS 托管式策略旨在为许多常见使用案例提供权限，以便您可以开始为用户、组和角色分配权限。

请记住，AWS 托管式策略可能不会为您的特定使用案例授予最低权限，因为它们可供所有 AWS 客户使用。我们建议通过定义特定于使用案例的[客户管理型策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#customer-managed-policies)来进一步减少权限。

您无法更改 AWS 托管式策略中定义的权限。如果 AWS 更新在 AWS 托管式策略中定义的权限，则更新会影响该策略所附加到的所有主体身份（用户、组和角色）。当新的 AWS 服务 启动或新的 API 操作可用于现有服务时，AWS 最有可能更新 AWS 托管式策略。

有关更多信息，请参阅《IAM 用户指南》**中的 [AWS 托管式策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#aws-managed-policies)。

## 在 Athena 中使用托管策略时的注意事项
<a name="managed-policies-considerations"></a>

托管策略易于使用，并且随着服务的发展而自动使用必需的操作进行更新。将托管策略与 Athena 结合使用时，请记住以下几点：
+ 要使用 AWS Identity and Access Management（IAM）为您自己或其他用户允许或拒绝 Amazon Athena 服务操作，请将基于身份的策略附加到主体，例如用户或组。
+ 每个基于身份的策略均包含用于定义允许或拒绝的操作的语句。有关将策略附加到用户的更多信息和分步说明，请参阅 [IAM 用户指南](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-using.html#attach-managed-policy-console)中的 *附加托管式策略*。有关操作列表，请参阅 [Amazon Athena API 参考](https://docs.aws.amazon.com/athena/latest/APIReference/)。
+  *客户托管*策略和基于身份的*内联*策略允许您在策略内指定更详细的 Athena 操作来微调访问权限。我们建议您使用 `AmazonAthenaFullAccess` 策略作为起始点，然后允许或拒绝 [Amazon Athena API 参考](https://docs.aws.amazon.com/athena/latest/APIReference/)中所列的特定操作。有关内联策略的更多信息，请参阅《IAM 用户指南**》中的 [托管式策略与内联策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html)。
+ 如果您还具有使用 JDBC 连接的主体，则必须为您的应用程序提供 JDBC 驱动程序凭证。有关更多信息，请参阅 [控制通过 JDBC 和 ODBC 连接的访问](policy-actions.md)。
+ 如果您已加密 AWS Glue Data Catalog，则必须在基于身份的 IAM 策略中为 Athena 指定其他操作。有关更多信息，请参阅 [从 Athena 配置对 AWS Glue Data Catalog 中加密元数据的访问](access-encrypted-data-glue-data-catalog.md)。
+ 如果您创建和使用工作组，请确保您的策略包括对工作组操作的相关访问权限。有关详细信息，请参阅[使用 IAM 策略控制工作组访问](workgroups-iam-policy.md)和[工作组策略示例](example-policies-workgroup.md)。

## AWS 托管策略：AmazonAthenaFullAccess
<a name="amazonathenafullaccess-managed-policy"></a>

`AmazonAthenaFullAccess` 托管策略授予对 Athena 的完全访问权限。

要提供访问权限，请为您的用户、组或角色添加权限：
+ AWS IAM Identity Center 中的用户和群组：

  创建权限集合。按照《AWS IAM Identity Center 用户指南》**中[创建权限集](https://docs.aws.amazon.com//singlesignon/latest/userguide/howtocreatepermissionset.html)的说明进行操作。
+ 通过身份提供者在 IAM 中托管的用户：

  创建适用于身份联合验证的角色。按照《IAM 用户指南》**中[针对第三方身份提供者创建角色（联合身份验证）](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_roles_create_for-idp.html)的说明进行操作。
+ IAM 用户：
  + 创建您的用户可以担任的角色。按照《IAM 用户指南》**中[为 IAM 用户创建角色](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_roles_create_for-user.html)的说明进行操作。
  + （不推荐使用）将策略直接附加到用户或将用户添加到用户组。按照《IAM 用户指南**》中[向用户添加权限（控制台）](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_users_change-permissions.html#users_change_permissions-add-console)中的说明进行操作。

### 权限组
<a name="amazonathenafullaccess-managed-policy-groupings"></a>

`AmazonAthenaFullAccess` 策略被分组为以下权限集。
+ **`athena`**：允许主体访问 Athena 资源。
+ **`glue`** – 允许主体访问 AWS Glue 目录、数据库、表和分区。这是必需的，以便主体可以将 AWS Glue Data Catalog 和 Athena 搭配使用。
+ **`s3`**：允许主体从 Amazon S3 编写和读取查询结果，读取驻留在 Amazon S3 中的公开可用的 Athena 数据示例，并列出存储桶。这是必需的，以便主体可以将 Athena 与 Amazon S3 搭配使用。
+ **`sns`**：允许主体列出 Amazon SNS 主题并获取主题属性。这使主体能够将 Amazon SNS 主题与 Athena 结合使用，以进行监控和提示。
+ **`cloudwatch`**：允许主体创建、读取和删除 CloudWatch 告警。有关更多信息，请参阅 [使用 CloudWatch 和 EventBridge 监控查询并控制成本](workgroups-control-limits.md)。
+ **`lakeformation`**：允许主体请求临时证书以访问已注册到 Lake Formation 的数据湖位置中的数据。有关更多信息，请参阅《AWS Lake Formation 开发人员指南[https://docs.aws.amazon.com/lake-formation/latest/dg/access-control-underlying-data.html](https://docs.aws.amazon.com/lake-formation/latest/dg/access-control-underlying-data.html)》中的*底层数据访问控制*。
+ **`datazone`** – 允许主体列出 Amazon DataZone 项目、域和环境。有关如何在 Athena 中使用 DataZone 的信息，请参阅 [在 Athena 中使用 Amazon DataZone](datazone-using.md)。
+ **`pricing`** – 提供对 AWS 账单与成本管理 的访问权限。有关更多信息，请参阅《AWS 账单与成本管理 API 参考》中的 [GetProducts](https://docs.aws.amazon.com/aws-cost-management/latest/APIReference/API_pricing_GetProducts.html)**。

要查看此策略的权限，请参阅《AWS Managed Policy Reference》中的 [AmazonAthenaFullAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonAthenaFullAccess.html)。

**注意**  
您必须明确允许访问服务拥有的 Amazon S3 存储桶来存储示例查询和示例数据集。有关更多信息，请参阅 [数据边界](data-perimeters.md)。

## AWS 托管策略：AWSQuicksightAthenaAccess
<a name="awsquicksightathenaaccess-managed-policy"></a>

`AWSQuicksightAthenaAccess` 授予对 Quick 与 Athena 集成所需的操作的访问权限。您可以将 `AWSQuicksightAthenaAccess` 策略附加到 IAM 身份。仅将此策略附加到将 Quick 与 Athena 结合使用的主体。此策略包括 Athena 的一些操作，这些操作已弃用且未包含在当前公有 API 中或仅与 JDBC 和 ODBC 驱动程序一起使用。

### 权限组
<a name="awsquicksightathenaaccess-managed-policy-groupings"></a>

`AWSQuicksightAthenaAccess` 策略被分组为以下权限集。
+ **`athena`**：允许主体对 Athena 资源运行查询。
+ **`glue`** – 允许主体访问 AWS Glue 目录、数据库、表和分区。这是必需的，以便主体可以将 AWS Glue Data Catalog 和 Athena 搭配使用。
+ **`s3`**：允许主体从 Amazon S3 中写入和读取查询结果。
+ **`lakeformation`**：允许主体请求临时证书以访问已注册到 Lake Formation 的数据湖位置中的数据。有关更多信息，请参阅《AWS Lake Formation 开发人员指南[https://docs.aws.amazon.com/lake-formation/latest/dg/access-control-underlying-data.html](https://docs.aws.amazon.com/lake-formation/latest/dg/access-control-underlying-data.html)》中的*底层数据访问控制*。

要查看此策略的权限，请参阅《AWS Managed Policy Reference》中的 [AWSQuicksightAthenaAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSQuicksightAthenaAccess.html)。

## AWS 托管策略的 Athena 更新
<a name="managed-policies-updates"></a>

查看有关 Athena AWS 托管策略更新的详细信息（从该服务开始跟踪这些更改开始）。


| 更改 | 描述 | 日期 | 
| --- | --- | --- | 
| [AWSQuicksightAthenaAccess](#awsquicksightathenaaccess-managed-policy) – 对现有策略的更新 | 添加了 glue:GetCatalog 和 glue:GetCatalogs 权限，让 Athena 用户能够访问 SageMaker AI Lakehouse 目录。 | 2025 年 1 月 2 日 | 
| [AmazonAthenaFullAccess](#amazonathenafullaccess-managed-policy) – 对现有政策的更新 | 添加了 glue:GetCatalog 和 glue:GetCatalogs 权限，让 Athena 用户能够访问 SageMaker AI Lakehouse 目录。 | 2025 年 1 月 2 日 | 
| [AmazonAthenaFullAccess](#amazonathenafullaccess-managed-policy) – 对现有政策的更新 |  允许 Athena 使用公开记录的 AWS Glue `GetCatalogImportStatus` API 来检索目录导入状态。  | 2024 年 6 月 18 日 | 
|  [AmazonAthenaFullAccess](#amazonathenafullaccess-managed-policy) – 对现有政策的更新  |  添加了 `datazone:ListDomains`、`datazone:ListProjects` 和 `datazone:ListAccountEnvironments` 权限，以使 Athena 用户能够使用 Amazon DataZone 域、项目和环境。有关更多信息，请参阅 [在 Athena 中使用 Amazon DataZone](datazone-using.md)。  | 2024 年 1 月 3 日 | 
|  [AmazonAthenaFullAccess](#amazonathenafullaccess-managed-policy) – 对现有政策的更新  |  添加了 `glue:StartColumnStatisticsTaskRun`、`glue:GetColumnStatisticsTaskRun` 和 `glue:GetColumnStatisticsTaskRuns` 权限，以使 Athena 有权调用 AWS Glue，以检索基于成本的优化器功能的统计数据。有关更多信息，请参阅 [使用成本型优化器](cost-based-optimizer.md)。  | 2024 年 1 月 3 日 | 
|  [AmazonAthenaFullAccess](#amazonathenafullaccess-managed-policy) – 对现有政策的更新  |  Athena 增加了 `pricing:GetProducts` 以提供对 AWS 账单与成本管理 的访问权限。有关更多信息，请参阅《AWS 账单与成本管理 API 参考》中的 [GetProducts](https://docs.aws.amazon.com/aws-cost-management/latest/APIReference/API_pricing_GetProducts.html)**。  | 2023 年 1 月 25 日 | 
|  [AmazonAthenaFullAccess](#amazonathenafullaccess-managed-policy) – 对现有政策的更新  |  Athena 添加了 `cloudwatch:GetMetricData`，用以检索 CloudWatch 指标值。有关更多信息，请参阅 *Amazon CloudWatch API 参考*中的 [GetMetricData](https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_GetMetricData.html)。  | 2022 年 11 月 14 日 | 
|  [AmazonAthenaFullAccess](#amazonathenafullaccess-managed-policy) 和 [AWSQuicksightAthenaAccess](#awsquicksightathenaaccess-managed-policy) – 对现有策略的更新  |  将 Athena 添加到 `s3:PutBucketPublicAccessBlock` 以允许阻止对 Athena 创建的存储桶的公共访问。  | 2021 年 7 月 7 日 | 
|  Athena 开始跟踪变更  |  Athena 为其 AWS 托管策略开启了跟踪更改。  | 2021 年 7 月 7 日 | 

# 数据边界
<a name="data-perimeters"></a>

[数据边界](https://aws.amazon.com/identity/data-perimeters-on-aws/)是 AWS 环境中的一组权限防护机制，可用于帮助确保只有可信身份才能访问来自预期网络的可信资源。

Amazon Athena 使用服务拥有的 Amazon S3 存储桶来存储示例查询和示例数据集。如果使用数据边界来控制环境中的访问权限，则必须明确允许访问这些服务拥有的资源才能使用相应的 Athena 功能。

 下表列出了 Athena 需要访问的 Amazon S3 存储桶的 ARN、所需的权限、Athena 使用的身份以及依赖于 S3 存储桶的功能。要允许访问，请将存储桶 ARN 中的 `<region>` 替换为实际 AWS 区域，并根据 Amazon S3 访问控制将此存储桶列入许可名单。


**Athena 使用的数据边界**  

| 资源 ARN | 所需的权限 | 用于访问的身份 | 访问场景 | 
| --- | --- | --- | --- | 
|  arn:aws:s3:::athena-examples-<region>  | s3:GetObjects3:ListBucket | 访问 Athena 的 IAM 主体。 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/data-perimeters.html)  | 

# 控制通过 JDBC 和 ODBC 连接的访问
<a name="policy-actions"></a>

若要获得 AWS 服务 和资源（如 Athena 和 Amazon S3 存储桶）的访问权限，请向您的应用程序提供 JDBC 或 ODBC 驱动程序凭证。如果您使用的是 JDBC 或 ODBC 驱动程序，请确保 IAM 权限策略包括 [AWS 托管策略：AWSQuicksightAthenaAccess](security-iam-awsmanpol.md#awsquicksightathenaaccess-managed-policy) 中列出的所有操作。

每当您使用 IAM 策略时，请确保遵循 IAM 最佳实践。有关更多信息，请参阅《[IAM 用户指南](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)》中的 *IAM 安全最佳实践*。

## 身份验证方法
<a name="security-jdbc-odbc-access-authentication"></a>

Athena JDBC 和 ODBC 驱动程序支持基于 SAML 2.0 的身份验证，包括以下身份提供程序：
+ Active Directory 联合身份验证服务 (AD FS)
+ Azure Active Directory (AD)
+ Okta 
+ PingFederate

有关详细信息，请参阅相应驱动程序的安装和配置指南，可从 [JDBC](connect-with-jdbc.md) 和 [ODBC](connect-with-odbc.md) 驱动程序页面下载 PDF 格式文件。有关更多信息，请参阅以下内容：
+ [启用对 Athena API 的联合访问](access-federation-saml.md)
+ [将 Lake Formation 和 JDBC 或 ODBC 驱动程序用于对 Athena 进行联合访问](security-athena-lake-formation-jdbc.md)
+  [使用 ODBC、SAML 2.0 和 Okta 身份提供商配置单点登录](okta-saml-sso.md)

有关最新版本的 JDBC 和 ODBC 驱动程序及其文档的信息，请参阅[通过 JDBC 连接到 Amazon Athena](connect-with-jdbc.md)和[通过 ODBC 连接到 Amazon Athena](connect-with-odbc.md)。

# 控制从 Athena 对 Amazon S3 的访问
<a name="s3-permissions"></a>

您可以使用基于身份的策略、存储桶资源策略、接入点策略或上述内容的任意组合授予对 Amazon S3 位置的访问权限。当参与者与 Athena 交互时，其权限会通过 Athena 传递，以确定 Athena 可以访问的内容。这意味着用户必须具有 Amazon S3 存储桶的访问权限，才能使用 Athena 进行查询。

每当您使用 IAM 策略时，请确保遵循 IAM 最佳实践。有关更多信息，请参阅《[IAM 用户指南](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)》中的 *IAM 安全最佳实践*。

请注意，对 Amazon S3 的请求来自 Athena 的私有 IPv4 地址，而不是 `aws:SourceIp` 中指定的源 IP。因此，不能使用 `aws:SourceIp` 条件拒绝访问给定 IAM 策略中的 Amazon S3 操作。也无法根据 `aws:SourceVpc` 或 `aws:SourceVpce` 条件键限制或允许对 Amazon S3 资源的访问。

**注意**  
使用 IAM Identity Center 身份验证的 Athena 工作组要求将 S3 访问权限管控配置为使用可信身份传播身份。有关更多信息，请参阅《Amazon Simple Storage Service 用户指南》**中的 [S3 Access Grants and directory identities](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-grants-directory-ids.html)。

**Topics**
+ [基于身份的策略](#s3-permissions-identity-based-policies)
+ [存储桶资源策略](#s3-permissions-bucket-resource-policies)
+ [接入点策略](#s3-permissions-aliases)
+ [CalledVia 上下文键](#s3-permissions-calledvia)
+ [其他资源](#s3-permissions-additional-resources)

## 使用基于身份的策略来控制对 Amazon S3 存储桶的访问
<a name="s3-permissions-identity-based-policies"></a>

基于身份的策略附加到 IAM 用户、组或角色。这些策略可让您指定该身份可执行哪些操作（其权限）。可以使用基于身份的策略来控制对 Amazon S3 存储桶的访问。

以下基于身份的策略允许 `Read` 和 `Write` 访问特定 Amazon S3 存储桶中的对象。要使用此策略，请将*斜体占位符文本*替换为您自己的值。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "ListObjectsInBucket",
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket"
            ]
        },
        {
            "Sid": "AllObjectActions",
            "Effect": "Allow",
            "Action": "s3:*Object",
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket/*"
            ]
        }
    ]
}
```

------

## 使用存储桶资源策略控制对 Amazon S3 存储桶的访问
<a name="s3-permissions-bucket-resource-policies"></a>

可以使用 Amazon S3 存储桶策略来保护对存储桶中对象的访问，以便只有具有适当权限的用户才能访问这些对象。有关创建 Amazon S3 策略的指导，请参阅《*Amazon S3 用户指南*》中的[使用 Amazon S3 控制台添加存储桶策略](https://docs.aws.amazon.com/AmazonS3/latest/userguide/add-bucket-policy.html)。

以下示例权限策略限制用户读取具有 `environment: production` 标签键和值的对象。该示例策略使用 `s3:ExistingObjectTag` 条件键来指定标签键和值。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:role/JohnDoe"
            },
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:GetObjectVersion"
            ],
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*",
            "Condition": {
                "StringEquals": {
                    "s3:ExistingObjectTag/environment": "production"
                }
            }
        }
    ]
}
```

------

有关更多存储桶策略示例，请参阅《*Amazon S3 用户指南*》中的 [Amazon S3 存储桶策略的示例](https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies.html)。

## 使用 Amazon S3 接入点对存储桶访问进行更精确的控制
<a name="s3-permissions-aliases"></a>

如果您在 Amazon S3 存储桶中拥有共享数据集，则维护单个存储桶策略以管理数百个使用案例的访问权限可能会非常困难。

Amazon S3 存储桶接入点、策略和别名有助于解决此问题。一个存储桶可以有多个接入点，每个接入点都有一个策略，能够以不同方式控制对存储桶的访问。

对于您创建的每个接入点，Amazon S3 都会生成一个代表接入点的别名。由于别名采用 Amazon S3 存储桶名称格式，因此您可以在 Athena 中 `CREATE TABLE` 语句的 `LOCATION` 子句中使用别名。然后，Athena 对存储桶的访问由别名所代表的接入点策略控制。

有关更多信息，请参阅《Amazon S3 用户指南》**中的 [指定 Amazon S3 中的表位置](tables-location-format.md) 和[使用接入点](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-points.html)。

## 使用 CalledVia 上下文密钥，以仅允许从 Athena 调用其他服务
<a name="s3-permissions-calledvia"></a>

为了增加安全性，您可以使用 [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) 全局条件上下文键。`aws:CalledVia` 条件键包含您允许调用其他服务的服务列表。例如，通过为 `aws:CalledVia` 上下文密钥指定 Athena 服务主体名称 (`athena.amazonaws.com`)，您可以仅在调用来自 Athena 时允许对 AWS Lambda 进行 `InvokeFunction` 调用。有关更多信息，请参阅 [使用适用于 Athena 的 CalledVia 上下文密钥](security-iam-athena-calledvia.md)。

## 其他资源
<a name="s3-permissions-additional-resources"></a>

有关如何授予 Amazon S3 访问权限的详细信息和示例，请参阅以下资源：
+ 《Amazon S3 用户指南**》中的 [示例演练：管理访问](https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-walkthroughs-managing-access.html)。
+ AWS 知识中心中的[如何提供对 Amazon S3 存储桶中对象的跨账户访问权限？](https://aws.amazon.com/premiumsupport/knowledge-center/cross-account-access-s3/)。
+ [在 Athena 中配置对 Amazon S3 存储桶的跨账户存取](cross-account-permissions.md).

# 在 Athena 中配置对 Amazon S3 存储桶的跨账户存取
<a name="cross-account-permissions"></a>

一个常见的 Amazon Athena 方案是向账户中与存储桶拥有者不同的用户授予访问权限，以便他们可以执行查询。在这种情况下，使用存储桶策略来授予访问权限。

**注意**  
有关从 Athena 跨账户访问 AWS Glue 数据目录的信息，请参阅 [配置 AWS Glue 数据目录的跨账户存取](security-iam-cross-account-glue-catalog-access.md)。

以下示例存储桶策略 (由存储桶所有者创建并应用到存储桶 `s3://amzn-s3-demo-bucket`) 向账户 `123456789123` (它是不同账户) 中的所有用户授予访问权限。

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

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Id": "MyPolicyID",
   "Statement": [
      {
          "Sid": "MyStatementSid",
          "Effect": "Allow",
          "Principal": {
             "AWS": "arn:aws:iam::123456789123:root"
          },
          "Action": [
             "s3:GetBucketLocation",
             "s3:GetObject",
             "s3:ListBucket",
             "s3:ListBucketMultipartUploads",
             "s3:ListMultipartUploadParts",
             "s3:AbortMultipartUpload"
          ],
          "Resource": [
             "arn:aws:s3:::amzn-s3-demo-bucket",
             "arn:aws:s3:::amzn-s3-demo-bucket/*"
          ]
       }
    ]
 }
```

------

要向账户中的特定用户授予访问权限，请将 `Principal` 密钥替换为用户指定的密钥，而不是 `root`。例如，对于用户配置文件 `Dave`，请使用 `arn:aws:iam::123456789123:user/Dave`。

## 对使用自定义 AWS KMS 密钥加密的存储桶配置跨账户访问
<a name="cross-account-permissions-kms"></a>

如果您的 Amazon S3 存储桶使用自定义 AWS Key Management Service (AWS KMS) 密钥加密，则可能需要向其他 Amazon Web Services 账户中的用户授予访问该存储桶的权限。

向账户 B 中的用户授予对账户 A 中 AWS KMS 加密存储桶的访问权限需要以下权限：
+ 账户 A 中的存储桶策略必须授予对账户 B 所担任角色的访问权限。
+ 账户 A 中的 AWS KMS 密钥策略必须授予对账户 B 中用户所担任角色的访问权限。
+ 账户 B 担任的 AWS Identity and Access Management（IAM）角色必须同时授予对账户 A 中存储桶和密钥的访问权限。

以下过程描述如何授予这些权限中的每个权限。

**向账户 b 中的用户授予对账户 a 中存储桶的访问权限**
+ 在账户 A 中，[查看 S3 存储桶策略](https://docs.aws.amazon.com/AmazonS3/latest/userguide/add-bucket-policy.html)并确认存在允许从账户 B 的账户 ID 访问的语句。

  例如，以下存储桶策略允许 `s3:GetObject` 访问账户 ID `111122223333`：

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

****  

  ```
  {
    "Id": "ExamplePolicy1",
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Sid": "ExampleStmt1",
        "Action": [
          "s3:GetObject"
        ],
        "Effect": "Allow",
        "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*",
        "Principal": {
          "AWS": [
            "111122223333"
          ]
        }
      }
    ]
  }
  ```

------

**从账户 a 中的 AWS KMS 密钥策略向账户 b 中的用户授予访问权限**

1. 在账户 A 的 AWS KMS 密钥策略中，向账户 B 所担任的角色授予执行以下操作的权限：
   +  `kms:Encrypt` 
   +  `kms:Decrypt` 
   +  `kms:ReEncrypt*` 
   +  `kms:GenerateDataKey*` 
   +  `kms:DescribeKey` 

   以下示例仅向一个 IAM 角色授予密钥访问权限。

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "AllowUseOfTheKey",
               "Effect": "Allow",
               "Principal": {
                   "AWS": "arn:aws:iam::111122223333:role/role_name"
               },
               "Action": [
                   "kms:Encrypt",
                   "kms:Decrypt",
                   "kms:ReEncrypt*",
                   "kms:GenerateDataKey*",
                   "kms:DescribeKey"
               ],
               "Resource": "*"
           }
       ]
   }
   ```

------

1. 在账户 A 中，[使用 AWS 管理控制台 策略视图](https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-modifying.html#key-policy-modifying-how-to-console-policy-view)查看密钥策略。

1. 在密钥策略中，验证以下语句是否将账户 B 列为主体。

   ```
   "Sid": "Allow use of the key" 
   ```

1. 如果 `"Sid": "Allow use of the key"` 语句不存在，请执行以下步骤：

   1. 切换到[使用控制台默认视图](https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-modifying.html#key-policy-modifying-how-to-console-default-view)查看密钥策略。

   1.  将账户 B 的账户 ID 添加为可访问密钥的外部账户。

**从账户 b 担任的 IAM 角色中授予对账户 a 中存储桶和密钥的访问权限**

1. 从账户 B 中，在 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 开启 IAM 控制台。

1. 打开与账户 B 中用户关联的 IAM 角色。

1. 查看应用于 IAM 角色的权限策略列表。

1. 确保应用授予对存储桶的访问权限的策略。

   以下示例语句授予 IAM 角色对存储桶 `amzn-s3-demo-bucket` 执行 `s3:GetObject` 和 `s3:PutObject` 操作的访问权限：

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "ExampleStmt2",
         "Action": [
           "s3:GetObject",
           "s3:PutObject"
         ],
         "Effect": "Allow",
         "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*"
       }
     ]
   }
   ```

------

1. 确保应用授予对密钥的访问权限的策略。
**注意**  
如果账户 B 所担任的 IAM 角色已经具有[管理员访问权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/getting-started_create-admin-group.html)，则您无需从用户的 IAM 策略授予对密钥的访问权限。

   以下示例语句授予 IAM 角色使用密钥 `arn:aws:kms:us-west-2:123456789098:key/111aa2bb-333c-4d44-5555-a111bb2c33dd` 的权限。

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "ExampleStmt3",
         "Action": [
           "kms:Decrypt",
           "kms:DescribeKey",
           "kms:Encrypt",
           "kms:GenerateDataKey",
           "kms:ReEncrypt*"
         ],
         "Effect": "Allow",
         "Resource": "arn:aws:kms:us-west-2:123456789098:key/111aa2bb-333c-4d44-5555-a111bb2c33dd"
       }
     ]
   }
   ```

------

## 对存储桶对象配置跨账户访问
<a name="cross-account-permissions-objects"></a>

由存储桶拥有账户（账户 A）以外的账户（账户 C）上载的对象可能需要明确的对象级 ACL，以向查询账户（账户 B）授予读取访问权限。为避免此要求，账户 C 在将对象放入账户 A 的存储桶之前应代入账户 A 中的角色。有关更多信息，请参阅[如何提供对 Amazon S3 存储桶中的对象的跨账户访问权限？](https://aws.amazon.com/premiumsupport/knowledge-center/cross-account-access-s3/)。

# 在 AWS Glue Data Catalog 中配置对数据库和表的访问
<a name="fine-grained-access-to-glue-resources"></a>

如果您将 AWS Glue Data Catalog 与 Amazon Athena 结合使用，则可以为 Athena 中使用的数据库和表 Data Catalog 对象定义资源级策略。

**注意**  
本主题将讨论数据库和表级别的安全性。有关配置列级别、行级别和单元格级别安全性的信息，请参阅 [Data filtering and cell-level security in Lake Formation](https://docs.aws.amazon.com/lake-formation/latest/dg/data-filtering.html)。

在 IAM 基于身份的策略中定义资源级别权限。

**重要**  
本部分介绍 IAM 基于身份的策略中的资源级权限。这些权限与基于资源的策略不同。有关差异的更多信息，请参阅 [IAM 用户指南](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_identity-vs-resource.html) 中的 *基于身份的策略与基于资源的策略*。

对于这些任务，请参阅以下主题：


| 执行此任务 | 请参阅以下主题 | 
| --- | --- | 
| 创建定义针对资源访问的 IAM 策略 | 《IAM 用户指南》中的[创建 IAM 策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html)。 | 
| 了解 AWS Glue 中使用 IAM 基于身份的策略 | 《AWS Glue 开发人员指南》中的[基于身份的策略（IAM 策略）](https://docs.aws.amazon.com/glue/latest/dg/using-identity-based-policies.html)。 | 

 **本节内容** 
+  [限制](#access-to-glue-resources-limitations) 
+  [针对每个 AWS 区域 配置对目录和数据库的 AWS Glue 访问](#full-access-to-default-db-per-region) 
+  [关于 AWS Glue 中表分区和版本的访问控制](#access-to-glue-resources-table-partitions-and-versions) 
+  [数据库和表级别权限示例](#examples-fine-grained-table-database-policies) 

## 限制
<a name="access-to-glue-resources-limitations"></a>

当您针对 AWS Glue Data Catalog 和 Athena 使用数据库和表级别的访问控制时，请考虑以下限制：
+ 启用了 IAM Identity Center 的 Athena 工作组要求将 Lake Formation 配置为使用 IAM Identity Center 身份。有关更多信息，请参阅《AWS Lake Formation 用户指南》**中的 [Integrating IAM Identity Center](https://docs.aws.amazon.com/lake-formation/latest/dg/identity-center-integration.html)。
+ 您只能限制对数据库和表的访问。这些控件适用于表级别。您无法限制对表内各个分区的访问。有关更多信息，请参阅 [关于 AWS Glue 中表分区和版本的访问控制](#access-to-glue-resources-table-partitions-and-versions)。
+ AWS Glue Data Catalog包含以下资源：`CATALOG`、`DATABASE`、`TABLE` 和 `FUNCTION`。
**注意**  
对于此列表，各个账户的在 Athena 与 AWS Glue Data Catalog 之间公用的资源包括 `TABLE`、`DATABASE` 和 `CATALOG`，而 `Function` 特定于 AWS Glue。对于 Athena 中的删除操作，您必须包含对 AWS Glue 操作的权限。请参阅[数据库和表级别权限示例](#examples-fine-grained-table-database-policies)。

  层次结构如下所示：`CATALOG` 是每个账户中所有 `DATABASES` 的原级，`DATABASE` 是其所有 `TABLES` 和 `FUNCTIONS` 的原级。例如，在您账户的目录中，对于属于 `db` 数据库的名为 `table_test` 的表，其原级为您账户中的 `db` 和目录。对于 `db` 数据库，其原级是您的账户中的目录，其后代是表和函数。有关资源的层次结构的更多信息，请参阅《AWS Glue 开发人员指南》**中的 [Data Catalog 中的 ARN 列表](https://docs.aws.amazon.com/glue/latest/dg/glue-specifying-resource-arns.html#data-catalog-resource-arns)。
+ 对于资源上的任何非删除 Athena 操作，例如 `CREATE DATABASE`、`CREATE TABLE`、`SHOW DATABASE`、`SHOW TABLE` 或 `ALTER TABLE`，您需要在资源（表或数据库）上以及该资源在 Data Catalog 中的所有原级上调用该操作的权限。例如，对于表来说，其原级是所属的数据库以及账户的目录。对于数据库来说，其原级是账户的目录。请参阅[数据库和表级别权限示例](#examples-fine-grained-table-database-policies)。
+ 对于 Athena 中的删除操作（例如 `DROP DATABASE` 或 `DROP TABLE`），您还需要拥有在该数据目录中资源的所有祖先级和子孙级上调用删除操作的权限。例如，要删除数据库，您需要数据库、目录（作为数据库的原级）以及所有表和用户定义的函数（作为数据库的子代）的权限。表没有子代。要运行 `DROP TABLE`，您需要对该表、该表所属的数据库以及目录执行该操作的权限。请参阅[数据库和表级别权限示例](#examples-fine-grained-table-database-policies)。

## 针对每个 AWS 区域 配置对目录和数据库的 AWS Glue 访问
<a name="full-access-to-default-db-per-region"></a>

为了让 Athena 使用 AWS Glue，需要制定一项策略，授予访问您的数据库和您账户中每个 AWS 区域 的 AWS Glue Data Catalog 的相应权限。要创建数据库，还需要 `CreateDatabase` 权限。在以下示例策略中，将 AWS 区域、AWS 账户 ID 和数据库名称替换为您自己的名称。

```
{
   "Sid": "DatabasePermissions",
   "Effect": "Allow",
   "Action": [
      "glue:GetDatabase", 
      "glue:GetDatabases",
      "glue:CreateDatabase"
   ],
   "Resource": [
     "arn:aws:glue:us-east-1:123456789012:catalog",
     "arn:aws:glue:us-east-1:123456789012:database/default"
   ]
}
```

## 关于 AWS Glue 中表分区和版本的访问控制
<a name="access-to-glue-resources-table-partitions-and-versions"></a>

在 AWS Glue 中，表可以具有分区和版本。表版本和分区在 AWS Glue 中不视为独立的资源。通过授予对表及表的原级资源的访问权限，授予对该表版本和分区的访问权限。

出于访问控制的目的，以下访问权限适用：
+ 控件适用于表级别。您只能限制对数据库和表的访问。例如，如果您允许访问某个分区表，此访问权限应用到该表的所有分区。您无法限制对表内各个分区的访问。
**重要**  
要在分区的 AWS Glue 上运行操作，需要目录、数据库和表级别的分区操作权限。仅仅访问表中的分区是不够的。例如，要在数据库 `myDB` 中的表 `myTable` 上运行 `GetPartitions`，必须授予 `glue:GetPartitions` 对目录、`myDB` 数据库和 `myTable` 资源的权限。
+ 访问控制不适用于表版本。对于分区，对表以前版本的访问权限通过在 AWS Glue 中，在表上对表版本 API 的访问权限以及表原级的访问权限来授予。

有关对 AWS Glue 操作的权限信息，请参阅《AWS Glue 开发人员指南**》中的 [AWS Glue API 权限：操作和资源参考](https://docs.aws.amazon.com/glue/latest/dg/api-permissions-reference.html)。

## 数据库和表级别权限示例
<a name="examples-fine-grained-table-database-policies"></a>

下表列出了 IAM 基于身份的策略的示例，这些策略允许访问 Athena 中的数据库和表。建议您从这些示例开始，根据您的需求，调整它们以允许或拒绝对特定数据库和表的特定操作。

这些示例包括访问数据库和目录，以便 Athena 和 AWS Glue 可以协同工作。对于多个 AWS 区域，请为每个数据库和目录包括类似策略，每个区域一行。

在示例中，将 `example_db` 数据库名称和 `test` 表名称替换为您的数据库名称和表名称。


| DDL 语句 | 授予对资源的访问权限的 IAM 访问策略的示例 | 
| --- | --- | 
| ALTER DATABASE | 允许修改 example\$1db 数据库的属性。<pre>{<br />   "Effect": "Allow",<br />   "Action": [<br />      "glue:GetDatabase", <br />      "glue:UpdateDatabase"<br />   ],<br />   "Resource": [<br />     "arn:aws:glue:us-east-1:123456789012:catalog",<br />     "arn:aws:glue:us-east-1:123456789012:database/example_db"<br />   ]<br />}</pre> | 
| CREATE DATABASE | 允许创建名为 example\$1db 的数据库。<pre>{<br />   "Effect": "Allow",<br />   "Action": [<br />      "glue:GetDatabase", <br />      "glue:CreateDatabase"<br />   ],<br />   "Resource": [<br />     "arn:aws:glue:us-east-1:123456789012:catalog",<br />     "arn:aws:glue:us-east-1:123456789012:database/example_db"<br />   ]<br />}<br /></pre> | 
| CREATE TABLE | 允许在 example\$1db 数据库中创建名为 test 的表。<pre>{<br />   "Sid": "DatabasePermissions",<br />   "Effect": "Allow",<br />   "Action": [<br />      "glue:GetDatabase", <br />      "glue:GetDatabases"<br />   ],<br />   "Resource": [<br />     "arn:aws:glue:us-east-1:123456789012:catalog",<br />     "arn:aws:glue:us-east-1:123456789012:database/example_db"<br />   ]<br />},<br />{<br />   "Sid": "TablePermissions",<br />   "Effect": "Allow",<br />   "Action": [<br />      "glue:GetTables",<br />      "glue:GetTable",<br />      "glue:GetPartitions",<br />      "glue:CreateTable"<br />   ],<br />   "Resource": [<br />     "arn:aws:glue:us-east-1:123456789012:catalog",<br />     "arn:aws:glue:us-east-1:123456789012:database/example_db",<br />     "arn:aws:glue:us-east-1:123456789012:table/example_db/test"<br />   ]<br />}</pre> | 
| DROP DATABASE | 允许删除 example\$1db 数据库（包括其中的所有表）。<pre>{<br />   "Effect": "Allow",<br />   "Action": [<br />      "glue:GetDatabase",<br />      "glue:DeleteDatabase",<br />      "glue:GetTables", <br />      "glue:GetTable", <br />      "glue:DeleteTable" <br />   ],<br />   "Resource": [<br />     "arn:aws:glue:us-east-1:123456789012:catalog",<br />     "arn:aws:glue:us-east-1:123456789012:database/example_db", <br />     "arn:aws:glue:us-east-1:123456789012:table/example_db/*", <br />     "arn:aws:glue:us-east-1:123456789012:userDefinedFunction/example_db/*"<br />   ]<br /> }</pre> | 
| DROP TABLE | 允许删除 example\$1db 数据库中名为 test 的分区表。如果您的表没有分区，请勿包含分区操作。<pre>{<br />   "Effect": "Allow",<br />   "Action": [<br />      "glue:GetDatabase",<br />      "glue:GetTable",<br />      "glue:DeleteTable", <br />      "glue:GetPartitions",<br />      "glue:GetPartition",<br />      "glue:DeletePartition" <br />   ],<br />   "Resource": [<br />     "arn:aws:glue:us-east-1:123456789012:catalog",<br />     "arn:aws:glue:us-east-1:123456789012:database/example_db", <br />     "arn:aws:glue:us-east-1:123456789012:table/example_db/test"<br />   ]<br /> }</pre> | 
| MSCK REPAIR TABLE | 将 Hive 兼容分区添加到名为 test 的表之后，允许更新目录元数据中的 example\$1db 数据库。<pre>{<br />    "Effect": "Allow",<br />    "Action": [<br />        "glue:GetDatabase",<br />        "glue:CreateDatabase",<br />        "glue:GetTable",<br />        "glue:GetPartitions",<br />        "glue:GetPartition",<br />        "glue:BatchCreatePartition"<br />    ],<br />    "Resource": [<br />      "arn:aws:glue:us-east-1:123456789012:catalog",<br />      "arn:aws:glue:us-east-1:123456789012:database/example_db", <br />      "arn:aws:glue:us-east-1:123456789012:table/example_db/test"<br />    ]<br />}</pre> | 
| SHOW DATABASES | 允许列出 AWS Glue Data Catalog 中的所有数据库。<pre>{<br />   "Effect": "Allow",<br />   "Action": [<br />      "glue:GetDatabase",<br />      "glue:GetDatabases" <br />   ],<br />   "Resource": [<br />     "arn:aws:glue:us-east-1:123456789012:catalog",<br />     "arn:aws:glue:us-east-1:123456789012:database/*"<br />   ]<br /> }</pre> | 
| SHOW TABLES | 允许列出 example\$1db 数据库中的所有表。<pre>{<br />   "Effect": "Allow",<br />   "Action": [<br />      "glue:GetDatabase",<br />      "glue:GetTables"    <br />   ],<br />   "Resource": [<br />     "arn:aws:glue:us-east-1:123456789012:catalog",<br />     "arn:aws:glue:us-east-1:123456789012:database/example_db",  <br />     "arn:aws:glue:us-east-1:123456789012:table/example_db/*"<br />   ]<br />}</pre> | 

# 配置 AWS Glue 数据目录的跨账户存取
<a name="security-iam-cross-account-glue-catalog-access"></a>

您可以使用 Athena 的跨账户 AWS Glue 目录功能来从您自己的账户以外的账户注册 AWS Glue 目录。为 AWS Glue 配置所需 IAM 权限并将目录注册为 Athena [DataCatalog](https://docs.aws.amazon.com/athena/latest/APIReference/API_DataCatalog.html) 资源后，您可以使用 Athena 运行跨账户查询。要了解如何使用 Athena 控制台注册来自其他账户的目录，请参阅 [从其他账户注册数据目录](data-sources-glue-cross-account.md)。

有关 AWS Glue 中跨账户访问的更多信息，请参阅《AWS Glue 开发人员指南**》中的[授予跨账户访问权限](https://docs.aws.amazon.com/glue/latest/dg/cross-account-access.html)。

## 开始之前
<a name="security-iam-cross-account-glue-catalog-access-before-you-start"></a>

因为此功能使用现有的 Athena `DataCatalog` 资源 API 和功能来启用跨账户访问，我们建议您先阅读以下资源：
+ [连接到数据来源](work-with-data-stores.md) - 包含有关将 Athena 与 AWS Glue、Hive 或 Lambda 数据目录源搭配使用的主题。
+ [数据目录示例策略](datacatalogs-example-policies.md) - 介绍如何编写控制对数据目录访问权限的策略。
+ [将 AWS CLI 与 Hive 元存储结合使用](datastores-hive-cli.md)：介绍如何使用带有 Hive 元存储仓的 AWS CLI，但包含适用于其他数据来源的使用案例。

## 注意事项和限制
<a name="security-iam-cross-account-glue-catalog-access-considerations-and-limitations"></a>

当前，Athena 跨账户 AWS Glue 目录访问具有以下限制：
+ 此功能仅在支持 Athena 引擎版本 2 或更高版本的 AWS 区域可用。有关 Athena 引擎版本的更多信息，请参阅 [Athena 引擎版本控制](engine-versions.md)。要升级工作组的引擎版本，请参阅 [更改 Athena 引擎版本](engine-versions-changing.md)。
+ 当您在账户中注册另一个账户的 AWS Glue Data Catalog 时，您可以创建一个区域 `DataCatalog` 资源，该资源将仅链接到该特定区域中的其他账户数据。
+ 当前，包含跨账户 AWS Glue 目录的 `CREATE VIEW` 语句不受支持。
+ 无法跨账户查询使用 AWS 托管密钥进行加密的目录。对于希望跨账户查询的目录，请改用客户托管密钥 (`KMS_CMK`)。有关客户托管密钥和 AWS 托管密钥之间差异的信息，请参阅《AWS Key Management Service Developer Guide》**中的 [Customer keys and AWS keys](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-mgmt                     )。

## 开始使用
<a name="security-iam-cross-account-glue-catalog-getting-started"></a>

在下列应用场景中，“借入者”账户（666666666666）想要运行 `SELECT` 查询，该查询引用的 AWS Glue 目录属于“拥有者”账户（999999999999），如下例所示：

```
SELECT * FROM ownerCatalog.tpch1000.customer
```

在以下过程中，步骤 1a 和 1b 显示了如何授予借入者账户对拥有者账户 AWS Glue 资源的访问权限，从借入者和拥有者这两个角度均进行了展示。该示例授予对数据库 `tpch1000` 和表 `customer` 的访问权限。更改这些示例名称以满足您的要求。

### 步骤 1a：创建借入者角色以及可访问拥有者 AWS Glue 资源的策略
<a name="security-iam-cross-account-glue-catalog-access-step-1a"></a>

要创建借入者账户角色以及可访问拥有者账户 AWS Glue 资源的策略，可以使用 AWS Identity and Access Management（IAM）控制台或 [IAM API](https://docs.aws.amazon.com/IAM/latest/APIReference/API_Operations.html)。以下过程使用了 IAM 控制台。

**创建借入者角色以及可访问拥有者账户 AWS Glue 资源的策略**

1. 通过借入者账户从 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 登录 IAM 控制台。

1. 在导航窗格中，展开**访问管理**，然后选择**策略**。

1. 选择**创建策略**。

1. 对于**策略编辑器**，选择 **JSON**。

1. 在策略编辑器中，输入以下策略，然后根据您的要求对其进行修改：

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": "glue:*",
               "Resource": [
                   "arn:aws:glue:us-east-1:999999999999:catalog",
                   "arn:aws:glue:us-east-1:999999999999:database/tpch1000",
                   "arn:aws:glue:us-east-1:999999999999:table/tpch1000/customer"
               ]
           }
       ]
   }
   ```

------

1. 选择**下一步**。

1. 在**查看并创建**页面上，输入策略的名称（例如 **CrossGluePolicyForBorrowerRole**）作为**策略名称**。

1. 选择**创建策略**。

1. 在导航窗格中，选择**角色**。

1. 选择**创建角色**。

1. 在**选择信任的实体**页面上，选择 **AWS 账户**，然后选择**下一步**。

1. 在**添加权限**页面上，在搜索框中输入所创建策略的名称（例如 **CrossGluePolicyForBorrowerRole**）。

1. 选择策略名称旁的复选框，然后选择**下一步**。

1. 在 **Name, review, and create**（命名、检查和创建）页面上，对于 **Role name**（角色名称），输入角色的名称（例如 **CrossGlueBorrowerRole**）。

1. 选择**创建角色**。

### 步骤 1b：创建要向借入者授予 AWS Glue 访问权限的拥有者策略
<a name="security-iam-cross-account-glue-catalog-access-step-1b"></a>

要从拥有者账户（999999999999）向借入者角色授予 AWS Glue 访问权限，可以使用 AWS Glue 控制台或 AWS Glue [PutResourcePolicy](https://docs.aws.amazon.com/glue/latest/webapi/API_PutResourcePolicy.html) API 操作。以下步骤使用了 AWS Glue 控制台。

**从拥有者账户向借入者账户授予 AWS Glue 访问权限**

1. 通过拥有者账户从 [https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/) 登录 AWS Glue 控制台。

1. 在导航窗格中，展开**数据目录**，然后选择**目录设置**。

1. 在 **Permissions**（权限）框中，输入类似如下的策略。对于 *rolename*，输入借入者在步骤 1a 中创建的角色（例如 **CrossGlueBorrowerRole**）。如果要增加权限范围，您可以将通配符 `*` 用于数据库和表资源类型。

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Principal": {
                   "AWS": [
                       "arn:aws:iam::666666666666:user/username",
                       "arn:aws:iam::666666666666:role/rolename"
                   ]
               },
               "Action": "glue:*",
               "Resource": [
                   "arn:aws:glue:us-east-1:999999999999:catalog",
                   "arn:aws:glue:us-east-1:999999999999:database/tpch1000",
                   "arn:aws:glue:us-east-1:999999999999:table/tpch1000/customer"
               ]
           }
       ]
   }
   ```

------

完成后，建议使用 [AWS Glue API](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api.html) 进行一些测试跨账户调用，确认权限是否按预期进行配置。

### 第 2 步：借入者注册属于拥有者账户的 AWS Glue Data Catalog
<a name="security-iam-cross-account-glue-catalog-access-step-2"></a>

以下过程说明了如何使用 Athena 控制台将拥有者的 Amazon Web Services 账户中的 AWS Glue Data Catalog 配置为数据来源。要了解如何使用 API 操作而不是通过控制台来注册目录，请参阅 [（可选）使用 API 注册属于拥有者账户的 Athena 数据目录](#security-iam-cross-account-glue-catalog-access-step-2-api)。

**注册属于其他账户的 AWS Glue Data Catalog**

1. 从 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 打开 Athena 控制台。

1. 如果控制台导航窗格不可见，请选择左侧的扩展菜单。  
![\[选择扩展菜单。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/nav-pane-expansion.png)

1. 展开**管理**，然后选择**数据来源**。

1. 选择右上角的 **Connect data source**（连接数据来源）。

1. 在**选择数据来源**页面上，对于**数据来源**，选择 **S3 - AWS Glue Data Catalog**，然后选择**下一步**。

1. 在**输入数据来源详细信息**页面的 **AWS Glue Data Catalog** 部分中，对于**选择 AWS Glue Data Catalog**，选择 **AWS Glue Data Catalog 中的其他账户**。

1. 对于**数据来源详细信息**，提供以下信息：
   + **数据来源名称**：输入要在 SQL 查询中使用的名称，以引用其他账户中的数据目录。
   + **Description**（描述）–（可选）输入其他账户中数据目录的描述。
   + **Catalog ID**（目录编号）– 输入数据目录所属账户的 12 位 Amazon Web Services 账户 ID。Amazon Web Services 账户 ID 即是目录 ID。

1. （可选）展开**标签**，输入要与数据来源关联的键-值对。有关标签的更多信息，请参阅[标记 Athena 资源](tags.md)。

1. 选择**下一步**。

1. 在 **Review and create**（审核和创建）页面中，检查数据来源的详细信息，然后选择 **Create data source**（创建数据来源）。**Data source details**（数据来源详细信息）页面列出了所注册数据目录的数据库和标签。

1. 选择**数据来源和目录**。您注册的数据目录在 **Data source name**（数据来源名称）列中列出。

1. 要查看或编辑有关数据目录的信息，请选择该目录，然后选择**Actions**（操作）、**Edit**（编辑）。

1. 要删除新数据目录，请选择该目录，然后选择 **Actions**（操作）、**Delete**（删除）。

### 步骤 3：借入者提交查询
<a name="security-iam-cross-account-glue-catalog-access-step-4"></a>

借入者提交一个查询，该查询使用 *catalog*.*database*.*table* 语法引用目录，如下例所示：

```
SELECT * FROM ownerCatalog.tpch1000.customer
```

借入者如不使用完全限定的语法，也可以通过 [QueryExecutionContext](https://docs.aws.amazon.com/athena/latest/APIReference/API_QueryExecutionContext.html) 传入目录，从而根据上下文指定目录。

## （可选）配置其他 Amazon S3 权限
<a name="security-iam-cross-account-glue-catalog-access-additional-s3-permissions"></a>
+ 如果借入者账户使用 Athena 查询将新数据写入拥有者账户中的表，即使该表存在于拥有者的账户中，拥有者也将无法自动获取对 Amazon S3 中此数据的访问权限。这是因为借入者就是 Amazon S3 中信息的对象拥有者，另有配置的情况除外。要授予拥有者对数据的访问权限，请作为附加步骤相应地设置对象的权限。
+ 某些跨账户 DDL 操作，如 [MSCK REPAIR TABLE](msck-repair-table.md) 需要 Amazon S3 权限。例如，如果借入者账户正在根据拥有者账户中的表（该表的数据位于拥有者账户 S3 存储桶中）执行跨账户 `MSCK REPAIR` 操作，则该存储桶必须向借入者所担任的角色授予权限才能成功查询。

有关授予存储桶权限的信息，请参阅《*Amazon Simple Storage Service 用户指南*》中的[如何设置 ACL 存储桶权限？](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/set-bucket-permissions.html)。

## （可选）动态使用目录
<a name="security-iam-cross-account-glue-catalog-access-dynamic-catalogs"></a>

在某些情况下，您可能需要快速对跨账户 AWS Glue 目录执行测试，而无需执行注册它的先决步骤。如果您已按照本文档前述说明正确配置了所需的 IAM 和 Amazon S3 权限，则您可以动态执行跨账户查询，而无需创建 `DataCatalog` 资源对象。

要在不注册的情况下显式引用目录，请使用以下示例中的语法：

```
SELECT * FROM "glue:arn:aws:glue:us-east-1:999999999999:catalog".tpch1000.customer
```

使用格式“`glue:<arn>`”，其中 `<arn>` 是您想要使用的 [AWS Glue Data Catalog ARN](https://docs.aws.amazon.com/glue/latest/dg/glue-specifying-resource-arns.html#data-catalog-resource-arns)。在该示例中，Athena 使用此语法动态指向账户 999999999999 的 AWS Glue 数据目录，如同您已为其单独创建了 `DataCatalog` 对象。

### 使用动态目录的注意事项
<a name="security-iam-cross-account-glue-catalog-access-notes-dynamic-catalogs"></a>

使用动态目录时，请记住以下几点。
+ 使用动态目录需要您通常用于 Athena Data Catalog API 操作的 IAM 权限。主要区别在于，Data Catalog 资源名称遵循 `glue:*` 命名约定。
+ 目录 ARN 必须属于正在运行查询的同一区域。
+ 在 DML 查询或视图中使用动态目录时，请使用转义双引号 (`\"`)。在 DDL 查询中使用动态目录时，请使用反引号字符 (```)。

## （可选）使用 API 注册属于拥有者账户的 Athena 数据目录
<a name="security-iam-cross-account-glue-catalog-access-step-2-api"></a>

您可以使用 API 操作来注册属于拥有者账户的数据目录，而不是如第 2 步中所述使用 Athena 控制台。

Athena [DataCatalog](https://docs.aws.amazon.com/athena/latest/APIReference/API_DataCatalog.html) 资源的创建者必须具有运行 Athena [CreateDataCatalog](https://docs.aws.amazon.com/athena/latest/APIReference/API_CreateDataCatalog.html) API 操作的必要权限。根据您的要求，可能需要访问其他 API 操作。有关更多信息，请参阅 [数据目录示例策略](datacatalogs-example-policies.md)。

以下 `CreateDataCatalog` 请求正文为跨账户访问注册了 AWS Glue 目录：

```
# Example CreateDataCatalog request to register a cross-account Glue catalog:
{
    "Description": "Cross-account Glue catalog",
    "Name": "ownerCatalog",
    "Parameters": {"catalog-id" : "999999999999"  # Owner's account ID
    },
    "Type": "GLUE"
}
```

以下示例代码使用 Java 客户端创建 `DataCatalog` 对象。

```
# Sample code to create the DataCatalog through Java client
CreateDataCatalogRequest request = new CreateDataCatalogRequest()
    .withName("ownerCatalog")
    .withType(DataCatalogType.GLUE)
    .withParameters(ImmutableMap.of("catalog-id", "999999999999"));

athenaClient.createDataCatalog(request);
```

完成这些步骤后，借入者应会在调用 [ListDataCatalogs](https://docs.aws.amazon.com/athena/latest/APIReference/API_ListDataCatalogs.html) API 操作时看到 `ownerCatalog`。

## 其他资源
<a name="security-iam-cross-account-glue-catalog-access-additional-resources"></a>
+ [从其他账户注册数据目录](data-sources-glue-cross-account.md)
+ *AWS 规范性指导模式*指南中的[使用 Amazon Athena 配置对共享 AWS Glue Data Catalog 的跨账户访问权限](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/configure-cross-account-access-to-a-shared-aws-glue-data-catalog-using-amazon-athena.html)。
+ *AWS 大数据博客*中的[使用 Amazon Athena 查询跨账户 AWS Glue Data Catalog](https://aws.amazon.com/blogs/big-data/query-cross-account-aws-glue-data-catalogs-using-amazon-athena/)
+ 在《*AWS Glue 开发人员指南*》中的[授予跨账户访问权限](https://docs.aws.amazon.com/glue/latest/dg/cross-account-access.html) 

# 从 Athena 配置对 AWS Glue Data Catalog 中加密元数据的访问
<a name="access-encrypted-data-glue-data-catalog"></a>

如果您将 AWS Glue Data Catalog 与 Amazon Athena 一起使用，您可以使用 AWS Glue 控制台或 API在 AWS Glue Data Catalog 中启用加密。想要了解有关信息，请参阅《AWS Glue 开发人员指南**》中的 [加密数据目录](https://docs.aws.amazon.com/glue/latest/dg/encrypt-glue-data-catalog.html)。

如果对 AWS Glue Data Catalog 加密，则必须将以下操作添加到用于访问 Athena 的所有策略：

每当您使用 IAM 策略时，请确保遵循 IAM 最佳实践。有关更多信息，请参阅《[IAM 用户指南](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)》中的 *IAM 安全最佳实践*。

# 配置对工作组和标签的访问
<a name="workgroups-access"></a>

工作组是由 Athena 管理的资源。因此，如果您的工作组策略使用获取 `workgroup` 作为输入的操作，您必须如下所示指定工作组的 ARN，其中 `workgroup-name` 是您的工作组的名称：

```
"Resource": [arn:aws:athena:region:AWSAcctID:workgroup/workgroup-name]
```

例如，对于 `us-west-2` 区域中用于 Amazon Web Services 账户 `123456789012` 的名为 `test_workgroup` 的工作组，请使用以下 ARN 指定工作组作为资源：

```
"Resource":["arn:aws:athena:us-east-2:123456789012:workgroup/test_workgroup"]
```

要访问启用了可信身份传播（TIP）的工作组，必须将 IAM Identity Center 用户分配给由 Athena [GetWorkGroup](https://docs.aws.amazon.com/athena/latest/APIReference/API_GetWorkGroup.html) API 操作的响应返回的 `IdentityCenterApplicationArn`。
+ 有关工作组策略的列表，请参阅[工作组策略示例](example-policies-workgroup.md)。
+ 有关工作组的基于标签的策略列表，请参阅[使用基于标签的 IAM 访问控制策略](tags-access-control.md)。
+ 有关为工作组创建 IAM 策略的更多信息，请参阅 [使用 IAM 策略控制工作组访问](workgroups-iam-policy.md)。
+ 有关 Amazon Athena 操作的完整列表，请参阅 [Amazon Athena API 参考](https://docs.aws.amazon.com/athena/latest/APIReference/)中的 API 操作名称。
+ 有关 IAM 策略的更多信息，请参阅《IAM 用户指南》**中的[使用可视化编辑器创建策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html#access_policies_create-visual-editor)。

每当您使用 IAM 策略时，请确保遵循 IAM 最佳实践。有关更多信息，请参阅《[IAM 用户指南](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)》中的 *IAM 安全最佳实践*。

# 使用 IAM 策略控制工作组访问
<a name="workgroups-iam-policy"></a>

要控制对工作组的访问，使用资源级 IAM 权限或基于身份的 IAM 策略。每当您使用 IAM 策略时，请确保遵循 IAM 最佳实践。有关更多信息，请参阅《[IAM 用户指南](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)》中的 *IAM 安全最佳实践*。

**注意**  
要访问启用了可信身份传播的工作组，必须将 IAM Identity Center 用户分配给由 Athena [GetWorkGroup](https://docs.aws.amazon.com/athena/latest/APIReference/API_GetWorkGroup.html) API 操作的响应返回的 `IdentityCenterApplicationArn`。

以下是 Athena 的特定过程。

有关 IAM 的特定信息，请参阅本节末尾列出的链接。有关示例 JSON 工作组策略的信息，请参阅[工作组策略示例](example-policies-workgroup.md)。

**要在 IAM 控制台中使用可视化编辑器创建工作组策略**

1. 登录 AWS 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在左侧的导航窗格中，选择 **Policies (策略)**，然后选择 **Create policy (创建策略)**。

1. 在**可视化编辑器**选项卡上，选择**选择服务**。然后，选择要添加到策略的 Athena。

1. 选择 **Select actions (选择操作)**，然后选择要添加到策略的操作。可视化编辑器会显示 Athena 中可用的操作。有关更多信息，请参阅《服务授权参考》**中的 [Amazon Athena 的操作、资源和条件键](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonathena.html)。

1. 选择 **add actions (添加操作)** 以键入特定操作，或使用通配符 (\$1) 指定多个操作。

   预设情况下，您创建的策略允许执行选择的操作。如果您在 Athena 中选择对 `workgroup` 资源执行一个或多个支持资源级权限的操作，则编辑器会列出 `workgroup` 资源。

1. 选择 **Resources (资源)**，为您的策略指定特定的工作组。有关示例 JSON 工作组策略，请参阅[工作组策略示例](example-policies-workgroup.md)。

1. 指定 `workgroup` 资源，如下所示：

   ```
   arn:aws:athena:<region>:<user-account>:workgroup/<workgroup-name>
   ```

1. 选择 **Review policy (查看策略)**，然后为您创建的策略键入 **Name (名称)** 和 **Description (描述)**（可选）。查看策略摘要以确保您已授予所需的权限。

1. 选择**创建策略**可保存您的新策略。

1. 将此基于身份的策略附加到用户、组或角色。

有关详细信息，请参阅*服务授权参考*和《*IAM 用户指南*》中的以下主题：
+  [Amazon Athena 的操作、资源和条件键](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonathena.html) 
+  [使用可视化编辑器创建策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html#access_policies_create-visual-editor) 
+  [添加和移除 IAM 策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html) 
+  [控制对资源的访问](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_controlling.html#access_controlling-resources) 

有关示例 JSON 工作组策略，请参阅[工作组策略示例](example-policies-workgroup.md)。

有关 Amazon Athena 操作的完整列表，请参阅 [Amazon Athena API 参考](https://docs.aws.amazon.com/athena/latest/APIReference/)中的 API 操作名称。

# 工作组策略示例
<a name="example-policies-workgroup"></a>

本节包含您可以用于启用对工作组执行各种操作的策略示例。每当您使用 IAM 策略时，请确保遵循 IAM 最佳实践。有关更多信息，请参阅《*IAM 用户指南*》中的 [IAM 安全最佳实践](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)。

工作组是由 Athena 管理的 IAM 资源。因此，如果您的工作组策略使用获取 `workgroup` 作为输入的操作，您必须如下所示指定工作组的 ARN：

```
"Resource": [arn:aws:athena:<region>:<user-account>:workgroup/<workgroup-name>]
```

其中，`<workgroup-name>` 是工作组的名称。例如，对于名为 `test_workgroup` 的工作组，指定它作为资源，如下所示：

```
"Resource": ["arn:aws:athena:us-east-1:123456789012:workgroup/test_workgroup"]
```

有关 Amazon Athena 操作的完整列表，请参阅 [Amazon Athena API 参考](https://docs.aws.amazon.com/athena/latest/APIReference/)中的 API 操作名称。有关 IAM policy 的更多信息，请参阅《IAM 用户指南》中的 [使用可视化编辑器创建策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html#access_policies_create-visual-editor)。有关为工作组创建 IAM 策略的更多信息，请参阅 [使用 IAM 策略控制工作组访问](workgroups-iam-policy.md)。
+  [Example policy for full access to all workgroups](#example1-full-access-all-wkgs) 
+  [Example policy for full access to a specified workgroup](#example2-full-access-this-wkg) 
+  [Example policy for running queries in a specified workgroup](#example3-user-access) 
+  [Example policy for running queries in the primary workgroup](#example4-run-in-primary-access) 
+  [Example policy for management operations on a specified workgroup](#example5-manage-wkgs-access) 
+  [Example policy for listing workgroups](#example6-list-all-wkgs-access) 
+  [Example policy for running and stopping queries in a specific workgroup](#example7-run-queries-access) 
+  [Example policy for working with named queries in a specific workgroup](#example8-named-queries-access) 
+  [Example policy for working with Spark notebooks](#example9-spark-workgroup) 

**Example 对所有工作组具有完全访问权限的策略示例**  
以下策略可实现对账户中可能存在的所有工作组资源具有完全访问权限。对于必须为其他所有用户监督和管理工作组的那些用户，我们建议您使用此策略。    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "athena:*"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
```

**Example 对指定工作组具有完全访问权限的策略示例**  
以下策略可实现对单个名为 `workgroupA` 的特定工作组资源具有完全访问权限。对于对特定工作组具有完全控制权限的用户，您可以使用此策略。    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "athena:ListEngineVersions",
                "athena:ListWorkGroups",
                "athena:ListDataCatalogs",
                "athena:ListDatabases",
                "athena:GetDatabase",
                "athena:ListTableMetadata",
                "athena:GetTableMetadata"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "athena:BatchGetQueryExecution",
                "athena:GetQueryExecution",
                "athena:ListQueryExecutions",
                "athena:StartQueryExecution",
                "athena:StopQueryExecution",
                "athena:GetQueryResults",
                "athena:GetQueryResultsStream",
                "athena:CreateNamedQuery",
                "athena:GetNamedQuery",
                "athena:BatchGetNamedQuery",
                "athena:ListNamedQueries",
                "athena:DeleteNamedQuery",
                "athena:CreatePreparedStatement",
                "athena:GetPreparedStatement",
                "athena:ListPreparedStatements",
                "athena:UpdatePreparedStatement",
                "athena:DeletePreparedStatement"
            ],
            "Resource": [
                "arn:aws:athena:us-east-1:123456789012:workgroup/workgroupA"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "athena:DeleteWorkGroup",
                "athena:UpdateWorkGroup",
                "athena:GetWorkGroup",
                "athena:CreateWorkGroup"
            ],
            "Resource": [
                "arn:aws:athena:us-east-1:123456789012:workgroup/workgroupA"
            ]
        }
    ]
}
```

**Example 运行指定工作组中查询的策略示例**  
在以下策略中，允许用户运行指定 `workgroupA` 中的查询并查看它们。不允许用户对工作组本身执行管理任务，例如，更新或删除它。请注意，示例策略不会将用户仅限于此工作组或拒绝访问其他工作组。    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
       {
            "Effect": "Allow",
            "Action": [
                "athena:ListEngineVersions",
                "athena:ListWorkGroups",
                "athena:ListDataCatalogs",
                "athena:ListDatabases",
                "athena:GetDatabase",
                "athena:ListTableMetadata",
                "athena:GetTableMetadata"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "athena:GetWorkGroup", 
                "athena:BatchGetQueryExecution",
                "athena:GetQueryExecution",
                "athena:ListQueryExecutions",
                "athena:StartQueryExecution",
                "athena:StopQueryExecution",
                "athena:GetQueryResults",
                "athena:GetQueryResultsStream",
                "athena:CreateNamedQuery",
                "athena:GetNamedQuery",
                "athena:BatchGetNamedQuery",
                "athena:ListNamedQueries",
                "athena:DeleteNamedQuery",
                "athena:CreatePreparedStatement",
                "athena:GetPreparedStatement",
                "athena:ListPreparedStatements",
                "athena:UpdatePreparedStatement",
                "athena:DeletePreparedStatement"
            ],
            "Resource": [
                "arn:aws:athena:us-east-1:123456789012:workgroup/workgroupA"
            ]
        }
    ]
}
```

**Example 运行主工作组中查询的策略示例**  
您可以修改上述示例以允许特定用户在主工作组中运行查询。  
对于另行配置为运行指定工作组中查询的所有用户，我们建议您为其添加主工作组资源。在用户的指定工作组已被删除或禁用的情况下，在工作组用户策略中添加此策略资源有用。在这种情况下，他们可以继续运行主工作组中的查询。
要允许您账户中的用户运行主工作组中的查询，请将包含朱总做足 ARN 的行添加到 [Example policy for running queries in a specified workgroup](#example3-user-access) 的资源部分，如下例所示。  

```
arn:aws:athena:us-east-1:123456789012:workgroup/primary"
```

**Example 管理指定工作组操作的策略示例**  
在以下策略中，允许用户创建、删除、获取详细信息并更新工作组的 `test_workgroup`。    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "athena:ListEngineVersions"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "athena:CreateWorkGroup",
                "athena:GetWorkGroup",
                "athena:DeleteWorkGroup",
                "athena:UpdateWorkGroup"
            ],
            "Resource": [
                "arn:aws:athena:us-east-1:123456789012:workgroup/test_workgroup"
            ]
        }
    ]
}
```

**Example 列出工作组的策略示例**  
以下策略允许所有用户列出所有工作组：    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "athena:ListWorkGroups"
            ],
            "Resource": "*"
        }
    ]
}
```

**Example 运行和停止特定工作组中查询的策略示例**  
在此策略中，允许用户运行工作组中的查询：    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "athena:StartQueryExecution",
                "athena:StopQueryExecution"
            ],
            "Resource": [
                "arn:aws:athena:us-east-1:123456789012:workgroup/test_workgroup"
            ]
        }
    ]
}
```

**Example 使用特定工作组中的命名查询的策略示例**  
在以下策略中，用户具有在指定工作组中创建和删除命名查询以及获取其相关信息的权限：    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "athena:CreateNamedQuery",
                "athena:GetNamedQuery",
                "athena:DeleteNamedQuery"
            ],
            "Resource": [
                "arn:aws:athena:us-east-1:123456789012:workgroup/test_workgroup"            ]
        }
    ]
}
```

**Example 在 Athena 中使用 Spark 笔记本的示例策略**  
使用以下策略在 Athena 中使用 Spark 笔记本。    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowCreatingWorkGroupWithDefaults",
            "Action": [
                "athena:CreateWorkGroup",
                "s3:CreateBucket",
                "iam:CreateRole",
                "iam:CreatePolicy",
                "iam:AttachRolePolicy",
                "s3:GetBucketLocation",
                "athena:ImportNotebook"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:athena:us-east-1:123456789012:workgroup/Demo*",
                "arn:aws:s3:::123456789012-us-east-1-athena-results-bucket-*",
                "arn:aws:iam::123456789012:role/service-role/AWSAthenaSparkExecutionRole-*",
                "arn:aws:iam::123456789012:policy/service-role/AWSAthenaSparkRolePolicy-*"
            ]
        },
        {
            "Sid": "AllowRunningCalculations",
            "Action": [
                "athena:ListWorkGroups",
                "athena:GetWorkGroup",
                "athena:StartSession",
                "athena:CreateNotebook",
                "athena:ListNotebookMetadata",
                "athena:ListNotebookSessions",
                "athena:GetSessionStatus",
                "athena:GetSession",
                "athena:GetNotebookMetadata",
                "athena:CreatePresignedNotebookUrl"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:athena:us-east-1:123456789012:workgroup/Demo*"
        },
        {
            "Sid": "AllowListWorkGroupAndEngineVersions",
            "Action": [
                "athena:ListWorkGroups",
                "athena:ListEngineVersions"
            ],
            "Effect": "Allow",
            "Resource": "*"
        }
    ]
}
```

# 使用已启用 IAM Identity Center 的 Athena 工作组
<a name="workgroups-identity-center"></a>

[Trusted identity propagation](https://docs.aws.amazon.com//singlesignon/latest/userguide/trustedidentitypropagation-overview.html) 是一项 AWS IAM Identity Center 功能，已连接的 AWS 服务的管理员可以使用它来授予和审计对服务数据的访问权限。对这些数据的访问权限基于用户属性，例如组关联。设置可信身份传播要求已连接的 AWS 服务的管理员和 IAM Identity Center 管理员之间进行协作。有关更多信息，请参阅 [Prerequisites and considerations](https://docs.aws.amazon.com//singlesignon/latest/userguide/trustedidentitypropagation-overall-prerequisites.html)。

借助 [IAM Identity Center](https://docs.aws.amazon.com/singlesignon/latest/userguide/what-is.html)，您可以管理员工身份（也称为员工用户）的登录安全性。您可以在 IAM Identity Center 中创建或连接员工用户，并集中管理他们对所有 AWS 账户和应用程序的访问权限。您可以使用多账户权限为这些用户分配 AWS 账户 的访问权限。您可以使用应用程序分配为用户分配对启用了 IAM Identity Center 的应用程序、云应用程序和客户安全断言标记语言（SAML 2.0）应用程序的访问权限。有关更多信息，请参阅*《AWS IAM Identity Center 用户指南》*中的 [Trusted identity propagation across applications](https://docs.aws.amazon.com/singlesignon/latest/userguide/trustedidentitypropagation.html)。

EMR Studio 和 SageMaker Unified Studio 均支持可信身份传播的 Athena SQL。每个平台都提供了与 Athena 一起使用 TIP 的特定接口。

在 EMR Studio 中使用 Athena SQL 和 IAM Identity Center 身份时，您有两个工作组选项：
+ **常规工作组** - 无需分配用户/组。
+ **支持 IAM Identity Center 的工作组** - 需要通过 IAM Identity Center 控制台或 API 分配用户/组。

对于这两个选项，您都可以在启用 IAM Identity Center 的情况下使用 EMR Studio 中的 Athena SQL 接口运行查询。

## 注意事项和限制
<a name="workgroups-identity-center-considerations-and-limitations"></a>

在 Amazon Athena 中使用可信身份传播时，请注意以下几点：
+ 创建工作组后，您无法更改工作组的身份验证方法。
  + 无法修改现有的 Athena SQL 工作组来支持启用 IAM Identity Center 的工作组。现有的 Athena SQL 工作组可以将身份传播到下游服务。
  + 无法将启用 IAM Identity Center 的工作组修改为支持资源级 IAM 权限或基于身份的 IAM 策略。
+ 要访问启用了可信身份传播的工作组，必须将 IAM Identity Center 用户分配给由 Athena [GetWorkGroup](https://docs.aws.amazon.com/athena/latest/APIReference/API_GetWorkGroup.html) API 操作的响应返回的 `IdentityCenterApplicationArn`。
+ 必须将 Amazon S3 访问权限管控配置为使用可信身份传播身份。有关更多信息，请参阅《Amazon S3 用户指南》**中的 [S3 访问权限管控和公司目录身份](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-grants-directory-ids.html)。
+ 启用 IAM Identity Center 的 Athena 工作组需要将 Lake Formation 配置为使用 IAM Identity Center 身份。有关配置信息，请参阅《AWS Lake Formation 开发人员指南》**中的[集成 IAM Identity Center](https://docs.aws.amazon.com/lake-formation/latest/dg/identity-center-integration.html)。
+ 默认情况下，在启用了 IAM Identity Center 的工作组中，查询会在 30 分钟后超时。您可以请求延长查询超时时间，不过在可信身份传播工作组中可以运行的最长查询时间为一个小时。
+ 可信身份传播工作组中的用户或组权限更改可能需要长达一个小时才能生效。
+ 使用可信身份传播的 Athena 工作组中的查询不能直接从 Athena 控制台运行。它们必须通过已启用 IAM Identity Center 的 EMR Studio 中的 Athena 接口运行。有关在 EMR Studio 中使用 Athena 的更多信息，请参阅*《Amazon EMR 管理指南》*中的 [Use the Amazon Athena SQL editor in EMR Studio](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-studio-athena.html)。
+ 可信身份传播与以下 Athena 功能不兼容。
  + 已启用 IAM Identy Center 的工作组的 `aws:CalledVia` 上下文键
  + Athena for Spark 工作组。
  + 对 Athena API 的联合访问
  + 使用 Lake Formation 以及 Athena JDBC 和 ODBC 驱动程序对 Athena 进行联合访问。
+ 您只能在以下 AWS 区域中将可信身份传播与 Athena 结合使用：
  + `us-east-2` – 美国东部（俄亥俄州）
  + `us-east-1` – 美国东部（弗吉尼亚州北部）
  + `us-west-1` – 美国西部（北加利福尼亚）
  + `us-west-2` – 美国西部（俄勒冈州）
  + `af-south-1` – 非洲（开普敦）
  + `ap-east-1` – 亚太地区（香港）
  + `ap-southeast-3` – 亚太地区（雅加达）
  + `ap-south-1` – 亚太地区（孟买）
  + `ap-northeast-3` – 亚太地区（大阪）
  + `ap-northeast-2` – 亚太地区（首尔）
  + `ap-southeast-1` – 亚太地区（新加坡）
  + `ap-southeast-2` – 亚太地区（悉尼）
  + `ap-northeast-1` – 亚太地区（东京）
  + `ca-central-1` – 加拿大（中部）
  + `eu-central-1`：欧洲地区（法兰克福）
  + `eu-central-2`：欧洲（苏黎世）
  + `eu-west-1`：欧洲地区（爱尔兰）
  + `eu-west-2` – 欧洲地区（伦敦）
  + `eu-south-1` – 欧洲地区（米兰）
  + `eu-west-3` – 欧洲地区（巴黎）
  + `eu-north-1` – 欧洲地区（斯德哥尔摩）
  + `me-south-1` – 中东（巴林）
  + `sa-east-1` – 南美洲（圣保罗）

## 所需的权限
<a name="workgroups-identity-center-required-permissions"></a>

在 Athena 控制台中创建启用 IAM Identity Center 的工作组的管理员 IAM 用户必须附加以下策略。
+ `AmazonAthenaFullAccess` 托管策略。有关更多信息，请参阅 [AWS 托管策略：AmazonAthenaFullAccess](security-iam-awsmanpol.md#amazonathenafullaccess-managed-policy)。
+ 以下支持 IAM 和 AM Identity Center 操作的内联策略：

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

****  

  ```
  { "Version":"2012-10-17",		 	 	  "Statement": [ { "Action": [ "iam:createRole",
      "iam:CreatePolicy", "iam:AttachRolePolicy", "iam:ListRoles", "identitystore:ListUsers",
      "identitystore:ListGroups", "identitystore:CreateUser", "identitystore:CreateGroup",
      "sso:ListInstances", "sso:CreateInstance", "sso:DeleteInstance", "sso:ListTrustedTokenIssuers",
      "sso:DescribeTrustedTokenIssuer", "sso:ListApplicationAssignments",
      "sso:DescribeRegisteredRegions", "sso:GetManagedApplicationInstance",
      "sso:GetSharedSsoConfiguration", "sso:PutApplicationAssignmentConfiguration",
      "sso:CreateApplication", "sso:DeleteApplication", "sso:PutApplicationGrant",
      "sso:PutApplicationAuthenticationMethod", "sso:PutApplicationAccessScope",
      "sso:ListDirectoryAssociations", "sso:CreateApplicationAssignment",
      "sso:DeleteApplicationAssignment", "organizations:ListDelegatedAdministrators",
      "organizations:DescribeAccount", "organizations:DescribeOrganization",
      "organizations:CreateOrganization", "sso-directory:SearchUsers", "sso-directory:SearchGroups",
      "sso-directory:CreateUser" ], "Effect": "Allow", "Resource": [ "*" ] }, { "Action": [
      "iam:PassRole" ], "Effect": "Allow", "Resource": [
          "arn:aws:iam::111122223333:role/service-role/AWSAthenaSQLRole-*"
      ] } ] }
  ```

------

## 创建启用 IAM Identity Center 的 Athena 工作组
<a name="workgroups-identity-center-creating-an-identity-center-enabled-athena-workgroup"></a>

以下过程介绍了创建启用 IAM Identity Center 的 Athena 工作组的相关步骤和选项。有关可用于 Athena 工作组的其他配置选项的说明，请参阅 [创建工作组](creating-workgroups.md)。

**在 Athena 控制台中创建启用 SSO 的工作组**

1. 从 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 打开 Athena 控制台。

1. 在 Athena 控制台导航窗格中，选择 **Workgroups**（工作组）。

1. 在 **Workgroups**（工作组）页面中，选择 **Create workgroup**（创建工作组）。

1. 在**创建工作组**页面上，在**工作组名称**中输入一个工作组的名称。

1. 对于**分析引擎**，请使用 **Athena SQL** 默认项。

1. 对于**身份验证**，请选择 **IAM Identity Center**。

1. 在 **IAM Identity Center 访问权限的服务角色**中，选择一个现有服务角色或创建一个新的服务角色。

   Athena 需要相应权限才能访问 IAM Identity Center。Athena 需要服务角色才能执行此操作。服务角色是一个由您管理的 IAM 角色，它授权 AWS 服务代表您访问其他 AWS 服务。要查询联合目录或运行 UDF，请使用相应的 Lambda 权限更新服务角色。有关更多信息，请参阅 *IAM 用户指南*中的[创建向 AWS 服务委派权限的角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html)。

1. 展开**查询结果配置**，然后在**查询结果的位置**中输入或选择一个 Amazon S3 路径。

1. （可选）选择**加密查询结果**。默认情况下，支持使用 SSE-S3。要将 SSE-KMS 和 CSE-KMS 与查询结果位置结合使用，请从 Amazon S3 访问权限管控中向 **IAM Identity Center 的服务角色**授予权限。有关更多信息，请参阅[示例角色策略](#workgroups-identity-center-access-grant-location-sample-role-policy)。

1. （可选）选择**创建基于用户身份的 S3 前缀**。

   创建启用 IAM Identity Center 的工作组时，默认选中**启用 S3 访问权限管控**选项。您可以使用 Amazon S3 访问权限管控来控制对 Amazon S3 中 Athena 查询结果位置（前缀）的访问权限。有关 Amazon S3 访问权限管控的更多信息，请参阅 [Managing access with Amazon S3 Access Grants](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-grants.html)。

   在使用 IAM Identity Center 身份验证的 Athena 工作组中，您可以创建基于身份的查询结果位置，这些位置由 Amazon S3 访问权限管控管理。这些基于用户身份的 Amazon S3 前缀可让 Athena 工作组中的用户将其查询结果与同一工作组中的其他用户隔离开来。

   启用用户前缀选项后，Athena 会将用户 ID 作为 Amazon S3 路径前缀附加到工作组的查询结果输出位置（例如 `s3://amzn-s3-demo-bucket/${user_id}`）。要使用此功能，您必须对访问权限管控进行配置，仅允许用户访问带有 `user_id` 前缀的位置。有关限制对 Athena 查询结果访问权限的 Amazon S3 访问权限管控位置策略示例，请参阅 [示例角色策略](#workgroups-identity-center-access-grant-location-sample-role-policy)。
**注意**  
选择用户身份 S3 前缀选项会自动启用工作组的“覆盖客户端侧设置”选项，如下一步所述。“覆盖客户端侧设置”选项是用户身份前缀功能的一个必要条件。

1. 展开**设置**，然后确认已选中**覆盖客户端侧设置**。

   如果已选中**覆盖客户端侧设置**，则会在工作组级别对工作组中的所有客户端强制实施工作组设置。有关更多信息，请参阅 [Override client-side settings (覆盖客户端设置)](workgroups-settings-override.md)。

1. （可选）按照 [创建工作组](creating-workgroups.md) 中所述对所需的任何其他配置进行设置。

1. 选择 **Create workgroup (创建工作组)**。

1. 参照 Athena 控制台的**工作组**部分，将 IAM Identity Center 目录中的用户或群组分配给已启用 IAM Identity Center 的 Athena 工作组。

## 示例角色策略
<a name="workgroups-identity-center-access-grant-location-sample-role-policy"></a>

以下示例显示了将角色附加到 Amazon S3 Access Grant 位置的策略，该位置限制了对 Athena 查询结果的访问。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Action": [
                "s3:*"
            ],
            "Condition": {
                "ArnNotEquals": {
                    "s3:AccessGrantsInstanceArn": "arn:aws:s3:us-east-1:111122223333:access-grants/default"
                },
                "StringNotEquals": {
                    "aws:ResourceAccount": "111122223333"
                }
            },
            "Effect": "Deny",
            "Resource": "*",
            "Sid": "ExplicitDenyS3"
        },
        {
            "Action": [
                "kms:*"
            ],
            "Effect": "Deny",
            "NotResource": "arn:aws:kms:us-east-1:111122223333:key/${keyid}",
            "Sid": "ExplictDenyKMS"
        },
        {
            "Action": [
                "s3:ListMultipartUploadParts",
                "s3:GetObject"
            ],
            "Condition": {
                "ArnEquals": {
                    "s3:AccessGrantsInstanceArn": "arn:aws:s3:us-east-1:111122223333:access-grants/default"
                },
                "StringEquals": {
                    "aws:ResourceAccount": "111122223333"
                }
            },
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::ATHENA-QUERY-RESULT-LOCATION/${identitystore:UserId}/*",
            "Sid": "ObjectLevelReadPermissions"
        },
        {
            "Action": [
                "s3:PutObject",
                "s3:AbortMultipartUpload"
            ],
            "Condition": {
                "ArnEquals": {
                    "s3:AccessGrantsInstanceArn": "arn:aws:s3:us-east-1:111122223333:access-grants/default"
                },
                "StringEquals": {
                "aws:ResourceAccount": "111122223333"
                }
            },
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::ATHENA-QUERY-RESULT-LOCATION/${identitystore:UserId}/*",
            "Sid": "ObjectLevelWritePermissions"
        },
        {
            "Action": "s3:ListBucket",
            "Condition": {
                "ArnEquals": {
                    "s3:AccessGrantsInstanceArn": "arn:aws:s3:us-east-1:111122223333:access-grants/default"
                },
                "StringEquals": {
                    "aws:ResourceAccount": "111122223333"
                },
                "StringLikeIfExists": {
                    "s3:prefix": [
                        "${identitystore:UserId}",
                        "${identitystore:UserId}/*"
                    ]
                }
            },
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::ATHENA-QUERY-RESULT-LOCATION",
            "Sid": "BucketLevelReadPermissions"
        },
        {
            "Action": [
                "kms:GenerateDataKey",
                "kms:Decrypt"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:kms:us-east-1:111122223333:key/${keyid}",
            "Sid": "KMSPermissions"
        }
    ]
}
```

------

# 为工作组配置最低加密
<a name="workgroups-minimum-encryption"></a>

作为 Athena SQL 工作组的管理员，您可以在 Amazon S3 中对该工作组的所有查询结果强制执行最低级别的加密。您可以使用此功能确保查询结果永远不会以未加密状态存储在 Amazon S3 存储桶中。

当启用最低加密功能的工作组中的用户提交查询时，他们只能将加密设置为您配置的最低级别，或者如果有更高的加密级别，则只能设置为更高的级别。Athena 在用户运行查询时指定的级别或工作组中设置的级别对查询结果进行加密。

可用级别如下：
+ **基础**：使用 Amazon S3 托管式密钥（**SSE\$1S3**）的 Amazon S3 服务器端加密。
+ **中级** – 使用 KMS 托管式密钥（**SSE\$1KMS**）的服务器端加密。
+ **高级** - 使用 KMS 托管式密钥（**CSE\$1KMS**）的客户端加密。

## 注意事项和限制
<a name="workgroups-minimum-encryption-considerations-and-limitations"></a>
+ 最低加密功能不适用于启用 Apache Spark 的工作组。
+ 只有当工作组未启用**[覆盖客户端设置](https://docs.aws.amazon.com/athena/latest/ug/workgroups-settings-override.html)**选项时，最低加密功能才起作用。
+ 如果工作组启用了**覆盖客户端设置**选项，则以工作组加密设置为准，最低加密设置无效。
+ 启用此功能不收取任何费用。

## 为工作组启用最低加密
<a name="workgroups-minimum-encryption-enabling"></a>

在创建或更新工作组时，您可以为 Athena SQL 工作组的查询结果启用最低加密级别。为此，您可以使用 Athena 控制台、Athena API 或 AWS CLI。

### 使用 Athena 控制台启用最低加密
<a name="workgroups-minimum-encryption-enabling-using-the-athena-console"></a>

要开始使用 Athena 控制台创建或编辑工作组，请参阅[创建工作组](https://docs.aws.amazon.com/athena/latest/ug/workgroups-create-update-delete.html#creating-workgroups)或[编辑工作组](https://docs.aws.amazon.com/athena/latest/ug/workgroups-create-update-delete.html#editing-workgroups)。配置工作组时，请使用以下步骤启用最低加密。

**为工作组查询结果配置最低加密级别**

1. 清除**覆盖客户端设置**选项，或者确认该选项未被选中。

1. 选择**加密查询结果**选项。

1. 对于**加密类型**，选择您希望 Athena 用于工作组查询结果的加密方法（**SSE\$1S3**、**SSE\$1KMS** 或 **CSE\$1KMS**）。这些加密类型对应于基础、中级和高级安全级别。

1. 要对所有用户强制使用您选择的最低加密级别的加密方法，请选择**将 *encryption\$1method* 设置为最低加密**。

   当您选择此选项时，系统将显示一个表格，显示在您选择的加密类型变为最低加密类型时允许用户使用的加密层次结构和加密级别。

1. 创建工作组或更新工作组配置后，选择**创建工作组**或**保存更改**。

### 使用 Athena API 或 AWS CLI 启用最低加密
<a name="workgroups-minimum-encryption-enabling-using-the-athena-api-or-cli"></a>

当您使用 [CreateWorkGroup](https://docs.aws.amazon.com/athena/latest/APIReference/API_CreateWorkGroup.html) 或 [UpdateWorkGroup](https://docs.aws.amazon.com/athena/latest/APIReference/API_UpdateWorkGroup.html) API 创建或更新 Athena SQL 工作组时，请将 [EnforceWorkGroupConfiguration](https://docs.aws.amazon.com/athena/latest/APIReference/API_WorkGroupConfiguration.html#athena-Type-WorkGroupConfiguration-EnforceWorkGroupConfiguration) 设置为 `false`，将 [EnableMinimumEncryptionConfiguration](https://docs.aws.amazon.com/athena/latest/APIReference/API_WorkGroupConfiguration.html#athena-Type-WorkGroupConfiguration-EnableMinimumEncryptionConfiguration) 设置为 `true`，并使用 [EncryptionOption](https://docs.aws.amazon.com/athena/latest/APIReference/API_EncryptionConfiguration.html#athena-Type-EncryptionConfiguration-EncryptionOption) 指定加密类型。

在 AWS CLI 中，使用带有 `--configuration` 或 `--configuration-updates` 参数的 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/athena/create-work-group.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/athena/create-work-group.html) 或 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/athena/update-work-group.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/athena/update-work-group.html) 命令，并指定与 API 对应的选项。

# 配置对于预编译语句的访问
<a name="security-iam-athena-prepared-statements"></a>

本主题介绍了 Amazon Athena 中可用于预编译语句的 IAM 权限。每当您使用 IAM 策略时，请确保遵循 IAM 最佳实践。有关更多信息，请参阅 [IAM 用户指南](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)中的 *IAM 安全最佳实践*。

有关预编译语句的更多信息，请参阅 [使用参数化查询](querying-with-prepared-statements.md)。

创建、管理和执行预编译语句需要以下 IAM 权限。

```
athena:CreatePreparedStatement
athena:UpdatePreparedStatement
athena:GetPreparedStatement
athena:ListPreparedStatements
athena:DeletePreparedStatement
```

如下表所示，使用这些权限。


****  

| 要执行的操作 | 使用这些权限 | 
| --- | --- | 
| 运行 PREPARE 查询 | athena:StartQueryExecution athena:CreatePreparedStatement | 
| 重新运行 PREPARE 查询以更新现有预编译语句 | athena:StartQueryExecution athena:UpdatePreparedStatement | 
| 运行 EXECUTE 查询 | athena:StartQueryExecution athena:GetPreparedStatement | 
| 运行 DEALLOCATE PREPARE 查询 | athena:StartQueryExecution athena:DeletePreparedStatement | 

## 示例
<a name="security-iam-athena-prepared-statements-example"></a>

在以下示例中，IAM 策略授予对指定账户 ID 和工作组管理和运行预编译语句的权限。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "athena:StartQueryExecution",
                "athena:CreatePreparedStatement",
                "athena:UpdatePreparedStatement",
                "athena:GetPreparedStatement",
                "athena:DeletePreparedStatement",
                "athena:ListPreparedStatements"
            ],
            "Resource": [
                "arn:aws:athena:*:111122223333:workgroup/<workgroup-name>"
            ]
        }
    ]
}
```

------

# 使用适用于 Athena 的 CalledVia 上下文密钥
<a name="security-iam-athena-calledvia"></a>

[主体](https://docs.aws.amazon.com/IAM/latest/UserGuide/intro-structure.html#intro-structure-principal) 向 AWS 提交[请求](https://docs.aws.amazon.com/IAM/latest/UserGuide/intro-structure.html#intro-structure-request)时，AWS 会将请求信息收集到*请求上下文*，以评估并授权该请求。您可以使用 JSON 策略的 `Condition` 元素将请求上下文中的键与您在策略中指定的键值进行比较。*全局条件上下文键*是带 `aws:` 前缀的条件键。

## 关于 aws:CalledVia 上下文密钥
<a name="security-iam-athena-calledvia-the-awscalledvia-context-key"></a>

您可以使用 [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) 全局条件上下文键将策略中的服务与代表 IAM 主体（用户或角色）发出请求的服务进行比较。主体向 AWS 服务 发出请求时，该服务可能会使用主体的凭证向其他服务发出后续请求。`aws:CalledVia` 键包含链中代表主体发出请求的每个服务的有序列表。

通过指定 `aws:CalledVia` 上下文键的服务主体名称，您可以将上下文键设置为特定于 AWS 服务。例如，您可以使用 `aws:CalledVia` 条件键将请求限制为仅从 Athena 发出的请求。要借助 Athena 在策略中使用 `aws:CalledVia` 条件键，您可以指定 Athena 服务主体名称 `athena.amazonaws.com`，如以下示例所示。

```
 ...
    "Condition": {
        "ForAnyValue:StringEquals": { 
            "aws:CalledVia": "athena.amazonaws.com"
        }
    }
...
```

您可以使用 `aws:CalledVia` 上下文键来确保调用者只有在从 Athena 调用资源时才能访问资源（如 Lambda 函数）。

**注意**  
`aws:CalledVia` 上下文键与可信身份传播功能不兼容。

## 添加可选的 CalledVia 上下文密钥，用于访问 Lambda 函数
<a name="security-iam-athena-calledvia-example-policy-to-add-an-optional-calledvia-context-key-for-fine-grained-access-to-a-lambda-function"></a>

Athena 要求调用者有 `lambda:InvokeFunction` 权限，以便调用与查询关联的 Lambda 函数。以下语句指定用户只能通过 Athena 调用 Lambda 函数。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "VisualEditor3",
            "Effect": "Allow",
            "Action": "lambda:InvokeFunction",
            "Resource": "arn:aws:lambda:us-east-1:111122223333:function:OneAthenaLambdaFunction",
            "Condition": {
                "ForAnyValue:StringEquals": {
                    "aws:CalledVia": "athena.amazonaws.com"
                }
            }
        }
    ]
}
```

------

下例说明了将前一语句添加到策略中以允许用户运行和读取联合查询。允许执行这些操作的主体可以运行指定与联合数据来源关联的 Athena 目录的查询。但是，除非通过 Athena 调用该函数，否则主体无法访问关联的 Lambda 函数。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "VisualEditor0", 
            "Effect": "Allow",
            "Action": [ 
                "athena:GetWorkGroup", 
                "s3:PutObject", 
                "s3:GetObject", 
                "athena:StartQueryExecution", 
                "s3:AbortMultipartUpload",  
                "athena:StopQueryExecution", 
                "athena:GetQueryExecution", 
                "athena:GetQueryResults", 
                "s3:ListMultipartUploadParts" 
            ], 
            "Resource": [ 
                "arn:aws:athena:*:111122223333:workgroup/WorkGroupName",
                "arn:aws:s3:::MyQueryResultsBucket/*", 
                "arn:aws:s3:::MyLambdaSpillBucket/MyLambdaSpillPrefix*"
            ] 
        }, 
        {
            "Sid": "VisualEditor1", 
            "Effect": "Allow", 
            "Action": "athena:ListWorkGroups", 
            "Resource": "*" 
        }, 
        {
            "Sid": "VisualEditor2", 
            "Effect": "Allow", 
            "Action": 
                [ 
                "s3:ListBucket", 
                "s3:GetBucketLocation" 
                ], 
            "Resource": "arn:aws:s3:::MyLambdaSpillBucket" 
        },
        {
            "Sid": "VisualEditor3",
            "Effect": "Allow",
            "Action": "lambda:InvokeFunction",
            "Resource": [
                "arn:aws:lambda:*:111122223333:function:OneAthenaLambdaFunction", 
                "arn:aws:lambda:*:111122223333:function:AnotherAthenaLambdaFunction"
            ], 
            "Condition": {
                "ForAnyValue:StringEquals": { 
                    "aws:CalledVia": "athena.amazonaws.com"
                }
            }
        }            
    ]
}
```

------

有关 `CalledVia` 条件键的更多信息，请参阅《*IAM 用户指南*》中的 [AWS 全局条件上下文键](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html)。

# 允许访问适用于外部配置 Hive 元存储的 Athena 数据连接器
<a name="hive-metastore-iam-access"></a>

本主题中的权限策略示例演示了需要允许的操作以及允许执行这些操作的资源。在将类似的权限策略附加到 IAM 身份之前，请仔细检查这些策略并根据您的需求修改它们。
+  [Example Policy to Allow an IAM Principal to Query Data Using Athena Data Connector for External Hive Metastore](#hive-using-iam) 
+  [Example Policy to Allow an IAM Principal to Create an Athena Data Connector for External Hive Metastore](#hive-creating-iam) 

**Example ：允许 IAM 主体使用适用于外部 Hive 元存储的 Athena 数据连接器查询数据**  
除了对 Athena 操作授予完全访问权限的 [AWS 托管策略：AmazonAthenaFullAccess](security-iam-awsmanpol.md#amazonathenafullaccess-managed-policy) 之外，还将以下策略附加到 IAM 主体。    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "lambda:GetFunction",
                "lambda:GetLayerVersion",
                "lambda:InvokeFunction"
            ],
            "Resource": [
                "arn:aws:lambda:*:111122223333:function:MyAthenaLambdaFunction",
                "arn:aws:lambda:*:111122223333:function:AnotherAthenaLambdaFunction",
                "arn:aws:lambda:*:111122223333:layer:MyAthenaLambdaLayer:*"
            ]
        },
        {
            "Sid": "VisualEditor2",
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketLocation",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:PutObject",
                "s3:ListMultipartUploadParts",
                "s3:AbortMultipartUpload"
            ],
            "Resource": "arn:aws:s3:::MyLambdaSpillBucket/MyLambdaSpillLocation"
        }
    ]
}
```


**权限说明**  

| 允许的操作 | 说明 | 
| --- | --- | 
|  <pre>"s3:GetBucketLocation",<br />"s3:GetObject",<br />"s3:ListBucket",<br />"s3:PutObject",<br />"s3:ListMultipartUploadParts",<br />"s3:AbortMultipartUpload"</pre>  |  `s3` 操作允许从指定为 `"arn:aws:s3:::MyLambdaSpillBucket/MyLambdaSpillLocation"` 的资源读取和写入到该资源，其中 *MyLambdaSpillLocation* 标识在调用的一个或多个 Lambda 函数的配置中指定的溢出存储桶。仅当您使用 Lambda 层创建自定义运行时依赖关系以减少部署时函数构件大小时，才需要 *arn:aws:lambda:\$1:*MyAWSAcctId*:layer:*MyAthenaLambdaLayer*:\$1* 资源标识符。最后一个位置的 `*` 是图层版本的通配符。  | 
|  <pre>"lambda:GetFunction",<br />"lambda:GetLayerVersion",<br />"lambda:InvokeFunction"</pre>  | 允许查询调用 Resource 块中指定的 AWS Lambda 函数。例如 arn:aws:lambda:\$1:MyAWSAcctId:function:MyAthenaLambdaFunction，其中 MyAthenaLambdaFunction 指定要调用的 Lambda 函数的名称。如示例中所示，可以指定多个函数。 | 

**Example ：允许 IAM 主体创建适用于外部 Hive 元存储的 Athena 数据连接器**  
除了对 Athena 操作授予完全访问权限的 [AWS 托管策略：AmazonAthenaFullAccess](security-iam-awsmanpol.md#amazonathenafullaccess-managed-policy) 之外，还将以下策略附加到 IAM 主体。    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "lambda:GetFunction",
                "lambda:ListFunctions",
                "lambda:GetLayerVersion",
                "lambda:InvokeFunction",
                "lambda:CreateFunction",
                "lambda:DeleteFunction",
                "lambda:PublishLayerVersion",
                "lambda:DeleteLayerVersion",
                "lambda:UpdateFunctionConfiguration",
                "lambda:PutFunctionConcurrency",
                "lambda:DeleteFunctionConcurrency"
            ],
            "Resource": "arn:aws:lambda:*:111122223333: function: MyAthenaLambdaFunctionsPrefix*"
        }
    ]
}
```
 **权限说明**   
允许查询为 `Resource` 块中指定的 AWS Lambda 函数调用 AWS Lambda 函数。例如 `arn:aws:lambda:*:MyAWSAcctId:function:MyAthenaLambdaFunction`，其中 *MyAthenaLambdaFunction* 指定要调用的 Lambda 函数的名称。如示例中所示，可以指定多个函数。

# 允许 Lambda 函数访问外部 Hive 元存储
<a name="hive-metastore-iam-access-lambda"></a>

要在账户中调用 Lambda 函数，您必须创建具有以下权限的角色：
+ `AWSLambdaVPCAccessExecutionRole` – [AWS Lambda 执行角色](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html)权限，用于管理将函数连接到 VPC 的弹性网络接口。确保您有足够数量的可用网络接口和 IP 地址。
+ `AmazonAthenaFullAccess` – [AmazonAthenaFullAccess](security-iam-awsmanpol.md#amazonathenafullaccess-managed-policy) 托管式策略授予对 Athena 的完全访问权限。
+ 一个 Amazon S3 策略，该策略允许 Lambda 函数对 S3 进行写入并允许 Athena 从 S3 中进行读取。

例如，以下策略定义溢出位置 `s3:\\mybucket\spill` 的权限。

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

****  

```
{ "Version":"2012-10-17",		 	 	  "Statement": [ { "Effect": "Allow", "Action": [
    "s3:GetBucketLocation", "s3:GetObject", "s3:ListBucket", "s3:PutObject" ], "Resource": [
        "arn:aws:s3:::amzn-s3-demo-bucket/spill" ] } ] }
```

------

每当您使用 IAM 策略时，请确保遵循 IAM 最佳实践。有关更多信息，请参阅《[IAM 用户指南](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)》中的 *IAM 安全最佳实践*。

## 创建 Lambda 函数
<a name="hive-metastore-iam-access-lambda-creating-lambda-functions"></a>

要在您的账户中创建 Lambda 函数，需要函数开发权限或 `AWSLambdaFullAccess` 角色。有关更多信息，请参阅 [AWS Lambda 的基于身份的 IAM 策略](https://docs.aws.amazon.com/lambda/latest/dg/access-control-identity-based.html)。

由于 Athena 使用 AWS Serverless Application Repository 创建 Lambda 函数，因此，创建 Lambda 函数的超级用户或管理员也应具有 IAM 策略[以允许 Athena 联合查询](federated-query-iam-access.md)。

## 配置目录注册和元数据 API 操作的权限
<a name="hive-metastore-iam-access-lambda-catalog-registration-and-metadata-api-operations"></a>

要访问目录注册 API 和元数据 API 操作，请使用 [AmazonAthenaFullAccess 托管策略](security-iam-awsmanpol.md#amazonathenafullaccess-managed-policy)。如果您不使用 `AmazonAthenaFullAccess` 策略，请将以下 API 操作添加到您的 Athena 策略：

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "athena:ListDataCatalogs",
                "athena:GetDataCatalog",
                "athena:CreateDataCatalog",
                "athena:UpdateDataCatalog",
                "athena:DeleteDataCatalog",
                "athena:GetDatabase",
                "athena:ListDatabases",
                "athena:GetTableMetadata",
                "athena:ListTableMetadata"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
```

------

## 跨区域调用 Lambda 函数
<a name="hive-metastore-iam-access-lambda-cross-region-invocation"></a>

预设情况下，Athena 调用在同一区域中定义的 Lambda 函数。要在运行 Athena 查询的区域以外的 AWS 区域 中调用 Lambda 函数，请使用 Lambda 函数的完整 ARN。

以下示例显示欧洲地区（法兰克福）的目录如何指定美国东部（弗吉尼亚州北部）的 Lambda 函数，从而提取来自欧洲地区（法兰克福）的 Hive 元存储数据。

```
arn:aws:lambda:us-east-1:111122223333:function:external-hms-service-new     
```

当您通过此方式指定完整 ARN 时，Athena 会对 `us-east-1` 调用 `external-hms-service-new` Lambda 函数以从 `eu-central-1` 中提取 Hive 元存储数据。

**注意**  
应在运行 Athena 查询的相同 AWS 区域 中注册目录。

## 跨账户调用 Lambda 函数
<a name="hive-metastore-iam-access-lambda-cross-account-invocation"></a>

有时，您可能需要从其他账户访问 Hive 元存储。例如，要运行 Hive 元存储，您可以使用 Athena 查询的账户之外的其他账户。不同的组或团队可能会在其 VPC 内使用不同的账户运行 Hive 元存储。或者，您可能希望访问来自不同的组或团队中的各个 Hive 元存储的元数据。

Athena 使用 [AWS Lambda 对跨账户访问的支持](https://aws.amazon.com/blogs/compute/easy-authorization-of-aws-lambda-functions/)来启用对 Hive 元存储的跨账户访问。

**注意**  
请注意，对 Athena 的跨账户访问通常意味着对 Amazon S3 中的元数据和数据的跨账户访问。

设想以下场景：
+ 账户 `111122223333` 在 Athena 中的 us-east-1 上设置 Lambda 函数 `external-hms-service-new` 以访问 EMR 集群上运行的 Hive 元存储。
+ 账户 `111122223333` 希望允许账户 444455556666 访问 Hive 元存储数据。

为了向账户 `444455556666` 授予对 Lambda 函数 `external-hms-service-new` 的访问权限，账户 `111122223333` 使用以下 AWS CLI `add-permission` 命令。该命令设置了格式以便于阅读。

```
$ aws --profile perf-test lambda add-permission
      --function-name external-hms-service-new
      --region us-east-1
      --statement-id Id-ehms-invocation2
      --action "lambda:InvokeFunction"
      --principal arn:aws:iam::444455556666:user/perf1-test
{
    "Statement": "{\"Sid\":\"Id-ehms-invocation2\",
                   \"Effect\":\"Allow\",
                   \"Principal\":{\"AWS\":\"arn:aws:iam::444455556666:user/perf1-test\"},
                   \"Action\":\"lambda:InvokeFunction\",
                   \"Resource\":\"arn:aws:lambda:us-east-1:111122223333:function:external-hms-service-new\"}"
}
```

要检查 Lambda 权限，请使用 `get-policy` 命令，如以下示例中所示。该命令设置了格式以便于阅读。

```
$ aws --profile perf-test lambda get-policy 
      --function-name arn:aws:lambda:us-east-1:111122223333:function:external-hms-service-new 
      --region us-east-1
{
    "RevisionId": "711e93ea-9851-44c8-a09f-5f2a2829d40f",
    "Policy": "{\"Version\":\"2012-10-17\",		 	 	 
                \"Id\":\"default\",
                \"Statement\":[{\"Sid\":\"Id-ehms-invocation2\",
                                \"Effect\":\"Allow\",
                                \"Principal\":{\"AWS\":\"arn:aws:iam::444455556666:user/perf1-test\"},
                                \"Action\":\"lambda:InvokeFunction\",
                                \"Resource\":\"arn:aws:lambda:us-east-1:111122223333:function:external-hms-service-new\"}]}"
}
```

添加权限后，您可以在定义目录 `ehms` 时对 `us-east-1` 使用 Lambda 函数的完整 ARN，如下所示：

```
arn:aws:lambda:us-east-1:111122223333:function:external-hms-service-new
```

有关跨区域调用的信息，请参阅本主题前面的 [跨区域调用 Lambda 函数](#hive-metastore-iam-access-lambda-cross-region-invocation)。

### 授予对数据的跨账户访问
<a name="hive-metastore-iam-access-lambda-granting-cross-account-access-to-data"></a>

您必须先授予对 Amazon S3 中数据的跨账户访问权限，然后才能运行 Athena 查询。您可以通过下列方式之一来执行该操作：
+ 使用[规范用户 ID](https://docs.aws.amazon.com/general/latest/gr/acct-identifiers.html) 更新 Amazon S3 存储桶的访问控制列表策略。
+ 添加对 Amazon S3 存储桶策略的跨账户访问权限。

例如，将以下策略添加到账户 `111122223333` 中的 Amazon S3 存储桶策略以允许账户 `444455556666` 从指定的 Amazon S3 位置读取数据。

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

****  

```
{ "Version":"2012-10-17",		 	 	  "Statement": [ { "Sid": "Stmt1234567890123", "Effect":
    "Allow", "Principal": { "AWS":
        "arn:aws:iam::444455556666:user/perf1-test"
    }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::athena-test/lambda/dataset/*" } ]
    }
```

------

**注意**  
您可能需要向 Amazon S3 授予对数据以及 Amazon S3 溢出位置的跨账户访问权限。当响应对象的大小超过给定阈值时，Lambda 函数会使额外数据流出到溢出位置。有关示例策略，请参阅本主题的开头部分。

在当前示例中，在向 `444455556666,` 授予跨账户访问权限后，`444455556666` 可在其自己的 `account` 中使用目录 `ehms` 查询账户 `111122223333` 中定义的表。

在以下示例中，SQL Workbench 配置文件 `perf-test-1` 适用于账户 `444455556666`。查询使用目录 `ehms` 访问 Hive 元存储以及账户 `111122223333` 中的 Amazon S3 数据。

![\[在 SQL Workbench 中跨账户访问 Hive 元存储和 Amazon S3 数据。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/hive-metastore-iam-access-lambda-1.png)


# 创建连接器和 Athena 目录所需的权限
<a name="athena-catalog-access"></a>

要调用 Athena `CreateDataCatalog`，您必须创建一个具有以下权限的角色：

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
  {
  "Sid": "ECR",
  "Effect": "Allow",
  "Action": [
  "ecr:BatchGetImage",
  "ecr:GetDownloadUrlForLayer"
  ],
  "Resource": "arn:aws:ecr:*:*:repository/*"
  },
  {
  "Effect": "Allow",
  "Action": [
  "s3:GetObject",
  "glue:TagResource",
  "glue:GetConnection",
  "glue:CreateConnection",
  "glue:DeleteConnection",
  "glue:UpdateConnection",
  "serverlessrepo:CreateCloudFormationTemplate",
  "serverlessrepo:GetCloudFormationTemplate",
  "cloudformation:CreateStack",
  "cloudformation:DeleteStack",
  "cloudformation:DescribeStacks",
  "cloudformation:CreateChangeSet",
  "cloudformation:DescribeAccountLimits",
  "cloudformation:CreateStackSet",
  "cloudformation:ValidateTemplate",
  "cloudformation:CreateUploadBucket",
  "cloudformation:DescribeStackDriftDetectionStatus",
  "cloudformation:ListExports",
  "cloudformation:ListStacks",
  "cloudformation:EstimateTemplateCost",
  "cloudformation:ListImports",
  "lambda:InvokeFunction",
  "lambda:GetFunction",
  "lambda:DeleteFunction",
  "lambda:CreateFunction",
  "lambda:TagResource",
  "lambda:ListFunctions",
  "lambda:GetAccountSettings",
  "lambda:ListEventSourceMappings",
  "lambda:ListVersionsByFunction",
  "lambda:GetFunctionConfiguration",
  "lambda:PutFunctionConcurrency",
  "lambda:UpdateFunctionConfiguration",
  "lambda:UpdateFunctionCode",
  "lambda:DeleteFunctionConcurrency",
  "lambda:RemovePermission",
  "lambda:AddPermission",
  "lambda:ListTags",
  "lambda:GetAlias",
  "lambda:GetPolicy",
  "lambda:ListAliases",
  "ec2:DescribeSecurityGroups",
  "ec2:DescribeSubnets",
  "ec2:DescribeVpcs",
  "secretsmanager:ListSecrets",
  "glue:GetCatalogs"
  ],
  "Resource": "*"
  },
  {
  "Effect": "Allow",
  "Action": [
  "iam:AttachRolePolicy",
  "iam:DetachRolePolicy",
  "iam:DeleteRolePolicy",
  "iam:PutRolePolicy",
  "iam:GetRolePolicy",
  "iam:CreateRole",
  "iam:TagRole",
  "iam:DeleteRole",
  "iam:GetRole",
  "iam:PassRole",
  "iam:ListRoles",
  "iam:ListAttachedRolePolicies",
  "iam:ListRolePolicies",
  "iam:GetPolicy",
  "iam:UpdateRole"
  ],
  "Resource": [
  "arn:aws:iam::*:role/RoleName",
  "arn:aws:iam::111122223333:policy/*"
  ]
  }
  ]
  }
```

------

# 允许访问 Athena 联合查询：示例策略
<a name="federated-query-iam-access"></a>

本主题中的权限策略示例演示了需要允许的操作以及允许执行这些操作的资源。仔细检查这些策略并根据您的需求修改它们，然后再将它们附加到 IAM 身份。

有关将 IAM 策略添加到用户的信息，请参阅 [IAM 用户指南](https://docs.aws.amazon.com/IAM/latest/UserGuide/) 中的 [添加和删除 IAM 身份权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html)。
+  [Example policy to allow an IAM principal to run and return results using Athena Federated Query](#fed-using-iam) 
+  [Example Policy to Allow an IAM Principal to Create a Data Source Connector](#fed-creating-iam) 

**Example ：允许 IAM 主体运行并使用 Athena 联合查询返回结果**  
以下基于身份的权限策略允许用户或其他 IAM 主体执行使用 Athena 联合查询所需的操作。允许执行这些操作的主体可以运行指定与联合数据来源关联的 Athena 目录的查询。    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "Athena",
            "Effect": "Allow",
            "Action": [
                "athena:GetDataCatalog",
                "athena:GetQueryExecution",
                "athena:GetQueryResults",
                "athena:GetWorkGroup",
                "athena:StartQueryExecution",
                "athena:StopQueryExecution"
            ],
            "Resource": [
                "arn:aws:athena:*:111122223333:workgroup/WorkgroupName",
                "arn:aws:athena:us-east-1:111122223333:datacatalog/DataCatalogName"
            ]
        },
        {
            "Sid": "ListAthenaWorkGroups",
            "Effect": "Allow",
            "Action": "athena:ListWorkGroups",
            "Resource": "*"
        },
        {
            "Sid": "Lambda",
            "Effect": "Allow",
            "Action": "lambda:InvokeFunction",
            "Resource": [
                "arn:aws:lambda:*:111122223333:function:OneAthenaLambdaFunction",
                "arn:aws:lambda:*:111122223333:function:AnotherAthenaLambdaFunction"
            ]
        },
        {
            "Sid": "S3",
            "Effect": "Allow",
            "Action": [
                "s3:AbortMultipartUpload",
                "s3:GetBucketLocation",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:ListMultipartUploadParts",
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::MyLambdaSpillBucket",
                "arn:aws:s3:::MyLambdaSpillBucket/*",
                "arn:aws:s3:::MyQueryResultsBucket",
                "arn:aws:s3:::MyQueryResultsBucket/*"
            ]
        }
    ]
}
```


**权限说明**  

| 允许的操作 | 说明 | 
| --- | --- | 
|  <pre> "athena:GetQueryExecution", <br /> "athena:GetQueryResults",<br /> "athena:GetWorkGroup",<br /> "athena:StartQueryExecution",<br /> "athena:StopQueryExecution"</pre>  |  运行联合查询所需的 Athena 权限。  | 
|  <pre> "athena:GetDataCatalog",<br /> "athena:GetQueryExecution,"<br /> "athena:GetQueryResults",<br /> "athena:GetWorkGroup",<br /> "athena:StartQueryExecution",<br /> "athena:StopQueryExecution"</pre>  |  运行联合视图查询所需的 Athena 权限。视图需要 `GetDataCatalog` 操作。  | 
|  <pre>"lambda:InvokeFunction"</pre>  | 允许查询为 Resource 块中指定的 AWS Lambda 函数调用 AWS Lambda 函数。例如 arn:aws:lambda:\$1:MyAWSAcctId:function:MyAthenaLambdaFunction，其中 MyAthenaLambdaFunction 指定要调用的 Lambda 函数的名称。如示例中所示，可以指定多个函数。 | 
|  <pre>"s3:AbortMultipartUpload",<br />"s3:GetBucketLocation",<br />"s3:GetObject",<br />"s3:ListBucket",<br />"s3:ListMultipartUploadParts",<br />"s3:PutObject"</pre>  |  必须具备 `s3:ListBucket` 和 `s3:GetBucketLocation` 权限，才能访问运行 `StartQueryExecution` 的 IAM 主体的查询输出存储桶。 `s3:PutObject`、`s3:ListMultipartUploadParts` 和 `s3:AbortMultipartUpload` 允许将查询结果写入由 `arn:aws:s3:::MyQueryResultsBucket/*` 资源标识符指定的查询结果存储桶的所有子文件夹，其中 *MyQueryResultsBucket* 为 Athena 查询结果存储桶。有关更多信息，请参阅 [使用查询结果和最近查询](querying.md)。 `s3:GetObject` 允许读取指定为 `arn:aws:s3:::MyQueryResultsBucket` 的资源的查询结果和查询历史记录，其中 *MyQueryResultsBucket* 是 Athena 查询结果存储桶。 `s3:GetObject` 还允许从指定为 `"arn:aws:s3:::MyLambdaSpillBucket/MyLambdaSpillPrefix*"` 的资源中读取，其中 *MyLambdaSpillPrefix* 在被调用的一个或多个 Lambda 函数的配置中指定。  | 

**Example ：允许 IAM 主体创建数据来源连接器**  

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "lambda:CreateFunction",
                "lambda:ListVersionsByFunction",
                "iam:CreateRole",
                "lambda:GetFunctionConfiguration",
                "iam:AttachRolePolicy",
                "iam:PutRolePolicy",
                "lambda:PutFunctionConcurrency",
                "iam:PassRole",
                "iam:DetachRolePolicy",
                "lambda:ListTags",
                "iam:ListAttachedRolePolicies",
                "iam:DeleteRolePolicy",
                "lambda:DeleteFunction",
                "lambda:GetAlias",
                "iam:ListRolePolicies",
                "iam:GetRole",
                "iam:GetPolicy",
                "lambda:InvokeFunction",
                "lambda:GetFunction",
                "lambda:ListAliases",
                "lambda:UpdateFunctionConfiguration",
                "iam:DeleteRole",
                "lambda:UpdateFunctionCode",
                "s3:GetObject",
                "lambda:AddPermission",
                "iam:UpdateRole",
                "lambda:DeleteFunctionConcurrency",
                "lambda:RemovePermission",
                "iam:GetRolePolicy",
                "lambda:GetPolicy"
            ],
            "Resource": [
                "arn:aws:lambda:*:111122223333:function:MyAthenaLambdaFunctionsPrefix*",
                "arn:aws:s3:::awsserverlessrepo-changesets-1iiv3xa62ln3m/*",
                "arn:aws:iam::*:role/RoleName",
                "arn:aws:iam::111122223333:policy/*"
            ]
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "cloudformation:CreateUploadBucket",
                "cloudformation:DescribeStackDriftDetectionStatus",
                "cloudformation:ListExports",
                "cloudformation:ListStacks",
                "cloudformation:ListImports",
                "lambda:ListFunctions",
                "iam:ListRoles",
                "lambda:GetAccountSettings",
                "ec2:DescribeSecurityGroups",
                "cloudformation:EstimateTemplateCost",
                "ec2:DescribeVpcs",
                "lambda:ListEventSourceMappings",
                "cloudformation:DescribeAccountLimits",
                "ec2:DescribeSubnets",
                "cloudformation:CreateStackSet",
                "cloudformation:ValidateTemplate"
            ],
            "Resource": "*"
        },
        {
            "Sid": "VisualEditor2",
            "Effect": "Allow",
            "Action": "cloudformation:*",
            "Resource": [
                "arn:aws:cloudformation:*:111122223333:stack/aws-serverless-repository-MyCFStackPrefix*/*",
                "arn:aws:cloudformation:*:111122223333:stack/serverlessrepo-MyCFStackPrefix*/*",
                "arn:aws:cloudformation:*:*:transform/Serverless-*",
                "arn:aws:cloudformation:*:111122223333:stackset/aws-serverless-repository-MyCFStackPrefix*:*",
                "arn:aws:cloudformation:*:111122223333:stackset/serverlessrepo-MyCFStackPrefix*:*"
            ]
        },
        {
            "Sid": "VisualEditor3",
            "Effect": "Allow",
            "Action": "serverlessrepo:*",
            "Resource": "arn:aws:serverlessrepo:*:*:applications/*"
        },
        {
            "Sid": "ECR",
            "Effect": "Allow",
            "Action": [
                "ecr:BatchGetImage",
                "ecr:GetDownloadUrlForLayer"
            ],
            "Resource": "arn:aws:ecr:*:*:repository/*"
        }
    ]
}
```


**权限说明**  

| 允许的操作 | 说明 | 
| --- | --- | 
|  <pre>"lambda:CreateFunction",<br />"lambda:ListVersionsByFunction",<br />"lambda:GetFunctionConfiguration",<br />"lambda:PutFunctionConcurrency",<br />"lambda:ListTags",<br />"lambda:DeleteFunction",<br />"lambda:GetAlias",<br />"lambda:InvokeFunction",<br />"lambda:GetFunction",<br />"lambda:ListAliases",<br />"lambda:UpdateFunctionConfiguration",<br />"lambda:UpdateFunctionCode",<br />"lambda:AddPermission",<br />"lambda:DeleteFunctionConcurrency",<br />"lambda:RemovePermission",<br />"lambda:GetPolicy"<br />"lambda:GetAccountSettings",<br />"lambda:ListFunctions",<br />"lambda:ListEventSourceMappings",<br /></pre>  |  允许创建和管理列为资源的 Lambda 函数。在此示例中，资源标识符 `arn:aws:lambda:*:MyAWSAcctId:function:MyAthenaLambdaFunctionsPrefix*` 中使用名称前缀，其中 `MyAthenaLambdaFunctionsPrefix` 是一组 Lambda 函数的名称中使用的共享前缀，因此它们不需要单独指定为资源。您可以指定一个或多个 Lambda 函数资源。  | 
|  <pre>"s3:GetObject"</pre>  | 允许读取 AWS Serverless Application Repository 所需的存储桶，如资源标识符 arn:aws:s3:::awsserverlessrepo-changesets-1iiv3xa62ln3m/\$1 所指定。此存储桶可能特定于您的账户。 | 
|  <pre>"cloudformation:*"</pre>  |  允许创建和管理由资源 `MyCFStackPrefix` 指定的 CloudFormation 堆栈。这些堆栈和堆栈集是 AWS Serverless Application Repository 部署连接器和 UDF 的方式。  | 
|  <pre>"serverlessrepo:*"</pre>  | 允许在由资源标识符 arn:aws:serverlessrepo:\$1:\$1:applications/\$1 指定的 AWS Serverless Application Repository 中搜索、查看、发布和更新应用程序。 | 
|  <pre>"ecr:BatchGetImage",<br />"ecr:GetDownloadUrlForLayer"</pre>  |  允许创建的 Lambda 函数访问联合身份验证连接器 ECR 映像。  | 

# 允许访问 Athena UDF：策略示例
<a name="udf-iam-access"></a>

本主题中的权限策略示例演示了需要允许的操作以及允许执行这些操作的资源。在将类似的权限策略附加到 IAM 身份之前，请仔细检查这些策略并根据您的需求修改它们。
+  [Example Policy to Allow an IAM Principal to Run and Return Queries that Contain an Athena UDF Statement](#udf-using-iam) 
+  [Example Policy to Allow an IAM Principal to Create an Athena UDF](#udf-creating-iam) 

**Example ：允许 IAM 主体运行并返回包含 Athena UDF 语句的查询**  
以下基于身份的权限策略允许用户或其他 IAM 主体执行使用 Athena UDF 语句运行查询所需的操作。  

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "athena:StartQueryExecution",
                "lambda:InvokeFunction",
                "athena:GetQueryResults",
                "s3:ListMultipartUploadParts",
                "athena:GetWorkGroup",
                "s3:PutObject",
                "s3:GetObject",
                "s3:AbortMultipartUpload",
                "athena:StopQueryExecution",
                "athena:GetQueryExecution",
                "s3:GetBucketLocation"
            ],
            "Resource": [
                "arn:aws:athena:*:MyAWSAcctId:workgroup/MyAthenaWorkGroup",
                "arn:aws:s3:::MyQueryResultsBucket/*",
                "arn:aws:lambda:*:MyAWSAcctId:function:OneAthenaLambdaFunction",
                "arn:aws:lambda:*:MyAWSAcctId:function:AnotherAthenaLambdaFunction"
            ]
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": "athena:ListWorkGroups",
            "Resource": "*"
        }
    ]
}
```


**权限说明**  

| 允许的操作 | 说明 | 
| --- | --- | 
|  <pre>"athena:StartQueryExecution",<br /> "athena:GetQueryResults",<br /> "athena:GetWorkGroup",<br /> "athena:StopQueryExecution",<br /> "athena:GetQueryExecution",<br /></pre>  |  在 `MyAthenaWorkGroup` 工作组中运行查询所需的 Athena 权限。  | 
|  <pre>"s3:PutObject",<br />"s3:GetObject",<br />"s3:AbortMultipartUpload"</pre>  |  `s3:PutObject` 和 `s3:AbortMultipartUpload` 允许将查询结果写入由 `arn:aws:s3:::MyQueryResultsBucket/*` 资源标识符指定的查询结果存储桶的所有子文件夹，其中 *MyQueryResultsBucket* 是 Athena 查询结果存储桶。有关更多信息，请参阅 [使用查询结果和最近查询](querying.md)。 `s3:GetObject` 允许读取指定为 `arn:aws:s3:::MyQueryResultsBucket` 的资源的查询结果和查询历史记录，其中 *MyQueryResultsBucket* 是 Athena 查询结果存储桶。有关更多信息，请参阅 [使用查询结果和最近查询](querying.md)。 `s3:GetObject` 还允许从指定为 `"arn:aws:s3:::MyLambdaSpillBucket/MyLambdaSpillPrefix*"` 的资源中读取，其中 *MyLambdaSpillPrefix* 在被调用的一个或多个 Lambda 函数的配置中指定。  | 
|  <pre>"lambda:InvokeFunction"</pre>  | 允许查询调用 Resource 块中指定的 AWS Lambda 函数。例如 arn:aws:lambda:\$1:MyAWSAcctId:function:MyAthenaLambdaFunction，其中 MyAthenaLambdaFunction 指定要调用的 Lambda 函数的名称。如示例中所示，可以指定多个函数。 | 

**Example ：允许 IAM 主体创建 Athena UDF**  

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "lambda:CreateFunction",
                "lambda:ListVersionsByFunction",
                "iam:CreateRole",
                "lambda:GetFunctionConfiguration",
                "iam:AttachRolePolicy",
                "iam:PutRolePolicy",
                "lambda:PutFunctionConcurrency",
                "iam:PassRole",
                "iam:DetachRolePolicy",
                "lambda:ListTags",
                "iam:ListAttachedRolePolicies",
                "iam:DeleteRolePolicy",
                "lambda:DeleteFunction",
                "lambda:GetAlias",
                "iam:ListRolePolicies",
                "iam:GetRole",
                "iam:GetPolicy",
                "lambda:InvokeFunction",
                "lambda:GetFunction",
                "lambda:ListAliases",
                "lambda:UpdateFunctionConfiguration",
                "iam:DeleteRole",
                "lambda:UpdateFunctionCode",
                "s3:GetObject",
                "lambda:AddPermission",
                "iam:UpdateRole",
                "lambda:DeleteFunctionConcurrency",
                "lambda:RemovePermission",
                "iam:GetRolePolicy",
                "lambda:GetPolicy"
            ],
            "Resource": [
                "arn:aws:lambda:*:111122223333:function:MyAthenaLambdaFunctionsPrefix*",
                "arn:aws:s3:::awsserverlessrepo-changesets-1iiv3xa62ln3m/*",
                "arn:aws:iam::*:role/RoleName",
                "arn:aws:iam::111122223333:policy/*"
            ]
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "cloudformation:CreateUploadBucket",
                "cloudformation:DescribeStackDriftDetectionStatus",
                "cloudformation:ListExports",
                "cloudformation:ListStacks",
                "cloudformation:ListImports",
                "lambda:ListFunctions",
                "iam:ListRoles",
                "lambda:GetAccountSettings",
                "ec2:DescribeSecurityGroups",
                "cloudformation:EstimateTemplateCost",
                "ec2:DescribeVpcs",
                "lambda:ListEventSourceMappings",
                "cloudformation:DescribeAccountLimits",
                "ec2:DescribeSubnets",
                "cloudformation:CreateStackSet",
                "cloudformation:ValidateTemplate"
            ],
            "Resource": "*"
        },
        {
            "Sid": "VisualEditor2",
            "Effect": "Allow",
            "Action": "cloudformation:*",
            "Resource": [
                "arn:aws:cloudformation:*:111122223333:stack/aws-serverless-repository-MyCFStackPrefix*/*",
                "arn:aws:cloudformation:*:111122223333:stack/serverlessrepo-MyCFStackPrefix*/*",
                "arn:aws:cloudformation:*:*:transform/Serverless-*",
                "arn:aws:cloudformation:*:111122223333:stackset/aws-serverless-repository-MyCFStackPrefix*:*",
                "arn:aws:cloudformation:*:111122223333:stackset/serverlessrepo-MyCFStackPrefix*:*"
            ]
        },
        {
            "Sid": "VisualEditor3",
            "Effect": "Allow",
            "Action": "serverlessrepo:*",
            "Resource": "arn:aws:serverlessrepo:*:*:applications/*"
        },
        {
            "Sid": "ECR",
            "Effect": "Allow",
            "Action": [
                "ecr:BatchGetImage",
                "ecr:GetDownloadUrlForLayer"
            ],
            "Resource": "arn:aws:ecr:*:*:repository/*"
        }
    ]
}
```


**权限说明**  

| 允许的操作 | 说明 | 
| --- | --- | 
|  <pre>"lambda:CreateFunction",<br />"lambda:ListVersionsByFunction",<br />"lambda:GetFunctionConfiguration",<br />"lambda:PutFunctionConcurrency",<br />"lambda:ListTags",<br />"lambda:DeleteFunction",<br />"lambda:GetAlias",<br />"lambda:InvokeFunction",<br />"lambda:GetFunction",<br />"lambda:ListAliases",<br />"lambda:UpdateFunctionConfiguration",<br />"lambda:UpdateFunctionCode",<br />"lambda:AddPermission",<br />"lambda:DeleteFunctionConcurrency",<br />"lambda:RemovePermission",<br />"lambda:GetPolicy"<br />"lambda:GetAccountSettings",<br />"lambda:ListFunctions",<br />"lambda:ListEventSourceMappings",<br /></pre>  |  允许创建和管理列为资源的 Lambda 函数。在此示例中，资源标识符 `arn:aws:lambda:*:MyAWSAcctId:function:MyAthenaLambdaFunctionsPrefix*` 中使用名称前缀，其中 *MyAthenaLambdaFunctionsPrefix* 是一组 Lambda 函数的名称中使用的共享前缀，因此它们不需要单独指定为资源。您可以指定一个或多个 Lambda 函数资源。  | 
|  <pre>"s3:GetObject"</pre>  | 允许读取 AWS Serverless Application Repository 所需的存储桶，如资源标识符 arn:aws:s3:::awsserverlessrepo-changesets-1iiv3xa62ln3m/\$1 所指定。 | 
|  <pre>"cloudformation:*"</pre>  |  允许由资源 *MyCFStackPrefix* 指定的 CloudFormation 堆栈的创建和管理。这些堆栈和堆栈集是 AWS Serverless Application Repository 部署连接器和 UDF 的方式。  | 
|  <pre>"serverlessrepo:*"</pre>  | 允许在由资源标识符 arn:aws:serverlessrepo:\$1:\$1:applications/\$1 指定的 AWS Serverless Application Repository 中搜索、查看、发布和更新应用程序。 | 

# 允许使用 Athena 访问机器学习
<a name="machine-learning-iam-access"></a>

必须允许运行 Athena ML 查询的 IAM 主体对其使用的 Sagemaker 端点执行 `sagemaker:invokeEndpoint` 操作。在附加到用户身份且基于身份的权限策略中包括类似于下面的策略语句。此外，附加对 Athena 操作授予完全访问权限的 [AWS 托管策略：AmazonAthenaFullAccess](security-iam-awsmanpol.md#amazonathenafullaccess-managed-policy)，或者附加允许操作子集的已修改内联策略。

将示例中的 `arn:aws:sagemaker:region:AWSAcctID:ModelEndpoint` 替换为要在查询中使用的模型端点的 ARN。有关更多信息，请参阅《服务授权参考》中的 [Actions, resources, and condition keys for SageMaker AI](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonsagemaker.html)**。

```
{
            "Effect": "Allow",
            "Action": [
                "sagemaker:invokeEndpoint"
            ],
            "Resource": "arn:aws:sagemaker:us-west-2:123456789012:workteam/public-crowd/default"
}
```

每当您使用 IAM 策略时，请确保遵循 IAM 最佳实践。有关更多信息，请参阅《[IAM 用户指南](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)》中的 *IAM 安全最佳实践*。

# 启用对 Athena API 的联合访问
<a name="access-federation-saml"></a>

此部分介绍允许组织中的用户或客户端应用程序调用 Amazon Athena API 操作的联合身份访问。在这种情况下，组织的用户没有 Athena 的直接访问权限。相反，您在 AWS 外部的 Microsoft Active Directory 中管理用户凭证。Active Directory 支持 [SAML 2.0](https://wiki.oasis-open.org/security)（安全断言标记语言 2.0）。

要在此方案中对用户进行身份验证，请使用支持 SAML.2.0 的 JDBC 或 ODBC 驱动程序，访问 Active Directory 联合身份验证服务 (AD FS) 3.0 并允许客户端应用程序调用 Athena API 操作。

有关更多信息对于 AWS 的 SAML 2.0 支持，请参阅《IAM 用户指南**》中的 [关于 SAML 2.0 联合身份验证](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_saml.html)。

**注意**  
特定类型的身份提供者（IdP），即 Windows Server 中包括的 Active Directory 联合身份验证服务（AD FS 3.0）支持对 Athena API 的联合访问。联合访问与 IAM Identity Center 可信身份传播功能不兼容。访问通过支持 SAML 2.0 的 JDBC 或 ODBC 驱动程序版本建立。有关更多信息，请参阅 [通过 JDBC 连接到 Amazon Athena](connect-with-jdbc.md) 和 [通过 ODBC 连接到 Amazon Athena](connect-with-odbc.md)。

**Topics**
+ [开始前的准备工作](#access-federation-before-you-begin)
+ [了解身份验证流程](#access-federation-diagram)
+ [过程：对 Athena API 启用基于 SAML 的联合访问](#access-federation-procedure)

## 开始前的准备工作
<a name="access-federation-before-you-begin"></a>

 在开始之前，请满足以下先决条件：
+ 在组织中，安装并配置 ADFS 3.0 作为您的 IdP。
+ 在用于访问 Athena 的客户端上，安装和配置最新可用版本的 JDBC 或 ODBC 驱动程序。驱动程序必须包括对与 SAML 2.0 兼容的联合身份访问的支持。有关更多信息，请参阅 [通过 JDBC 连接到 Amazon Athena](connect-with-jdbc.md) 和 [通过 ODBC 连接到 Amazon Athena](connect-with-odbc.md)。

## 了解身份验证流程
<a name="access-federation-diagram"></a>

下图将说明对 Athena API 进行联合访问的身份验证过程。

![\[对 Athena API 的联合访问示意图。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/athena-saml-based-federation.png)


1. 您组织中的用户使用具有 JDBC 或 ODBC 驱动程序的客户端应用程序，请求组织的 IdP 进行身份验证。该 IdP 是 ADFS 3.0。

1. IdP 根据 Active Directory（组织的身份存储）对用户进行身份验证。

1. IdP 构建一个具有用户相关信息的 SAML 断言，并将此断言通过 JDBC 或 ODBC 驱动程序发送到客户端应用程序。

1. JDBC 或 ODBC 驱动程序调用 AWS Security Token Service [AssumeRoleWithSAML](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html) API 操作，将其传递给以下参数：
   + SAML 提供商的 ARN
   + 要代入的角色的 ARN
   + 来自 IdP 的 SAML 断言

   有关更多信息，请参阅 [AWS Security Token Service API 参考](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html)中的 *AssumeRoleWithSAML*。

1. 通过 JDBC 或 ODBC 驱动程序发送到客户端应用程序的 API 相应包含临时安全凭证。

1. 客户端应用程序使用临时安全凭证调用 Athena API 操作，从而允许您的用户访问 Athena API 操作。

## 过程：对 Athena API 启用基于 SAML 的联合访问
<a name="access-federation-procedure"></a>

该过程在组织的 IdP 与 AWS 账户之间建立信任关系，以实现对 Amazon Athena API 操作的基于 SAML 的联合访问。

**要启用对 Athena API 的联合访问，请执行以下操作：**

1. 在组织中，将 AWS 注册为您 IdP 中的服务提供商 (SP)。此过程称为*信赖方信任*。有关更多信息，请参阅《IAM 用户指南**》中的 [使用信赖方信任配置您的 SAML 2.0 IdP](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_saml_relying-party.html)。作为此任务的一部分，请执行以下步骤：

   1. 从以下 URL 获取示例 SAML 元数据文档：[https://signin.aws.amazon.com/static/saml-metadata.xml](https://signin.aws.amazon.com/static/saml-metadata.xml)。

   1. 在您组织的 IdP（ADFS）中，生成一个等同元数据 XML 文件，将您的 IdP 描述为 AWS 的身份提供者。您的元数据文件必须包括发布者名称、创建日期、过期日期以及 AWS 用来验证来自您组织的身份验证响应（断言）的密钥。

1. 在 IAM 控制台中，创建一个 SAML 身份提供程序实体。有关更多信息，请参阅《IAM 用户指南**》中的[创建 SAML 身份提供者](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_saml.html)。作为此步骤的一部分，请执行以下操作：

   1. 通过 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 打开 IAM 控制台。

   1. 上载此过程的第 1 步中由 IdP (ADFS) 生成的 SAML 元数据文档。

1. 在 IAM 控制台中，为您的 IdP 创建一个或多个 IAM 角色。有关更多信息，请参阅《IAM 用户指南》**中的[针对第三方身份提供程序创建角色（联合）](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-idp.html)。作为此步骤的一部分，请执行以下操作：
   + 在角色的权限策略中，列出允许您组织的用户在 AWS 中执行的操作。
   + 在角色的信任策略中，将在此过程第 2 步中创建的 SAML 提供商实体设置为主体。

   这将在您的组织与 AWS 之间建立信任关系。

1. 在您组织的 IdP (ADFS) 中，定义可将您组织中的用户或组映射到 IAM 角色的断言。将用户和组映射到 IAM 角色也称为*断言规则*。请注意，您的组织中不同的用户和组可能映射到不同的 IAM 角色。

   有关配置 ADFS 中的映射的信息，请参阅博客文章：[使用 Windows Active Directory、ADFS 和 SAML 2.0 启用 AWS 的联合身份验证](https://aws.amazon.com/blogs/security/enabling-federation-to-aws-using-windows-active-directory-adfs-and-saml-2-0/)。

1. 安装和配置具有 SAML 2.0 支持的 JDBC 或 ODBC 驱动程序。有关更多信息，请参阅 [通过 JDBC 连接到 Amazon Athena](connect-with-jdbc.md) 和 [通过 ODBC 连接到 Amazon Athena](connect-with-odbc.md)。

1. 指定从您应用程序到 JDBC 或 ODBC 驱动程序的连接字符串。有关应用程序应使用的连接字符串的信息，请参阅《*JDBC 驱动程序安装和配置指南*》中的“*使用 Active Directory 联合身份验证服务 (ADFS) 凭证提供程序*”或《*ODBC 驱动程序安装和配置指南*》中的类似主题，可从 [通过 JDBC 连接到 Amazon Athena](connect-with-jdbc.md) 和 [通过 ODBC 连接到 Amazon Athena](connect-with-odbc.md) 主题以 PDF 格式下载。

   下面大致概述了配置驱动程序的连接字符串：

   1. 在 `AwsCredentialsProviderClass configuration` 中，设置 `com.simba.athena.iamsupport.plugin.AdfsCredentialsProvider`，指示您希望通过 ADFS IdP 使用基于 SAML 2.0 的身份验证。

   1. 对于 `idp_host`，请提供 ADFS IdP 服务器的主机名。

   1. 对于 `idp_port`，请提供 ADFS IdP 侦听 SAML 断言请求的端口号。

   1. 对于 `UID` 和 `PWD`，请提供 AD 域用户凭证。在 Windows 上，如果使用驱动程序时未提供 `UID` 和 `PWD`，则驱动程序尝试获取登录到 Windows 计算机用户的用户凭证。

   1. （可选）将 `ssl_insecure` 设置为 `true`。在这种情况下，驱动程序不会检查 ADFS IdP 服务器的 SSL 证书的真实性。如果没有将 ADFS IdP 的 SSL 证书配置为受驱动程序信任，则需要设置为 `true`。

   1. 要启用 Active Directory 域用户或组与一个或多个 IAM 角色的映射（如此过程中第 4 步所述），请在 JDBC 或 ODBC 连接的 `preferred_role` 中，为驱动程序连接指定要代入的 IAM 角色 (ARN)。指定 `preferred_role` 是可选的，在角色不是断言规则中列出的第一个角色时非常有用。

   作为此过程的结果，将发生以下操作：

   1. JDBC 或 ODBC 驱动程序调用 AWS STS [AssumeRoleWithSAML](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html) API，并向其传递断言，如[架构示意图](#access-federation-diagram)中的第 4 步所示。

   1. AWS 确保代入角色的请求来自 SAML 提供商实体中引用的 IdP。

   1. 如果请求成功，AWS STS [AssumeRoleWithSAML](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html) API 操作会返回一组临时安全凭证，您的客户端应用程序即可用其向 Athena 发出已签名的请求。

      现在，您的应用程序拥有当前用户的相关信息，并且可以通过编程方式访问 Athena。

# 记录和监控 Athena
<a name="security-logging-monitoring"></a>

要检测事件、在发生事件时接收警报并进行响应，请针对 Amazon Athena 使用以下选项：
+ **使用 AWS CloudTrail 监控 Athena** – [AWS CloudTrail](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/) 提供了 Athena 中的用户、角色或 AWS 服务 的操作记录。它捕获来自 Athena 控制台的调用以及以事件方式对 Athena API 操作的代码调用。您可以确定向 Athena 发出的请求、从中发出请求的 IP 地址、发出请求的用户、发出请求的时间以及其他详细信息。有关更多信息，请参阅 [使用 AWS CloudTrail 记录 Amazon Athena API 调用](monitor-with-cloudtrail.md)。

  您还可以使用 Athena 查询 CloudTrail 日志文件，不仅可用于 Athena，也可用于其他 AWS 服务。有关更多信息，请参阅 [查询 AWS CloudTrail日志](cloudtrail-logs.md)。
+ **通过 CloudTrail 和 Amazon Quick 监控 Athena 使用情况**：[Amazon Quick](https://aws.amazon.com/quicksight/) 是一项完全托管式、基于云的商业智能服务，可让您创建组织可以从任何设备访问的交互式控制面板。有关使用 CloudTrail 和 Amazon Quick 监控 Athena 使用情况的解决方案的示例，请参阅 AWS 大数据博客文章 [How Realtor.com monitors Amazon Athena usage with AWS CloudTrail and Quick](https://aws.amazon.com/blogs/big-data/analyzing-amazon-athena-usage-by-teams-within-a-real-estate-company/)。
+ **将 EventBridge 与 Athena 一起使用** - Amazon EventBridge 提供近乎实时的系统事件流，这些系统事件描述 AWS 资源中的更改。EventBridge 注意到在他们发生时显示的操作更改、响应这些操作更改并在必要时采取纠正措施，方式是发送消息以响应环境、激活函数、进行更改并捕获状态信息。尽最大努力发出事件。有关更多信息，请参阅 *Amazon EventBridge 用户指南*中的 [Amazon EventBridge 入门](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-get-started.html)。
+ **使用工作组分隔用户、团队、应用程序或工作负载，并设置查询限制和控制查询成本** – 您可以在 Amazon CloudWatch 中查看与查询相关的指标、通过配置扫描的数据量限制来控制查询成本、创建阈值以及在突破这些阈值时触发操作，例如 Amazon SNS 告警。有关更多信息，请参阅 [使用工作组控制查询访问和成本](workgroups-manage-queries-control-costs.md)。使用资源级别的 IAM 权限来控制对特定工作组的访问。有关更多信息，请参阅[使用 IAM 策略控制工作组访问](workgroups-iam-policy.md)和[使用 CloudWatch 和 EventBridge 监控查询并控制成本](workgroups-control-limits.md)。

**Topics**
+ [使用 AWS CloudTrail 记录 Amazon Athena API 调用](monitor-with-cloudtrail.md)

# 使用 AWS CloudTrail 记录 Amazon Athena API 调用
<a name="monitor-with-cloudtrail"></a>

Athena 已与 AWS CloudTrail 集成，后者是一项提供 Athena 中由用户、角色或 AWS 服务 所采取操作的记录的服务。

CloudTrail 将 Athena 的API 调用作为事件捕获。捕获的调用包括来自 Athena 控制台的调用和对 Athena API 操作的代码调用。如果您创建跟踪，则可以使 CloudTrail 事件持续传送到 Amazon S3 存储桶（包括 Athena 的事件）。如果您不配置跟踪，则仍可在 CloudTrail 控制台中的**事件历史记录**中查看最新事件。

使用 CloudTrail 收集的信息，您可以确定向 Athena 发出了什么请求、发出请求的 IP 地址、何人发出的请求、请求的发出时间以及其他详细信息。

要了解有关 CloudTrail 的更多信息，请参阅《[AWS CloudTrail 用户指南](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/)》。

您可以使用 Athena 从 Athena 本身和其他 AWS 服务 查询 CloudTrail 日志文件。有关更多信息，请参阅 [查询 AWS CloudTrail日志](cloudtrail-logs.md)、[Hive JSON SerDe](hive-json-serde.md)，以及 AWS 大数据博客文章[将 CTAS 语句与 Amazon Athena 结合使用以降低成本并提高性能](https://aws.amazon.com/blogs/big-data/using-ctas-statements-with-amazon-athena-to-reduce-cost-and-improve-performance/)，其中介绍了使用 CloudTrail 提供对 Athena 使用情况的洞察。

## 关于 CloudTrail 中的 Athena 信息
<a name="athena-info-in-cloudtrail"></a>

在您创建 Amazon Web Services 账户时，将在该账户上启用 CloudTrail。当 Athena 中发生活动时，该活动将记录在 CloudTrail 事件中，并与其他 AWS 服务事件一同保存在 **Event history**（事件历史记录）中。您可以在 Amazon Web Services 账户中查看、搜索和下载最新事件。有关更多信息，请参阅[使用 CloudTrail 事件历史记录查看事件](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/view-cloudtrail-events.html)。

要持续记录 Amazon Web Services 账户中的事件（包括 Athena 的事件），请创建跟踪记录。通过*跟踪*，CloudTrail 可将日志文件传送至 Amazon S3 存储桶。默认情况下，在控制台中创建跟踪记录时，此跟踪记录应用于所有 AWS 区域。此跟踪记录在 AWS 分区中记录所有区域中的事件，并将日志文件传送至您指定的 Amazon S3 存储桶。此外，您可以配置其他 AWS 服务，进一步分析在 CloudTrail 日志中收集的事件数据并采取行动。有关更多信息，请参阅下列内容：
+ [创建跟踪记录概述](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-create-and-update-a-trail.html)
+ [CloudTrail 支持的服务和集成](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-aws-service-specific-topics.html#cloudtrail-aws-service-specific-topics-integrations)
+ [为 CloudTrail 配置 Amazon SNS 通知](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/getting_notifications_top_level.html)
+ [从多个区域接收 CloudTrail 日志文件](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/receive-cloudtrail-log-files-from-multiple-regions.html)和[从多个账户接收 CloudTrail 日志文件](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-receive-logs-from-multiple-accounts.html)

所有 Athena 操作均由 CloudTrail 记录下来并记载到 [Amazon Athena API 参考](https://docs.aws.amazon.com/athena/latest/APIReference/)中。例如，对 [StartQueryExecution](https://docs.aws.amazon.com/athena/latest/APIReference/API_StartQueryExecution.html) 和 [GetQueryResults](https://docs.aws.amazon.com/athena/latest/APIReference/API_StartQueryExecution.html) 操作的调用会在 CloudTrail 日志文件中生成条目。

每个事件或日志条目都包含有关生成请求的人员信息。身份信息可帮助您确定以下内容：
+ 请求是使用根用户凭证还是 AWS Identity and Access Management（IAM）用户凭证发出的。
+ 请求是使用角色还是联合用户的临时安全凭证发出的。
+ 请求是否由其他 AWS 服务 发出。

有关更多信息，请参阅 [CloudTrail userIdentity 元素](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-event-reference-user-identity.html)。

## 了解 Athena 日志文件条目
<a name="understanding-ate-log-file-entries"></a>

跟踪记录是一种配置，可用于将事件作为日志文件传送到您指定的 Simple Storage Service（Amazon S3）存储桶。CloudTrail 日志文件包含一个或多个记录条目。一个事件表示来自任何源的一个请求，包括有关所请求的操作、操作的日期和时间、请求参数等方面的信息。CloudTrail 日志文件不是公有 API 调用的有序堆栈跟踪，因此它们不会按任何特定顺序显示。

**注意**  
为防止意外泄露敏感信息，`StartQueryExecution` 和 `CreateNamedQuery` 日志中的 `queryString` 条目的值均为 `***OMITTED***`。这是设计使然。要访问实际查询字符串，可以使用 Athena [GetQueryExecution](https://docs.aws.amazon.com/athena/latest/APIReference/API_GetQueryExecution.html) API 并传入 CloudTrail 日志中的 `responseElements.queryExecutionId` 值。

以下示例展示了 CloudTrail 日志条目：
+  [StartQueryExecution (成功)](#startqueryexecution-successful) 
+  [StartQueryExecution (失败)](#startqueryexecution-failed) 
+  [CreateNamedQuery](#createnamedquery) 

### StartQueryExecution（成功）
<a name="startqueryexecution-successful"></a>

```
{
 "eventVersion":"1.05",
 "userIdentity":{
    "type":"IAMUser",
    "principalId":"EXAMPLE_PRINCIPAL_ID",
    "arn":"arn:aws:iam::123456789012:user/johndoe",
    "accountId":"123456789012",
    "accessKeyId":"EXAMPLE_KEY_ID",
    "userName":"johndoe"
 },
 "eventTime":"2017-05-04T00:23:55Z",
 "eventSource":"athena.amazonaws.com",
 "eventName":"StartQueryExecution",
 "awsRegion":"us-east-1",
 "sourceIPAddress":"77.88.999.69",
 "userAgent":"aws-internal/3",
 "requestParameters":{
    "clientRequestToken":"16bc6e70-f972-4260-b18a-db1b623cb35c",
    "resultConfiguration":{
       "outputLocation":"s3://amzn-s3-demo-bucket/test/"
    },
    "queryString":"***OMITTED***"
 },
 "responseElements":{
    "queryExecutionId":"b621c254-74e0-48e3-9630-78ed857782f9"
 },
 "requestID":"f5039b01-305f-11e7-b146-c3fc56a7dc7a",
 "eventID":"c97cf8c8-6112-467a-8777-53bb38f83fd5",
 "eventType":"AwsApiCall",
 "recipientAccountId":"123456789012"
}
```

### StartQueryExecution（失败）
<a name="startqueryexecution-failed"></a>

```
{
 "eventVersion":"1.05",
 "userIdentity":{
  "type":"IAMUser",
  "principalId":"EXAMPLE_PRINCIPAL_ID",
  "arn":"arn:aws:iam::123456789012:user/johndoe",
  "accountId":"123456789012",
  "accessKeyId":"EXAMPLE_KEY_ID",
  "userName":"johndoe"
  },
 "eventTime":"2017-05-04T00:21:57Z",
 "eventSource":"athena.amazonaws.com",
 "eventName":"StartQueryExecution",
 "awsRegion":"us-east-1",
 "sourceIPAddress":"77.88.999.69",
 "userAgent":"aws-internal/3",
 "errorCode":"InvalidRequestException",
 "errorMessage":"Invalid result configuration. Should specify either output location or result configuration",
 "requestParameters":{
  "clientRequestToken":"ca0e965f-d6d8-4277-8257-814a57f57446",
  "queryString":"***OMITTED***"
  },
 "responseElements":null,
 "requestID":"aefbc057-305f-11e7-9f39-bbc56d5d161e",
 "eventID":"6e1fc69b-d076-477e-8dec-024ee51488c4",
 "eventType":"AwsApiCall",
 "recipientAccountId":"123456789012"
}
```

### CreateNamedQuery
<a name="createnamedquery"></a>

```
{
  "eventVersion":"1.05",
  "userIdentity":{
     "type":"IAMUser",
     "principalId":"EXAMPLE_PRINCIPAL_ID",
     "arn":"arn:aws:iam::123456789012:user/johndoe",
     "accountId":"123456789012",
     "accessKeyId":"EXAMPLE_KEY_ID",
     "userName":"johndoe"
  },
  "eventTime":"2017-05-16T22:00:58Z",
  "eventSource":"athena.amazonaws.com",
  "eventName":"CreateNamedQuery",
  "awsRegion":"us-west-2",
  "sourceIPAddress":"77.88.999.69",
  "userAgent":"aws-cli/1.11.85 Python/2.7.10 Darwin/16.6.0 botocore/1.5.48",
  "requestParameters":{
     "name":"johndoetest",
     "queryString":"***OMITTED***",
     "database":"default",
     "clientRequestToken":"fc1ad880-69ee-4df0-bb0f-1770d9a539b1"
     },
  "responseElements":{
     "namedQueryId":"cdd0fe29-4787-4263-9188-a9c8db29f2d6"
     },
  "requestID":"2487dd96-3a83-11e7-8f67-c9de5ac76512",
  "eventID":"15e3d3b5-6c3b-4c7c-bc0b-36a8dd95227b",
  "eventType":"AwsApiCall",
  "recipientAccountId":"123456789012"
},
```

# 的合规性验证
<a name="security-compliance-validation"></a>

作为多个 AWS 合规性计划的一部分，第三方审计员将评测安全性和合规性。这些合规性计划包括 SOC、PCI、FedRAMP 等。

有关特定合规性计划范围内的 AWS 服务 的列表，请参阅[合规性计划范围内的 AWS 服务](https://aws.amazon.com/compliance/services-in-scope/)。有关一般信息，请参阅 [AWS 合规性计划](https://aws.amazon.com/compliance/programs/)。

您可以使用 AWS Artifact 下载第三方审计报告。有关更多信息，请参阅[在 AWS Artifact 中下载报告](https://docs.aws.amazon.com/artifact/latest/ug/downloading-documents.html)。

您使用时的合规性责任取决于您数据的敏感度、贵公司的合规性目标以及适用的法律法规。AWS 提供以下资源来帮助满足合规性：
+ [安全性与合规性快速入门指南](https://aws.amazon.com/quickstart/?awsf.quickstart-homepage-filter=categories%23security-identity-compliance) – 这些部署指南讨论了架构注意事项，并提供了在 AWS 上部署基于安全性和合规性的基准环境的步骤。
+ [Amazon Web Services 上的 HIPAA 安全性和合规性架构设计](https://docs.aws.amazon.com/whitepapers/latest/architecting-hipaa-security-and-compliance-on-aws/architecting-hipaa-security-and-compliance-on-aws.html)– 此白皮书介绍了公司如何使用 AWS 创建符合 HIPAA 标准的应用程序。
+ [AWS 合规性资源](https://aws.amazon.com/compliance/resources/)：此业务手册和指南集合可能适用于您的行业和位置。
+ [AWS Config](https://docs.aws.amazon.com/config/latest/developerguide/evaluate-config.html)：此 AWS 服务 评估您的资源配置对内部实践、行业指南和法规的遵循情况。
+ [AWS Security Hub CSPM](https://docs.aws.amazon.com/securityhub/latest/userguide/what-is-securityhub.html)：此 AWS 服务 提供了 AWS 中安全状态的全面视图，可帮助您检查是否符合安全行业标准和最佳实践规范。

# Athena 中的故障恢复能力
<a name="security-resilience"></a>

AWS 全球基础设施围绕 AWS 区域 和可用区构建。AWS 区域 提供多个在物理上独立且隔离的可用区，这些可用区通过延迟低、吞吐量高且冗余性高的网络连接在一起。利用可用区，您可以设计和操作在可用区之间无中断地自动实现失效转移的应用程序和数据库。与传统的单个或多个数据中心基础设施相比，可用区具有更高的可用性、容错性和可扩展性。

有关 AWS 区域 和可用区的更多信息，请参阅 [AWS 全球基础设施](https://aws.amazon.com/about-aws/global-infrastructure/)。

除了 AWS 全球基础设施之外，它还提供了多种功能，以帮助支持您的数据弹性和备份需求。

Athena 是无服务器服务，因此无需设置或管理基础设施。Athena 具备高可用性，并使用多个可用区中的计算资源来运行查询，如果特定可用区无法访问，则会自动适当地路由查询。Athena 使用 Amazon S3 作为其底层数据存储，使您的数据具备高可用性和持久性。Amazon S3 提供持久性基础设施来存储重要数据，并且旨在为对象提供 99.999999999% 的持久性。您的数据以冗余方式存储在多个设施中，以及各个设施内的多个设备上。

# Athena 中的基础设施安全性
<a name="security-infrastructure"></a>

作为一项托管式服务，受 AWS 全球网络安全保护。有关 AWS 安全服务以及 AWS 如何保护基础结构的信息，请参阅 [AWS 云安全](https://aws.amazon.com/security/)。要按照基础结构安全最佳实践设计您的 AWS 环境，请参阅《安全性支柱 AWS Well‐Architected Framework》中的 [基础结构保护](https://docs.aws.amazon.com/wellarchitected/latest/security-pillar/infrastructure-protection.html)**。

您可以使用 AWS 发布的 API 调用通过网络进行访问。客户端必须支持以下内容：
+ 传输层安全性协议（TLS）。我们要求使用 TLS 1.2，建议使用 TLS 1.3。
+ 具有完全向前保密（PFS）的密码套件，例如 DHE（临时 Diffie-Hellman）或 ECDHE（临时椭圆曲线 Diffie-Hellman）。大多数现代系统（如 Java 7 及更高版本）都支持这些模式。

使用 IAM 策略来限制对 Athena 操作的访问。每当您使用 IAM 策略时，请确保遵循 IAM 最佳实践。有关更多信息，请参阅《[IAM 用户指南](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)》中的 *IAM 安全最佳实践*。

Athena [托管策略](security-iam-awsmanpol.md)易于使用，并且随着服务的发展而自动用必需操作进行更新。利用客户托管策略和内联策略，您可以通过在策略中指定更精细的 Athena 操作来微调策略。授予对数据的 Amazon S3 位置的适当访问权限。有关详细信息和如何授予 Amazon S3 访问权限的方案，请参阅 [Amazon Simple Storage Service 开发人员指南](https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-walkthroughs-managing-access.html) 中的 *示例演练：管理访问权限*。有关更多信息以及允许哪些 Amazon S3 操作的示例，请参阅[跨账户访问](cross-account-permissions.md)中的示例存储桶策略。

**Topics**
+ [使用接口 VPC 端点连接到 Amazon Athena](interface-vpc-endpoint.md)

# 使用接口 VPC 端点连接到 Amazon Athena
<a name="interface-vpc-endpoint"></a>

您可以通过使用 [接口 VPC 端点（AWS PrivateLink）](https://docs.aws.amazon.com/vpc/latest/userguide/vpce-interface.html)和虚拟私有云（VPC）中的 [AWS Glue VPC 端点](https://docs.aws.amazon.com/glue/latest/dg/vpc-endpoint.html) 来提高 VPC 的安全性。接口 VPC 端点允许您控制可以从 VPC 内部连接到的目的地，从而提高安全性。每个 VPC 端点都由您的 VPC 子网中一个或多个使用私有 IP 地址的[弹性网络接口](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html)（ENI）代表。

接口 VPC 端点将您的 VPC 直接连接到 Athena，而无需互联网网关、NAT 设备、VPN 连接或 Direct Connect 连接。VPC 中的实例不需要公有 IP 地址便可与 Athena API 进行通信。

要通过您的 VPC 使用 Athena，您必须从位于 VPC 中的实例进行连接，或者使用 Amazon 虚拟专用网络 (VPN) 或 Direct Connect 将您的专用网络连接到 VPC。有关 Amazon VPN 的信息，请参阅《Amazon Virtual Private Cloud 用户指南》**中的 [VPN 连接](https://docs.aws.amazon.com/vpc/latest/userguide/vpn-connections.html)。有关 AWS Direct Connect 连接的更多信息，请参阅在《Direct Connect 用户指南》**中的[创建连接](https://docs.aws.amazon.com/directconnect/latest/UserGuide/create-connection.html)。

在 [Amazon VPC](https://docs.aws.amazon.com/general/latest/gr/rande.html#vpc_region) 和 [Athena](https://docs.aws.amazon.com/general/latest/gr/rande.html#athena) 均可用的所有 AWS 区域 中，Athena 支持 VPC 端点。

您可以创建接口 VPC 端点以使用 AWS 管理控制台 控制台或 AWS Command Line Interface（AWS CLI）命令连接到 Athena。有关更多信息，请参阅[创建接口端点](https://docs.aws.amazon.com/vpc/latest/userguide/vpce-interface.html#create-interface-endpoint)。

在创建接口 VPC 端点后，如果您为端点启用[私有 DNS](https://docs.aws.amazon.com/vpc/latest/userguide/vpce-interface.html#vpce-private-dns) 主机名，则默认 Athena 端点（https://athena.*Region*.amazonaws.com）将解析为您的 VPC 端点。

如果您尚未启用私有 DNS 主机名，则 Amazon VPC 将提供一个您可以使用的 DNS 端点名称，格式如下：

```
VPC_Endpoint_ID.athena.Region.vpce.amazonaws.com
```

有关更多信息，请参阅《Amazon VPC 用户指南》**中的[接口 VPC 端点（AWS PrivateLink）](https://docs.aws.amazon.com/vpc/latest/userguide/vpce-interface.html)。

Athena 支持调用您的 VPC 中的所有 [API 操作](https://docs.aws.amazon.com/athena/latest/APIReference/API_Operations.html)。

## 为 Athena 创建 VPC 端点策略
<a name="api-private-link-policy"></a>

您可以为 Athena 的 Amazon VPC 端点创建一个策略，指定如下限制：
+ **主体** – 可执行操作的主体。
+ **操作** – 可执行的操作。
+ **资源** – 可对其执行操作的资源。
+ **仅限可信身份** - 使用 `aws:PrincipalOrgId` 条件将访问权限限制为仅限 AWS 组织中的凭证。这可以帮助防止主体非预期访问。
+ **仅限可信资源** - 使用 `aws:ResourceOrgId` 条件可防止访问非预期资源。
+ **仅限可信身份和资源** - 为 VPC 端点创建组合策略，以帮助防止访问非预期主体和资源。

有关更多信息，请参阅《*Amazon VPC 用户指南*》中的[使用 VPC 端点控制对服务的访问](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-endpoints-access.html)以及 AWS 白皮书*在 AWS 上构建数据边界*中的[附录 2 - VPC 端点策略示例](https://docs.aws.amazon.com/whitepapers/latest/building-a-data-perimeter-on-aws/appendix-2-vpc-endpoint-policy-examples.html)。

**Example – VPC 端点策略**  
以下示例允许按组织身份向组织资源发出请求，并允许 AWS 服务主体发出请求。    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowRequestsByOrgsIdentitiesToOrgsResources",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "*",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:PrincipalOrgID": "my-org-id",
                    "aws:ResourceOrgID": "my-org-id"
                }
            }
        },
        {
            "Sid": "AllowRequestsByAWSServicePrincipals",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "*",
            "Resource": "*",
            "Condition": {
                "Bool": {
                    "aws:PrincipalIsAWSService": "true"
                }
            }
        }
    ]
}
```

每当您使用 IAM 策略时，请确保遵循 IAM 最佳实践。有关更多信息，请参阅《[IAM 用户指南](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)》中的 *IAM 安全最佳实践*。

## 关于共享子网中的 VPC 端点
<a name="interface-vpc-endpoint-shared-subnets"></a>

您无法在与您共享的子网中创建、描述、修改或删除 VPC 端点。但是，您可以在与您共享的子网中使用 VPC 端点。有关 VPC 共享的信息，请参阅《*Amazon VPC 用户指南*》中的[与其他账户共享 VPC](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-sharing.html)。

# Athena 中的配置和漏洞分析
<a name="security-vulnerability-management"></a>

Athena 采用无服务器架构，因此没有基础设施要设置或管理。AWS 负责处理来宾操作系统 (OS) 和数据库补丁、防火墙配置和灾难恢复等基本安全工作。这些流程已通过相应第三方审核和认证。有关更多详细信息，请参阅以下 AWS 资源：
+  [责任共担模式](https://aws.amazon.com/compliance/shared-responsibility-model/) 
+ [安全性、身份和合规性最佳实践](https://aws.amazon.com/architecture/security-identity-compliance/)

# 使用 Athena 查询注册到 AWS Lake Formation 的数据
<a name="security-athena-lake-formation"></a>

通过使用 [AWS Lake Formation](https://docs.aws.amazon.com/lake-formation/latest/dg/what-is-lake-formation.html)，您可以在使用 Athena 查询来读取存储在 Amazon S3 中的数据或通过联合数据来源访问的数据时定义和实施数据库、表和列级访问策略。Lake Formation 为存储在 Amazon S3 或联合数据目录中的数据提供授权和治理层。您可以使用 Lake Formation 中的权限层次结构来授予或撤消读取数据目录对象（如数据库、表和列）的权限。Lake Formation 简化了权限管理，并允许您为数据实现精细的访问控制 (FGAC)。

您可以使用 Athena 同时查询向 Lake Formation 注册的数据和未向 Lake Formation 注册的数据。

使用 Athena 从注册到 Lake Formation 的 Amazon S3 位置或数据目录查询源数据时，将适用 Lake Formation 权限。当您创建指向已注册的 Amazon S3 数据位置或数据目录的数据库和表时，也将适用 Lake Formation 权限。

写入对象时不适用 Lake Formation 权限，查询未注册到 Lake Formation 的数据或元数据时也不适用 Lake Formation 权限。对于未注册到 Lake Formation 的源数据和元数据，访问权限由 IAM 权限策略和 AWS Glue 操作决定。Amazon S3 中的 Athena 查询结果位置无法向 Lake Formation 注册，而 Amazon S3 的 IAM 权限策略将控制访问权限。此外，Lake Formation 权限不适用于 Athena 查询历史记录。您可以使用 Athena 工作组来控制对查询历史记录的访问。

有关 Lake Formation 的更多信息，请参阅 [Lake Formation 常见问题](https://aws.amazon.com/lake-formation/faqs/)和《[AWS Lake Formation 开发人员指南](https://docs.aws.amazon.com/lake-formation/latest/dg/what-is-lake-formation.html)》。

## 将 Lake Formation 权限应用于现有数据库和表
<a name="lf-athena-apply-lf-permissions-to-existing-databases-and-tables"></a>

如果您是首次使用 Athena 并且使用 Lake Formation 配置查询数据的访问权限，则无需配置 IAM 策略来确保用户可以读取数据和创建元数据。您可以使用 Lake Formation 管理权限。

不需要向 Lake Formation 注册数据和更新 IAM 权限策略。如果数据未注册到 Lake Formation，则具有相应权限的 Athena 用户可以继续查询未注册到 Lake Formation 的数据。

如果现有的 Athena 用户需要查询未注册到 Lake Formation 的 Amazon S3 数据，则可以更新 Amazon S3 以及 AWS Glue Data Catalog（如果适用）的 IAM 权限，以便您可以使用 Lake Formation 权限来集中管理用户访问权限。要获得读取 Amazon S3 数据位置的权限，您可以更新基于资源和基于身份的策略以修改 Amazon S3 权限。要访问元数据，如果您使用 AWS Glue 配置了用于精细访问控制的资源级策略，则可以改用 Lake Formation 权限来管理访问。

有关更多信息，请参阅《AWS Lake Formation 开发人员指南**》中的 [在 AWS Glue Data Catalog 中配置对数据库和表的访问](fine-grained-access-to-glue-resources.md) 和 [升级 AWS Lake Formation 模型的 AWS Glue 数据权限](https://docs.aws.amazon.com/lake-formation/latest/dg/upgrade-glue-lake-formation.html)。

**Topics**
+ [将 Lake Formation 权限应用于现有数据库和表](#lf-athena-apply-lf-permissions-to-existing-databases-and-tables)
+ [数据访问的工作原理](lf-athena-access.md)
+ [注意事项和限制](lf-athena-limitations.md)
+ [跨账户访问](lf-athena-limitations-cross-account.md)
+ [管理用户权限](lf-athena-user-permissions.md)
+ [使用 Lake Formation 和 JDBC 或 ODBC 进行联合访问](security-athena-lake-formation-jdbc.md)

# Athena 如何访问已向 Lake Formation 注册的数据
<a name="lf-athena-access"></a>

本节中描述的访问工作流仅在您对已注册到 Lake Formation 的 Amazon S3 位置、数据目录和元数据对象运行 Athena 查询时才适用。有关更多信息，请参阅《AWS Lake Formation 开发人员指南**》中的 [注册数据湖](https://docs.aws.amazon.com/lake-formation/latest/dg/register-data-lake.html)。除注册数据之外，Lake Formation 管理员还可应用以下 Lake Formation 权限：授予或撤消对数据目录、AWS Glue Data Catalog 或 Amazon S3 中数据位置中元数据的访问权限。有关更多信息，请参阅《AWS Lake Formation 开发人员指南**》中的 [元数据和数据的安全性和访问控制](https://docs.aws.amazon.com/lake-formation/latest/dg/security-data-access.html#security-data-access-permissions)。

每次 Athena 主体（用户、组或角色）对使用 Lake Formation 注册的数据运行查询时，Lake Formation 都会验证该主体是否对数据库、表和数据来源位置（视具体情况）具有查询所需的适合 Lake Formation 权限。如果委托人具有访问权限，Lake Formation 会将临时凭据*发送*给 Athena，然后查询运行。

下图展示了凭证发送过程如何在 Athena 中在逐个查询的基础上，对注册到 Lake Formation 的 Amazon S3 位置或数据目录中的表进行假设的 `SELECT` 查询：

![\[用于 Athena 表上查询的凭证售卖工作流。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/lake-formation-athena-security.png)


1. 委托人在 Athena 中运行 `SELECT` 查询。

1. Athena 分析查询并检查 Lake Formation 权限，以查看该委托人是否已被授予对该表和表列的访问权限。

1. 如果委托人具有访问权限，Athena 将从 Lake Formation 请求凭证。如果委托人*没有*访问权限，则 Athena 发出拒绝访问错误。

1. Lake Formation 将向 Athena 颁发凭证，以便在从 Amazon S3 或该目录读取数据时使用，同时还将发送允许列的列表。

1. Athena 将使用 Lake Formation 临时凭证从 Amazon S3 或该目录查询数据。在查询完成后，Athena 将丢弃凭证。

# 查询注册到 Lake Formation 的数据时的注意事项和限制
<a name="lf-athena-limitations"></a>

使用 Athena 查询在 Lake Formation 中注册的数据时，请考虑以下因素。有关更多信息，请参阅《AWS Lake Formation 开发人员指南**》中的 [AWS Lake Formation 的已知问题](https://docs.aws.amazon.com/lake-formation/latest/dg/limitations.html)。

**Topics**
+ [在某些情况下，对列没有数据权限的用户可以看到列元数据](#lf-athena-limitations-column-metadata)
+ [使用 Lake Formation 权限查看视图](#lf-athena-limitations-permissions-to-views)
+ [Iceberg DDL 支持](#lf-athena-limitations-iceberg-ddl-operations)
+ [Lake Formation 精细访问控制和 Athena 工作组](#lf-athena-limitations-fine-grained-access-control)
+ [Amazon S3 中的 Athena 查询结果位置未向 Lake Formation 注册](#lf-athena-limitations-query-results-location)
+ [使用 Athena 工作组限制对查询历史记录的访问](#lf-athena-limitations-use-workgroups-to-limit-access-to-query-history)
+ [无法在 Athena 中查询向 Lake Formation 注册的 CSE-KMS Amazon S3](#lf-athena-limitations-cse-kms)
+ [向 Lake Formation 注册的分区数据位置必须在表子目录中](#lf-athena-limitations-partioned-data-locations)
+ [Create Table As Select (CTAS) 查询需要 Amazon S3 写入权限](#lf-athena-limitations-ctas-queries)
+ [默认数据库需要 DESCRIBE 权限](#lf-athena-limitations-describe-default)

## 在使用 Avro 和自定义 SerDe 的某些情况下，未经授权的用户可以看到列元数据
<a name="lf-athena-limitations-column-metadata"></a>

Lake Formation 列级授权可防止用户访问自己没有 Lake Formation 权限的列中的数据。但是，在某些情况下，用户可以访问描述表中所有列的元数据，包括他们对其中的数据没有权限的列。

当列元数据使用 Avro 存储格式或使用自定义序列化程序/反序列化程序（SerDe）存储在表的表属性中（其中表架构在表属性中与 SerDe 定义一起定义）时，会发生这种情况。在将 Athena 与 Lake Formation 一起使用时，我们建议您查看向 Lake Formation 注册的表属性的内容，并在可能的情况下限制存储在表属性中的信息，以防止任何敏感元数据对用户可见。

## 了解 Lake Formation 和视图
<a name="lf-athena-limitations-permissions-to-views"></a>

对于向 Lake Formation 注册的数据，Athena 用户只有在对 `VIEW` 所基于的表、列和源 Amazon S3 数据位置具有 Lake Formation 权限时，才能创建 `VIEW`。在 Athena 中创建 `VIEW` 后，Lake Formation 权限可以应用于 `VIEW`。列级权限不可用于 `VIEW`。对 `VIEW` 具有 Lake Formation 权限但对视图所基于的表和列没有权限的用户无法使用 `VIEW` 查询数据。但是，具有此权限组合的用户可以使用语句（如 `DESCRIBE VIEW`、`SHOW CREATE VIEW` 和 `SHOW COLUMNS`）查看 `VIEW` 元数据。因此，请确保对于每个 `VIEW` 的 Lake Formation 权限与基础表权限一致。表中定义的单元格筛选条件不适用于该表的 `VIEW`。资源链接名称必须与原始账户中的资源名称相同。在跨账户设置中使用视图时还存在其他限制。有关跨账户设置共享视图的权限的更多信息，请参阅 [配置跨账户数据目录存取](lf-athena-limitations-cross-account.md)。

## Iceberg DDL 支持
<a name="lf-athena-limitations-iceberg-ddl-operations"></a>

Athena 目前不支持在位置注册为 Lake Formation 的 Iceberg 表上进行 DDL 操作。尝试对其中一个 Iceberg 表运行 DDL 查询可能会返回 Amazon S3 访问被拒绝错误，或可能因查询超时而失败。对 Iceberg 表进行 DDL 操作要求用户具有直接访问 Amazon S3 的 Iceberg 表位置的访问。

## Lake Formation 精细访问控制和 Athena 工作组
<a name="lf-athena-limitations-fine-grained-access-control"></a>

同一 Athena 工作组中的用户可以查看由 Lake Formation 精细访问控制配置为可供工作组访问的数据。有关在 Lake Formation 中使用精细访问控制的更多信息，请参阅 *AWS 大数据博客*中的[使用 AWS Lake Formation 管理精细访问控制](https://aws.amazon.com/blogs/big-data/manage-fine-grained-access-control-using-aws-lake-formation/)。

## Amazon S3 中的 Athena 查询结果位置未向 Lake Formation 注册
<a name="lf-athena-limitations-query-results-location"></a>

Amazon S3 中针对 Athena 的查询结果位置无法向 Lake Formation 注册。Lake Formation 权限不限制对这些位置的访问。除非您限制访问，否则，如果 Athena 用户拥有数据的 Lake Formation 权限，则可以访问查询结果文件和元数据。为避免这种情况，我们建议您使用工作组指定查询结果的位置，并将工作组成员身份与 Lake Formation 权限对齐。然后，您可以使用 IAM 权限策略限制对查询结果位置的访问。有关查询结果的更多信息，请参阅 [使用查询结果和最近查询](querying.md)。

## 使用 Athena 工作组限制对查询历史记录的访问
<a name="lf-athena-limitations-use-workgroups-to-limit-access-to-query-history"></a>

Athena 查询历史记录显示已保存查询和完整查询字符串的列表。除非您使用工作组来分离查询历史记录的访问权限，否则即使 Athena 用户没有获得授权查询 Lake Formation 中的数据，仍可以查看对该数据运行的查询字符串，包括列名、选择条件等。我们建议您使用工作组来分隔查询历史记录，并将 Athena 工作组成员资格与 Lake Formation 权限对齐以限制访问。有关更多信息，请参阅 [使用工作组控制查询访问和成本](workgroups-manage-queries-control-costs.md)。

## 查询注册到 Lake Formation 的 CSE\$1KMS 加密表
<a name="lf-athena-limitations-cse-kms"></a>

Athena 无法查询 Apache Iceberg 等具有以下特征的 Open Table Format（OTF）表：
+ 这些表以向 Lake Formation 注册的 Amazon S3 数据位置为基础。
+ 使用客户端加密（CSE）对 Amazon S3 中的对象进行加密。
+ 使用 AWS KMS 客户托管密钥 (`CSE_KMS`) 进行加密。

要查询使用 `CSE_KMS` 密钥加密的非 OTF 表，请将以下块添加到用于 CSE 加密的 AWS KMS 密钥策略中。*<KMS\$1KEY\$1ARN>* 是加密数据的 AWS KMS 密钥的 ARN。*<IAM-ROLE-ARN>* 是在 Lake Formation 中注册 Amazon S3 位置的 IAM 角色的 ARN。

```
{
    "Sid": "Allow use of the key",
    "Effect": "Allow",
    "Principal": {
        "AWS": "*"
    },
    "Action": "kms:Decrypt",
    "Resource": "<KMS-KEY-ARN>",
    "Condition": {
        "ArnLike": {
            "aws:PrincipalArn": "<IAM-ROLE-ARN>"
        }
    }
}
```

## 向 Lake Formation 注册的分区数据位置必须在表子目录中
<a name="lf-athena-limitations-partioned-data-locations"></a>

向 Lake Formation 注册的分区表必须在作为 Amazon S3 中该表的子目录的目录中具有分区数据。例如，可以向 Lake Formation 注册并使用 Athena 查询具有位置 `s3://amzn-s3-demo-bucket/mytable` 和分区 `s3://amzn-s3-demo-bucket/mytable/dt=2019-07-11`、`s3://amzn-s3-demo-bucket/mytable/dt=2019-07-12` 等的表。另一方面，无法向 Lake Formation 注册具有位置 `s3://amzn-s3-demo-bucket/mytable` 和分区（位于`s3://amzn-s3-demo-bucket/dt=2019-07-11`、`s3://amzn-s3-demo-bucket/dt=2019-07-12` 等等中）的表。因为这样的分区不是 `s3://amzn-s3-demo-bucket/mytable` 的子目录，它们也无法从 Athena 读取。

## Create Table As Select (CTAS) 查询需要 Amazon S3 写入权限
<a name="lf-athena-limitations-ctas-queries"></a>

Create Table As Statements (CTAS) 需要对表的 Amazon S3 位置进行写入访问。要对向 Lake Formation 注册的数据运行 CTAS 查询，Athena 用户除了具有相应的 Lake Formation 权限以读取数据位置以外，还必须具有写入表 Amazon S3 位置的 IAM 权限。有关更多信息，请参阅 [从查询结果创建表（CTAS）](ctas.md)。

## 默认数据库需要 DESCRIBE 权限
<a name="lf-athena-limitations-describe-default"></a>

`default` 数据库需要具有 Lake Formation `DESCRIBE` 权限，以便 Lake Formation 可以查看它。以下示例 AWS CLI 命令对 AWS 账户 `111122223333` 中的用户 `datalake_user1` 授予对 `default` 数据库的 `DESCRIBE` 权限。

```
aws lakeformation grant-permissions --principal DataLakePrincipalIdentifier=arn:aws:iam::111122223333:user/datalake_user1 --permissions "DESCRIBE" --resource '{ "Database": {"Name":"default"}}
```

有关更多信息，请参阅《*AWS Lake Formation 开发人员指南*》中的 [DESCRIBE](https://docs.aws.amazon.com/lake-formation/latest/dg/lf-permissions-reference.html#perm-describe)。

# 配置跨账户数据目录存取
<a name="lf-athena-limitations-cross-account"></a>

要访问其他账户中的数据目录，您可以使用 Athena 的跨账户 AWS Glue 功能或在 Lake Formation 中设置跨账户访问。

## 选项 A：在 Athena 中配置跨账户数据目录存取
<a name="lf-athena-limitations-cross-account-glue"></a>

您可以使用 Athena 的跨账户 AWS Glue 目录功能在您的账户中注册目录。此功能仅在 Athena 引擎版本 2 及更高版本中可用，并且仅限于在账户之间使用同一区域时。有关更多信息，请参阅 [从其他账户注册数据目录](data-sources-glue-cross-account.md)。

如果要共享的数据目录在 AWS Glue 中配置了资源策略，必须更新该策略才能允许对 AWS Resource Access Manager 的访问，并向账户 B 授予使用账户 A 的数据目录的权限。

有关更多信息，请参阅 [配置 AWS Glue 数据目录的跨账户存取](security-iam-cross-account-glue-catalog-access.md)。

## 选项 B：在 Lake Formation 中配置跨账户存取
<a name="lf-athena-limitations-cross-account-glue-lf-xacct"></a>

AWS Lake Formation 允许您使用单个账户管理中央 Data Catalog。您可以使用此功能来对 Data Catalog 元数据和底层数据实施[跨账户访问](https://docs.aws.amazon.com/lake-formation/latest/dg/access-control-cross-account.html)。例如，拥有者账户可以授予另一个（收件人）账户对于表的 `SELECT` 权限。

要在 Athena 查询编辑器中显示共享数据库或表，您可以在 Lake Formation 中[创建资源链接](https://docs.aws.amazon.com/lake-formation/latest/dg/resource-links-about.html)来访问共享数据库或表。当 Lake Formation 中的收件人账户查询拥有者的表格时，[CloudTrail](https://docs.aws.amazon.com/lake-formation/latest/dg/cross-account-logging.html) 会将数据访问事件添加到收件人账户和拥有者账户的日志中。

对于共享视图，请记住以下几点：
+ 查询在目标资源链接上运行，而不是在源表或视图上运行，然后系统会将输出共享到目标账户。
+ 仅共享视图是不够的。创建视图涉及的所有表都必须是跨账户共享的一部分。
+ 基于共享资源创建的资源链接的名称必须与拥有者账户中资源的名称相匹配。如果名称不匹配，系统会显示与以下内容类似的错误消息：Failed analyzing stored view 'awsdatacatalog.*my-lf-resource-link*.*my-lf-view*': line 3:3: Schema *schema\$1name* does not exist（分析存储的视图“awsdatacatalog.my-lf-resource-link.my-lf-view”时失败：line 3:3: 架构 schema\$1name 不存在）。

有关 Lake Formation 中跨账户访问的更多信息，请参阅《AWS Lake Formation 开发人员指南》中的以下资源：**

 [跨账户访问](https://docs.aws.amazon.com/lake-formation/latest/dg/access-control-cross-account.html) 

 [资源链接在 Lake Formation 中的工作原理](https://docs.aws.amazon.com/lake-formation/latest/dg/resource-links-about.html) 

 [跨账户 CloudTrail 日志记录](https://docs.aws.amazon.com/lake-formation/latest/dg/cross-account-logging.html) 

# 管理 Lake Formation 和 Athena 用户权限
<a name="lf-athena-user-permissions"></a>

Lake Formation 发送凭证以查询注册到 Lake Formation 的 Amazon S3 数据存储或联合目录。如果您以前过 IAM 策略来允许或拒绝读取目录或 Amazon S3 中数据位置的权限，则可以改用 Lake Formation 权限。但是，其他 IAM 权限仍然是必需的。

每当您使用 IAM policy 时，请确保遵循 IAM 最佳实践。有关更多信息，请参阅《[IAM 用户指南](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)》中的 *IAM 安全最佳实践*。

以下各节总结了使用 Athena 查询在 Lake Formation 中注册的数据所需的权限。有关更多信息，请参阅《*AWS Lake Formation 开发人员指南*》中的 [AWS Lake Formation 的安全性](https://docs.aws.amazon.com/lake-formation/latest/dg/security.html)。

**Topics**
+ [Lake Formation 和 Athena 基于身份的权限](#lf-athena-user-permissions-identity-based)
+ [Amazon S3 对 Athena 查询结果位置的权限](#lf-athena-user-permissions-query-results-locations)
+ [针对查询历史记录的 Athena 工作组成员身份](#lf-athena-user-permissions-workgroup-memberships-query-history)
+ [Lake Formation 对数据的权限](#lf-athena-user-permissions-data)
+ [写入 Amazon S3 位置的 IAM 权限](#lf-athena-user-permissions-s3-write)
+ [针对加密数据、元数据和 Athena 查询结果的权限](#lf-athena-user-permissions-encrypted)
+ [外部账户中针对 Amazon S3 存储桶的基于资源的权限（可选）](#lf-athena-user-permissions-s3-cross-account)

## Lake Formation 和 Athena 基于身份的权限
<a name="lf-athena-user-permissions-identity-based"></a>

使用 Athena 查询向 Lake Formation 注册的数据的任何人都必须有一个 IAM 权限策略，此权限允许执行 `lakeformation:GetDataAccess` 操作。[AWS 托管策略：AmazonAthenaFullAccess](security-iam-awsmanpol.md#amazonathenafullaccess-managed-policy) 允许此操作。如果您使用内联策略，请务必更新权限策略以允许此操作。

在 Lake Formation 中，*数据湖管理员*拥有的权限包括创建元数据对象（如数据库和表）、向其他用户授予 Lake Formation 权限以及注册新的 Amazon S3 位置或数据目录等。要注册新位置，需要具有 Lake Formation 的服务相关角色的权限。有关更多信息，请参阅《AWS Lake Formation 开发人员指南**》中的 [创建数据湖管理员](https://docs.aws.amazon.com/lake-formation/latest/dg/getting-started-setup.html#create-data-lake-admin)和 [Lake Formation 的服务相关角色权限](https://docs.aws.amazon.com/lake-formation/latest/dg/service-linked-roles.html#service-linked-role-permissions)。

Lake Formation 用户可以根据数据湖管理员向其授予的 Lake Formation 权限，使用 Athena 查询数据库、表、表列和基础 Amazon S3 数据存储或目录。用户不能创建数据库或表，也不能向 Lake Formation 注册新的 Amazon S3 位置。有关更多信息，请参阅《AWS Lake Formation 开发人员指南**》中的 [创建数据湖用户](https://docs.aws.amazon.com/lake-formation/latest/dg/cloudtrail-tut-create-lf-user.html)。

在 Athena 中，基于身份的权限策略（包括 Athena 工作组的权限策略）仍然控制对 Amazon Web Services 账户用户的 Athena 操作的访问。此外，可以通过 Athena 驱动程序提供的基于 SAML 的身份验证来提供联合访问。有关更多信息，请参阅 [使用工作组控制查询访问和成本](workgroups-manage-queries-control-costs.md)、[使用 IAM 策略控制工作组访问](workgroups-iam-policy.md) 和 [启用对 Athena API 的联合访问](access-federation-saml.md)。

有关更多信息，请参阅《AWS Lake Formation 开发人员指南**》中的 [授予 Lake Formation 权限](https://docs.aws.amazon.com/lake-formation/latest/dg/lake-formation-permissions.html)。

## Amazon S3 对 Athena 查询结果位置的权限
<a name="lf-athena-user-permissions-query-results-locations"></a>

Amazon S3 中针对 Athena 的查询结果位置无法向 Lake Formation 注册。Lake Formation 权限不限制对这些位置的访问。除非您限制访问，否则，如果 Athena 用户拥有数据的 Lake Formation 权限，则可以访问查询结果文件和元数据。为避免这种情况，我们建议您使用工作组指定查询结果的位置，并将工作组成员身份与 Lake Formation 权限对齐。然后，您可以使用 IAM 权限策略限制对查询结果位置的访问。有关查询结果的更多信息，请参阅 [使用查询结果和最近查询](querying.md)。

## 针对查询历史记录的 Athena 工作组成员身份
<a name="lf-athena-user-permissions-workgroup-memberships-query-history"></a>

Athena 查询历史记录显示已保存查询和完整查询字符串的列表。除非您使用工作组来分离查询历史记录的访问权限，否则即使 Athena 用户没有获得授权查询 Lake Formation 中的数据，仍可以查看对该数据运行的查询字符串，包括列名、选择条件等。我们建议您使用工作组来分隔查询历史记录，并将 Athena 工作组成员资格与 Lake Formation 权限对齐以限制访问。有关更多信息，请参阅 [使用工作组控制查询访问和成本](workgroups-manage-queries-control-costs.md)。

## Lake Formation 对数据的权限
<a name="lf-athena-user-permissions-data"></a>

除了使用 Lake Formation 的基准权限之外，Athena 用户还必须具有访问他们查询的资源的 Lake Formation 权限。这些权限由 Lake Formation 管理员授予和管理。有关更多信息，请参阅《AWS Lake Formation 开发人员指南**》中的 [元数据和数据的安全性和访问控制](https://docs.aws.amazon.com/lake-formation/latest/dg/security-data-access.html#security-data-access-permissions)。

## 写入 Amazon S3 位置的 IAM 权限
<a name="lf-athena-user-permissions-s3-write"></a>

Amazon S3 的 Lake Formation 权限不包括写入 Amazon S3 的权限。Create Table As Statements (CTAS) 需要对表的 Amazon S3 位置进行写入访问。要对向 Lake Formation 注册的数据运行 CTAS 查询，Athena 用户除了具有相应的 Lake Formation 权限以读取数据位置以外，还必须具有写入表 Amazon S3 位置的 IAM 权限。有关更多信息，请参阅 [从查询结果创建表（CTAS）](ctas.md)。

## 针对加密数据、元数据和 Athena 查询结果的权限
<a name="lf-athena-user-permissions-encrypted"></a>

可以对注册到 Lake Formation 的 Amazon S3 中的基础源数据和目录中的元数据进行加密。在使用 Athena 查询向 Lake Formation 注册的数据时，Athena 处理查询结果加密的方式没有变化。有关更多信息，请参阅 [加密在 Amazon S3 中存储的 Athena 查询结果](encrypting-query-results-stored-in-s3.md)。
+ **加密源数据** – 支持对 Amazon S3 数据位置源数据进行加密。查询已向 Lake Formation 注册的加密 Amazon S3 位置的 Athena 用户需要加密和解密数据的权限。有关要求的更多信息，请参阅 [支持的 Amazon S3 加密选项](encryption.md#encryption-options-S3-and-Athena) 和 [Amazon S3 中加密数据的权限](encryption.md#permissions-for-encrypting-and-decrypting-data)。
+ **加密元数据** – 支持对 AWS Glue Data Catalog 中的元数据进行加密。对于使用 Athena 的委托人，基于身份的策略必须允许对用于加密元数据的密钥执行 `"kms:GenerateDataKey"`、`"kms:Decrypt"` 和 `"kms:Encrypt"` 操作。有关更多信息，请参阅《AWS Glue 开发人员指南》中的*加密数据目录*和[从 Athena 配置对 AWS Glue Data Catalog 中加密元数据的访问](access-encrypted-data-glue-data-catalog.md)。

## 外部账户中针对 Amazon S3 存储桶的基于资源的权限（可选）
<a name="lf-athena-user-permissions-s3-cross-account"></a>

要查询其他账户中的 Amazon S3 数据位置，基于资源的 IAM policy（存储桶策略）必须允许访问该位置。有关更多信息，请参阅 [在 Athena 中配置对 Amazon S3 存储桶的跨账户存取](cross-account-permissions.md)。

有关访问其他账户中目录的信息，请参阅[选项 A：在 Athena 中配置跨账户数据目录存取](lf-athena-limitations-cross-account.md#lf-athena-limitations-cross-account-glue)。

# 将 Lake Formation 和 JDBC 或 ODBC 驱动程序用于对 Athena 进行联合访问
<a name="security-athena-lake-formation-jdbc"></a>

Athena JDBC 和 ODBC 驱动程序使用 Okta 和 Microsoft Active Directory 联合访问服务 (AD FS) 身份提供程序支持对 Athena 进行基于 SAML 2.0 的联合访问。通过将 Amazon Athena 与 AWS Lake Formation 整合，您可以使用公司凭证对 Athena 启用基于 SAML 的身份验证。借助 Lake Formation 和 AWS Identity and Access Management (IAM)，您可以保持对 SAML 用户可用数据的精细列级访问控制。使用 Athena JDBC 和 ODBC 驱动程序，联合访问可用于工具或编程访问。

要使用 Athena 来访问由 Lake Formation 控制的数据来源，您需要通过配置身份提供者（IdP）和 AWS Identity and Access Management（IAM）角色来启用基于 SAML 2.0 的联合访问。有关详细步骤，请参阅[教程：使用 Lake Formation 和 JDBC 配置 Okta 用户对 Athena 的联合访问](security-athena-lake-formation-jdbc-okta-tutorial.md)。

## 先决条件
<a name="security-athena-lake-formation-jdbc-prerequisites"></a>

要使用 Amazon Athena 和 Lake Formation 进行联合访问，您必须满足以下要求：
+ 使用现有基于 SAML 的身份提供程序（例如 Okta 或 Microsoft Active Directory Federation Services (AD FS)）管理您的公司身份。
+ 您可以将 AWS Glue Data Catalog 用作元数据存储。
+ 在 Lake Formation 中定义和管理权限以访问 AWS Glue Data Catalog 中的数据库、表和列。有关更多信息，请参见[AWS Lake Formation 开发人员指南](https://docs.aws.amazon.com/lake-formation/latest/dg/)。
+ 您可以使用版本 2.0.14 或更高版本的 [Athena JDBC 驱动程序](https://docs.aws.amazon.com/athena/latest/ug/connect-with-jdbc.html)或版本 1.1.3 或更高版本的 [Athena ODBC 驱动程序](connect-with-odbc.md)。

## 注意事项和限制
<a name="security-athena-lake-formation-jdbc-considerations-and-limitations"></a>

使用 Athena JDBC 或 ODBC 驱动程序和 Lake Formation 配置对 Athena 的联合访问时，请记住以下几点：
+ 目前，Athena JDBC 驱动程序和 ODBC 驱动程序支持 Okta、Microsoft Active Directory Federation Services（AD FS）和 Azure AD 身份提供者。尽管 Athena JDBC 驱动程序具有可扩展为使用其他身份提供程序的通用 SAML 类，但对允许其他身份提供程序 (IdPs) 与 Athena 一起使用的自定义扩展的支持可能会受到限制。
+ 使用 JDBC 和 ODBC 驱动程序的联合访问与 IAM Identity Center 可信身份传播功能不兼容。
+ 目前，您无法使用 Athena 控制台配置对 IdP 和 SAML 与 Athena 一起使用的支持。要配置此支持，请使用第三方身份提供程序、Lake Formation 和 IAM 管理控制台以及 JDBC 或 ODBC 驱动程序客户端。
+ 您应该了解 [SAML 2.0 规范](https://www.oasis-open.org/standards#samlv2.0)以及它如何与身份提供程序相互合作，然后才嗯呢该配置您的身份提供程序和 SAML 用于 Lake Formation 和 Athena。
+ SAML 提供商和 Athena JDBC 和 ODBC 驱动程序由第三方提供，因此通过 AWS 对与其使用有关问题的支持可能是有限的。

**Topics**
+ [先决条件](#security-athena-lake-formation-jdbc-prerequisites)
+ [注意事项和限制](#security-athena-lake-formation-jdbc-considerations-and-limitations)
+ [教程：使用 Lake Formation 和 JDBC 配置 Okta 用户对 Athena 的联合访问](security-athena-lake-formation-jdbc-okta-tutorial.md)

# 教程：使用 Lake Formation 和 JDBC 配置 Okta 用户对 Athena 的联合访问
<a name="security-athena-lake-formation-jdbc-okta-tutorial"></a>

本教程介绍如何配置 Okta、AWS Lake Formation、AWS Identity and Access Management 权限和 Athena JDBC 驱动程序，以启用基于 SAML 的 Athena 联合使用。Lake Formation 为基于 SAML 的用户提供了对 Athena 中可用数据的细粒度访问控制。为设置此配置，本教程使用 Okta 开发人员控制台、AWS IAM 和 Lake Formation 控制台以及 SQL Workbench/J 工具。
<a name="security-athena-lake-formation-jdbc-okta-tutorial-prerequisites"></a>
**先决条件**  
本教程假定您已执行以下操作：
+ 已创建 Amazon Web Services 账户。要创建账户，请访问 [Amazon Web Services 主页](https://aws.amazon.com/)。
+ 在 Amazon S3 中为 Athena [设置查询结果位置](query-results-specify-location.md)。
+ 向 Lake Formation [注册了 Amazon S3 数据存储桶位置](https://docs.aws.amazon.com/lake-formation/latest/dg/register-data-lake.html)。
+ 在 [AWS Glue Data Catalog](https://docs.aws.amazon.com/glue/latest/dg/define-database.html) 中定义了指向您在 Amazon S3 中数据的[数据库](https://docs.aws.amazon.com/glue/latest/dg/tables-described.html)和[表](https://docs.aws.amazon.com/glue/latest/dg/what-is-glue.html)。
  + 如果尚未定义表，则对您要访问的数据[运行 AWS Glue 爬网程序](https://docs.aws.amazon.com/glue/latest/dg/add-crawler.html)或者[使用 Athena 定义数据库和一个或多个表](work-with-data.md)。
  + 本教程使用基于 [AWS 开放数据存储库](https://registry.opendata.aws/)中的[纽约出租车旅行数据集](https://registry.opendata.aws/nyc-tlc-trip-records-pds/)。本教程使用数据库名称 `tripdb` 和表名称 `nyctaxi`。

**Topics**
+ [步骤 1：创建 Okta 账户](#security-athena-lake-formation-jdbc-okta-tutorial-step-1-create-an-okta-account)
+ [步骤 2：向 Okta 添加用户和组](#security-athena-lake-formation-jdbc-okta-tutorial-step-2-set-up-an-okta-application-for-saml-authentication)
+ [步骤 3：设置 Okta 应用程序以进行 SAML 身份验证](#security-athena-lake-formation-jdbc-okta-tutorial-step-3-set-up-an-okta-application-for-saml-authentication)
+ [步骤 4：创建 AWS SAML 身份提供程序和 Lake Formation 访问 IAM 角色](#security-athena-lake-formation-jdbc-okta-tutorial-step-4-create-an-aws-saml-identity-provider-and-lake-formation-access-IAM-role)
+ [步骤 5：将 IAM 角色和 SAML 身份提供程序添加到 Okta 应用程序](#security-athena-lake-formation-jdbc-okta-tutorial-step-5-update-the-okta-application-with-the-aws-role-and-saml-identity-provider)
+ [步骤 6：通过 AWS Lake Formation 授予用户和组权限](#security-athena-lake-formation-jdbc-okta-tutorial-step-6-grant-permissions-through-aws-lake-formation)
+ [步骤 7：验证通过 Athena JDBC 客户端的访问](#security-athena-lake-formation-jdbc-okta-tutorial-step-7-verify-access-through-athena-jdbc-client)
+ [结论](#security-athena-lake-formation-jdbc-okta-tutorial-conclusion)
+ [相关资源](#security-athena-lake-formation-jdbc-okta-tutorial-related-resources)

## 步骤 1：创建 Okta 账户
<a name="security-athena-lake-formation-jdbc-okta-tutorial-step-1-create-an-okta-account"></a>

本教程使用 Okta 作为基于 SAML 的身份提供程序。如果您还没有 Okta 账户，您可以创建一个免费的账户。需要 Okta 账户，以便您可以创建 Okta 应用程序进行 SAML 身份验证。

**创建 Okta 账户**

1. 要使用 Okta，请导航到 [Okta 开发人员注册页](https://developer.okta.com/signup/)并创建一个免费的 Okta 试用账户。开发人员版服务是免费的，不超过 Okta 在 [developer.okta.com/pricing](https://developer.okta.com/pricing) 总指定的限制。

1. 当您收到激活电子邮件时，请激活您的账户。

   Okta 域名将被分配给您。保存域名以供参考。稍后，您可以在连接到 Athena 的 JDBC 字符串中使用域名 (*<okta-idp-domain>*）。

## 步骤 2：向 Okta 添加用户和组
<a name="security-athena-lake-formation-jdbc-okta-tutorial-step-2-set-up-an-okta-application-for-saml-authentication"></a>

在此步骤中，您使用 Okta 控制台执行以下任务：
+ 创建两个 Okta 用户。
+ 创建两个 Okta 组。
+ 向每个 Okta 组添加一个 Okta 用户。

**要向 Okta 添加用户**

1. 激活 Okta 账户后，以管理用户身份登录到指定的 Okta 域。

1. 在左侧导航窗格中，选择 **Directory**（目录），然后选择 **People**（人员）。

1. 选择 **Add Person**（添加人员）添加将通过 JDBC 驱动程序访问 Athena 的新用户。  
![\[选择 Add Person（添加人员）。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-3.png)

1. 在 **Add Person**（添加人员）对话框中，输入所需信息。
   + 对于 **First name**（名字）和 **Last name**（姓氏），输入值。本教程使用 *athena-okta-user*。
   + 输入 **Username**（用户名）和 **Primary email**（主电子邮件）。本教程使用 *athena-okta-user@anycompany.com*。
   + 对于 **Password**（密码），选择 **Set by admin**（由管理员设置），然后提供密码。本教程清除了 **User must change password on the first login**（用户必须在首次登录时更改密码）的选项；您的安全要求可能会有所不同。  
![\[将用户添加到 Okta 应用程序。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-4.png)

1. 选择 **Save and Add Another**（保存并添加另一个）。

1. 输入其他用户的信息。此示例添加了业务分析师用户 *athena-ba-user@anycompany.com*。  
![\[将用户添加到 Okta 应用程序。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-4a.png)

1. 选择**保存**。

在以下过程中，您可以通过添 “业务分析师”组和“开发人员”组来通过 Athena JDBC 驱动程序提供两个 Okta 组的访问权限。

**要添加 Okta 组**

1. 在 Okta 导航窗格中，选择 **Directory**（目录），然后选择 **Groups**（组）。

1. 在 **Groups**（组）页面上，选择 **Add Group**（添加组）。  
![\[选择添加组。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-4c.png)

1. 在 **Add Group**（添加组）对话框中，输入所需信息。
   + 对于 **Name**（名称），输入 *lf-business-analyst*。
   + 对于 **Group Description**（组描述），输入*业务分析人员*。  
![\[添加 Okta 组。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-4d.png)

1. 选择**添加组**。

1. 在 **Groups**（组）页面上，再次选择 **Add Group**（添加组）。这一次，您将输入开发人员组的信息。

1. 输入所需的信息。
   + 对于 **Name**（名称），输入 *lf-developer*。
   + 对于 **Group Description**（组描述），输入*开发人员*。

1. 选择**添加组**。

现在，您有两个用户和两个组，您已准备就绪，可以向每个组添加一个用户。

**要将用户添加到组**

1. 在 ** Groups**（组）页面上，选择您刚创建的 **lf-developer** 组。您需要将您作为开发人员创建的 Okta 用户之一添加到此组中。  
![\[选择 lf-developer。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-4f.png)

1. 选择 **Manage People**（管理人员）。  
![\[选择 Manage People（管理人员）。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-4g.png)

1. 从 **Not Members**（非成员）列表中，选择 **athena-okta-user**。  
![\[选择要添加到成员列表的用户。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-4h.png)

   用户的条目将从左侧的**非成员**列表移动到右侧的**成员**列表。  
![\[添加到 Okta 组的 Okta 用户。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-4i.png)

1. 选择**保存**。

1. 选择 **Back to Group**（返回组），或选择 **Directory**（目录），然后选择 **Groups**（组）。

1. 选择 **lf-business-analyst** 组。

1. 选择 **Manage People**（管理人员）。

1. 向 **lf-business-analyst** 组的 **Members**（成员）列表添加 **athena-ba-user**，然后选择 **Save**（保存）。

1. 选择 **Back to Group**（返回组），或选择 **Directory**（目录），**Groups**（组）。

   **Groups**（组）页面现在显示每个组都有一个 Okta 用户。  
![\[Okta 控制台中的每个 Okta 组都添加了一个用户。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-4j.png)

## 步骤 3：设置 Okta 应用程序以进行 SAML 身份验证
<a name="security-athena-lake-formation-jdbc-okta-tutorial-step-3-set-up-an-okta-application-for-saml-authentication"></a>

在此步骤中，您使用 Okta 开发人员控制台执行以下任务：
+ 添加 SAML 应用程序以便与 AWS 结合使用。
+ 将应用程序分配给 Okta 用户。
+ 将应用程序分配给 Okta 组。
+ 下载生成的身份提供程序元数据，以便日后与 AWS 结合使用。

**要添加用于 SAML 身份验证的应用程序**

1. 在 Okta 导航窗格中，选择 **Applications**（应用程序）、**Applications**（应用程序），以便您可以为对 Athena 进行的 SAML 身份验证配置 Okta 应用程序。

1. 单击 **Browse App Catalog**（浏览应用程序目录）。

1. 在搜索框中，输入 **Redshift**。

1. 选择 **Amazon Web Services Redshift**。本教程中的 Okta 应用程序使用 Amazon Redshift 的现有 SAML 集成。  
![\[选择 Amazon Web Services Redshift。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-7.png)

1. 在 **Amazon Web Services Redshift** 页面上，选择 **Add**（添加）为 Amazon Redshift 创建基于 SAML 的应用程序。  
![\[选择 Add（添加）创建基于 SAML 的应用程序。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-8.png)

1. 对于 **Application label**（应用程序标签），输入 `Athena-LakeFormation-Okta`，然后选择 **Done**（完成）。  
![\[输入 Oktak 应用程序的名称。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-9.png)

现在您已创建 Okta 应用程序，可以将其分配给您创建的用户和组。

**要将应用程序分配给用户和组**

1. 在 **Applications**（应用程序）页面上，选择 **Athena-LakeFormation-Okta** 应用程序。

1. 在 **Assignments**（分配）选项卡上，选择 **Assign**（分配）、**Assign to People**（分配给人员）。  
![\[选择 Assign（分配）、Assign to People（分配给人员）。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-10.png)

1. 在 **Assign Athena-LakeFormation-Okta to People**（将 Assign Athena-LakeFormation-Okta 分配给人员）对话框中，找到您之前创建的 **athena-okta-user** 用户。

1. 选择 **Assign**（分配）将用户分配给应用程序。  
![\[选择 Assign (分配)。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-11.png)

1. 选择 **Save and Go Back**（保存并返回）。

1. 选择**完成**。

1. 在 **Athena-LakeFormation-Okta** 应用程序的 **Assignments**（分配）选项卡上，选择 **Assign**（分配）、**Assign to Groups**（分配给组）。

1. 对于 **lf-business-analyst**，选择 **Assign**（分配）以将 **Athena-LakeFormation-Okta** 应用程序分配到 **lf-business-analyst** 组，然后选择**Done**（完成）。  
![\[将 Okta 应用程序分配给 Okta 用户组。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-12b.png)

   该组将显示在应用程序的组列表中。  
![\[Okta 应用程序分配给 Okta 组。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-12c.png)

现在，您已准备就绪，可以下载身份提供程序应用程序元数据，以用于 AWS。

**下载应用程序元数据**

1. 选择 Okta 应用程序的 **Sign On**（登录）选项卡，然后右键单击 **Identity Provider metadata**（身份提供程序元数据）。  
![\[右键单击 Identity Provider metadata（身份提供程序元数据）。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-13.png)

1. 选择 **Save Link As**（将链接另存为）以将身份提供程序元数据（XML 格式）保存到文件中。给它一个您可以识别的名称（例如，`Athena-LakeFormation-idp-metadata.xml`）。  
![\[保存身份提供程序元数据。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-14.png)

## 步骤 4：创建 AWS SAML 身份提供程序和 Lake Formation 访问 IAM 角色
<a name="security-athena-lake-formation-jdbc-okta-tutorial-step-4-create-an-aws-saml-identity-provider-and-lake-formation-access-IAM-role"></a>

在此步骤中，您将使用 AWS Identity and Access Management (IAM) 控制台执行以下任务：
+ 为 AWS 创建身份提供程序。
+ 创建针对 Lake Formation 访问的 IAM 角色。
+ 将 AmazonAthenaFullAccess 托管策略添加到角色。
+ 向角色添加 Lake Formation 策略和 AWS Glue。
+ 向角色添加 Athena 查询结果的策略。

**要创建 AWS SAML 身份提供程序**

1. 以 **Amazon Web Services 账户管理员**身份登录 **Amazon Web Services 账户****控制台**，并导航到 **IAM** 控制台（[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)）。

1. 在导航窗格中，选择 **Identity providers**（身份提供程序），然后单击 **Add provider**（添加提供程序）。

1. 在 **Define provider**（定义提供程序）页面上，输入以下信息：
   + 对于 **Provider type**（提供程序类型），选择 **SAML**。
   + 对于 **Provider name**（提供程序名称），输入 `AthenaLakeFormationOkta`。
   + 对于 **Metadata document**（元数据文档），请使用 **Select file**（选择文件）选项上载您下载的身份提供程序 (IdP) 元数据 XML 文件。

1. 选择 **Add provider**（添加提供程序）。

接下来，您将为 AWS Lake Formation 访问创建 IAM 角色。您将两个内联策略添加到角色。其中一个策略提供访问 Lake Formation 和 AWS Glue API 的权限。另一个策略提供了对 Amazon S3 中 Athena 和 Athena 查询结果位置的访问权限。

**要为 AWS Lake Formation 创建 IAM 角色以进行访问**

1. 在 IAM 控制台的导航窗格中，选择 **Roles**（角色），然后选择 **Create role**（创建角色）。

1. 在 **Create role**（创建角色）页面上，执行以下步骤：  
![\[将 IAM 角色配置为使用 SAML 2.0。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-20.png)

   1. 对于 **Select type of trusted entity**（选择受信任实体的类型），选择 **SAML 2.0 Federation**。

   1. 对于 **SAML provider**（SAML 提供程序），选择 **AthenaLakeFormationOkta**。

   1. 对于 **SAML provider**（SAML 提供程序），选择选项 **Allow programmatic and AWS 管理控制台 access**（允许编程和控制台访问）。

   1. 选择**下一步: 权限**。

1. 在 **Attach Permissions policies**（附加权限策略）页面，对于 **Filter pilicies**（筛选策略），输入 **Athena**。

1. 选择名为 **AmazonAthenaFullAccess** 的托管式策略，然后选择 **Next: Tags **（下一步：标签）。  
![\[将 AmazonAthenaFullAccess 托管策略附加到 IAM 角色。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-21.png)

1. 在 **Add tags**（添加标签）页面上，选择 **Next: Review**（下一步：审核）。

1. 在 **Review**（审核）页面上，对于 **Role name**（角色名称），输入角色的名称（例如，*Athena-LakeFormation-OktaRole*），然后选择 **Create role**（创建角色）。  
![\[输入 IAM 角色的名称。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-22.png)

接下来，您可以添加允许访问 Lake Formation、AWS Glue API 和 Amazon S3 中 Athena 查询结果的内联策略。

每当您使用 IAM 策略时，请确保遵循 IAM 最佳实践。有关更多信息，请参阅《[IAM 用户指南](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)》中的 *IAM 安全最佳实践*。

**要将内联策略添加到 Lake Formation 和 AWS Glue 的角色**

1. 从 IAM 控制台中的角色列表中，选择新创建的 `Athena-LakeFormation-OktaRole`。

1. 在角色的 **Summary**（摘要）页面上，在 **Permissions**（权限）选项卡上，选择 **Add inline policy**（添加内联策略）。

1. 在**创建策略**页面上，选择 **JSON**。

1. 添加一个内联策略，如下所示，该策略可提供访问 Lake Formation 和 AWS Glue API 的权限。

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": {
           "Effect": "Allow",
           "Action": [
               "lakeformation:GetDataAccess",
               "glue:GetTable",
               "glue:GetTables",
               "glue:GetDatabase",
               "glue:GetDatabases",
               "glue:CreateDatabase",
               "glue:GetUserDefinedFunction",
               "glue:GetUserDefinedFunctions"
           ],
           "Resource": "*"
       }
   }
   ```

------

1. 选择**查看策略**。

1. 对于** Name**（名称），请为策略输入名称（例如，**LakeFormationGlueInlinePolicy**）。

1. 选择**创建策略**。

**要将内联策略添加到 Athena 查询结果位置的角色**

1. 在 `Athena-LakeFormation-OktaRole` 角色的 **Summary**（摘要）页面上，在 **Permissions**（权限）选项卡上，选择 **Add inline policy**（添加内联策略）。

1. 在**创建策略**页面上，选择 **JSON**。

1. 添加允许角色访问 Athena 查询结果位置的内联策略，如下所示。将示例中的 *<athena-query-results-bucket>* 占位符替换为您的 Amazon S3 存储桶的名称。

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "AthenaQueryResultsPermissionsForS3",
               "Effect": "Allow",
               "Action": [
                   "s3:ListBucket",
                   "s3:PutObject",
                   "s3:GetObject"
               ],
               "Resource": [
                   "arn:aws:s3:::<athena-query-results-bucket>",
                   "arn:aws:s3:::<athena-query-results-bucket>/*"
               ]
           }
       ]
   }
   ```

------

1. 选择**查看策略**。

1. 对于** Name**（名称），请为策略输入名称（例如，**AthenaQueryResultsInlinePolicy**）。

1. 选择**创建策略**。

接下来，您需要复制 Lake Formation 访问角色的 ARN 和您创建的 SAML 提供程序的 ARN。当您在本教程的下一部分中配置 Okta SAML 应用程序时，这些都是必需的。

**要复制角色 ARN 和 SAML 身份提供程序 ARN**

1. 在 IAM 控制台中，在 `Athena-LakeFormation-OktaRole` 角色的 **Summary**（摘要）页面中，选择 **Role ARN**（角色 ARN）旁的 **Copy to clipboard**（复制到剪贴板）图标。ARN 有以下格式：

   ```
   arn:aws:iam::<account-id>:role/Athena-LakeFormation-OktaRole
   ```

1. 安全地保存完整 ARN 以供日后参考。

1. 在 IAM 控制台导航窗格中，选择 **Identity providers**（身份提供程序）。

1. 选择 **AthenaLakeFormationOkta** 提供程序。

1. 在 **Summary**（摘要）页面上，选择 **Provider ARN**（提供程序 ARN）旁的 **Copy to clipboard**（复制到剪贴板）图标。ARN 应如下所示：

   ```
   arn:aws:iam::<account-id>:saml-provider/AthenaLakeFormationOkta
   ```

1. 安全地保存完整 ARN 以供日后参考。

## 步骤 5：将 IAM 角色和 SAML 身份提供程序添加到 Okta 应用程序
<a name="security-athena-lake-formation-jdbc-okta-tutorial-step-5-update-the-okta-application-with-the-aws-role-and-saml-identity-provider"></a>

在此步骤中，您将返回到 Okta 开发人员控制台并执行以下任务：
+ 将用户和组 Lake Formation URL 属性添加到 Okta 应用程序。
+ 将身份提供程序的 ARN 和 IAM 角色的 ARN 添加到 Okta 应用程序。
+ 复制 Okta 应用程序 ID。连接到 Athena 的 JDBC 配置文件中需要 Okta 应用程序 ID。

**将用户和组 Lake Formation URL 属性添加到 Okta 应用程序**

1. 登录 Okta 开发人员控制台。

1. 在 **Applications**（应用程序）选项卡上，然后选择 `Athena-LakeFormation-Okta` 应用程序。

1. 选择应用程序的 **Sign On**（登录）选项卡，然后选择 **Edit**（编辑）。  
![\[编辑 Okta 应用程序。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-24.png)

1. 选择 **Attributes (optional)**（属性（可选））来扩展它。  
![\[将用户 Lake Formation URL 属性添加到 Okta 应用程序。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-25.png)

1. 对于 **Attribute Statements (optional)**（属性语句（可选）），添加以下属性：
   + 对于**名称**，请输入 **https://lakeformation.amazon.com/SAML/Attributes/Username**。
   + 对于 **Value**（值），输入 **user.login**

1. 在 **Group Attribute Statements (optional)**（组属性语句（可选））项下，添加以下属性：
   + 对于**名称**，请输入 **https://lakeformation.amazon.com/SAML/Attributes/Groups**。
   + 对于 **Name format**（名称格式），输入 **Basic**
   + 对于 **Filter**（筛选条件），选择 **Matches regex**（匹配正则表达式），然后在筛选条件框中输入 **.\$1**。  
![\[将组 Lake Formation URL 属性添加到 Okta 应用程序。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-25a.png)

1. 向下滚动到 **Advanced Sign-On Settings**（高级登录设置）部分，您将在其中将身份提供程序和 IAM 角色 ARN 添加到 Okta 应用程序。

**将身份提供程序和 IAM 角色的 ARN 添加到 Okta 应用程序**

1. 对于 **Idp ARN 和角色 ARN**，输入 AWS 身份提供程序 ARN 和角色 ARN，作为逗号分隔的值，格式为 *<saml-arn>*、*<role-arn>*。完成字符串应与以下内容类似：

   ```
   arn:aws:iam::<account-id>:saml-provider/AthenaLakeFormationOkta,arn:aws:iam::<account-id>:role/Athena-LakeFormation-OktaRole
   ```  
![\[在 Okta 应用程序中输入身份提供程序 ARN 和 IAM 角色 ARN。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-26.png)

1. 选择**保存**。

接下来，您将复制 Okta 应用程序 ID。您稍后需要在连接到 Athena 的 JDBC 字符串中用到它。

**要查找和复制 Okta 应用程序 ID**

1. 选择 Okta 应用程序的 **General**（常规）选项卡。  
![\[选择 Okta 应用程序的 General（常规）选项卡。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-27.png)

1. 向下滚动到 **App Embed Link**（应用程序嵌入链接）部分。

1. 从 **Embed Link**（嵌入链接），复制并安全地保存 URL 的 Okta 应用程序 ID 部分。Okta 应用程序 ID 是 `amazon_aws_redshift/` 之后的 URL 部分内容，但在下一个正斜杠之前。例如，如果 URL 包含 `amazon_aws_redshift/aaa/bbb`，则应用程序 ID 为 `aaa`。  
![\[复制 Okta 应用程序的 ID。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-28.png)

**注意**  
嵌入的链接不能用于直接登录 Athena 控制台以查看数据库。仅当您使用 JDBC 或 ODBC 驱动程序向 Athena 提交查询时，才认可 SAML 用户和组的 Lake Formation 权限。要查看数据库，可以使用 SQL WorkBench/J 工具，该工具会使用 JDBC 驱动程序连接到 Athena。有关 SQL Workbench/J 工具的介绍详见[步骤 7：验证通过 Athena JDBC 客户端的访问](#security-athena-lake-formation-jdbc-okta-tutorial-step-7-verify-access-through-athena-jdbc-client)。

## 步骤 6：通过 AWS Lake Formation 授予用户和组权限
<a name="security-athena-lake-formation-jdbc-okta-tutorial-step-6-grant-permissions-through-aws-lake-formation"></a>

在此步骤中，您可以使用 Lake Formation 控制台向 SAML 用户和组授予对表的权限。您可以执行以下任务：
+ 指定 Okta SAML 用户以及关联用户的 ARN 对表的权限。
+ 指定 Okta SAML 组以及关联组的 ARN 对表的权限。
+ 验证您授予的权限。

**为 Okta 用户授予 Lake Formation 中的权限**

1. 以数据湖管理员身份登录 AWS 管理控制台。

1. 打开 Lake Formation 控制台，网址为 [https://console.aws.amazon.com/lakeformation/](https://console.aws.amazon.com/lakeformation/)。

1. 从导航窗格中，选择 **Tables**（表），然后选择您要授予权限的表。本教程使用 `tripdb` 数据库中的 `nyctaxi` 表。  
![\[选择要授予权限的表。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-29.png)

1. 从 **Actions**（操作）中，选择 **Grant**（授权）。  
![\[选择 Grant（授权）。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-30.png)

1. 在 **Grant permissions**（授予权限）对话框中，输入以下信息：

   1. 在 **SAML 和 Amazon Quick 用户和组**下，按以下格式输入 Okta SAML 用户 ARN：

      ```
      arn:aws:iam::<account-id>:saml-provider/AthenaLakeFormationOkta:user/<athena-okta-user>@<anycompany.com>       
      ```

   1. 对于 **Columns**（列），对于 **Choose filter type**（选择筛选条件类型），然后选择 **Include columns**（包括列）或者 **Exclude columns**（排除列）。

   1. 使用筛选条件下的 **Choose one or more columns**（选择一个或多个列）下拉列表指定要包含或排除的用户的列。

   1. 对于 **Table permissions**（表权限），选择 **Select**（选择）。本教程仅授予 `SELECT` 权限；您的要求可能会有所不同。  
![\[向 Okta 用户授予表和列级别权限。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-31.png)

1. 选择 **Grant**（授权）。

现在，您需要对 Okta 组执行类似的步骤。

**要授予 Okta 组在 Lake Formation 中的权限**

1. 在 Lake Formation 控制台的 **Tables**（表）页面，请确保仍选择了 **nyctaxi**表。

1. 从 **Actions**（操作）中，选择 **Grant**（授权）。

1. 在 **Grant permissions**（授予权限）对话框中，输入以下信息：

   1. 在 **SAML 和 Amazon Quick 用户和组**下，按以下格式输入 Okta SAML 组 ARN：

      ```
      arn:aws:iam::<account-id>:saml-provider/AthenaLakeFormationOkta:group/lf-business-analyst
      ```

   1. 对于 **Columns**（列）、**Choose filter type**（选择筛选条件类型）中，选择 **Include columns**（包括列）。

   1. 对于 **Choose one or more columns**（选择一个或多个列），选择表的前三列。

   1. 对于 **Table permissions**（表权限），选择要授予的特定访问权限。本教程仅授予 `SELECT` 权限；您的要求可能会有所不同。  
![\[向 Okta 组授予表权限。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-31b.png)

1. 选择 **Grant**（授权）。

1. 要验证您授予的权限，请选择 **Actions**（操作）、**View permissions**（查看权限）。  
![\[选择 View permissions（查看权限）以验证已授予的权限。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-32.png)

   `nyctaxi` 表的 **Data permissions**（数据权限）页面上显示了 **athena-okta-user** 和 **lf-business-analyst** 组的权限。  
![\[查看授予 Okta 用户和组的权限。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-33.png)

## 步骤 7：验证通过 Athena JDBC 客户端的访问
<a name="security-athena-lake-formation-jdbc-okta-tutorial-step-7-verify-access-through-athena-jdbc-client"></a>

现在，您可以使用 JDBC 客户端以 Okta SAML 用户的身份执行与 Athena 的测试连接。

在本节中，您将执行以下任务：
+ 准备测试客户端 – 下载 Athena JDBC 驱动程序，安装 SQL Workbench，然后将驱动程序添加到 Workbench。本教程使用 SQL Workbench 通过 Okta 身份验证访问 Athena，并验证 Lake Formation 权限。
+ 在 SQL Workbench 中：
  + 为 Athena Okta 用户创建连接。
  + 以 Athena Okta 用户身份运行测试查询。
  + 为业务分析师用户创建和测试连接。
+ 在 Okta 控制台中，将业务分析师用户添加到开发人员组。
+ 在 Lake Formation 控制台中，为开发人员组配置表权限。
+ 在 SQL Workbench 中，以业务分析师用户身份运行测试查询，并验证权限更改如何影响结果。

**要准备测试客户端**

1. 从 [通过 JDBC 连接到 Amazon Athena](connect-with-jdbc.md) 下载并提取 Lake Formation 兼容 Athena JDBC 驱动程序（2.0.14 或更高版本）。

1. 下载并安装免费的 [SQL Workbench/J](https://www.sql-workbench.eu/index.html) SQL 查询工具，在已修改的 Apache 2.0 许可证下可用。

1. 在 SQL Workbench 中，选择 **File**（文件），然后选择 **Manage Drivers**（管理驱动程序）。  
![\[选择 Manage Drivers。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-verify-access-1.png)

1. 在 **Manage Drivers**（管理驱动程序）对话框中，执行以下步骤：

   1. 选择新驱动程序图标。

   1. 对于**名称**，请输入 **Athena**。

   1. 对于 **Library**（库），浏览并选择您刚下载的 Simba Athena JDBC `.jar` 文件。

   1. 选择**确定**。  
![\[将 Athena JDBC 驱动程序添加到 SQL Workbench。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-verify-access-2.png)

现在，您已准备就绪，可以为 Athena Okta 用户创建和测试连接。

**要为 Okta 用户创建连接**

1. 选择 **File**（文件）、**Connect window**（连接窗口）。  
![\[选择 Connect window（连接窗口）。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-verify-access-3.png)

1. 在 **Connection profile**（连接配置文件）对话框中，通过输入以下信息创建连接：
   + 在名称框中，输入 **Athena\$1Okta\$1User\$1Connection**。
   + 对于 **Driver**（驱动程序），选择 Simba Athena JDBC 驱动程序。
   + 对于 **URL**，请执行以下操作之一：
     + 要使用连接 URL，请输入单行连接字符串。为便于阅读，以下示例添加了换行符。

       ```
       jdbc:awsathena://AwsRegion=region-id;
       S3OutputLocation=s3://amzn-s3-demo-bucket/athena_results;
       AwsCredentialsProviderClass=com.simba.athena.iamsupport.plugin.OktaCredentialsProvider;
       user=athena-okta-user@anycompany.com;
       password=password;
       idp_host=okta-idp-domain;
       App_ID=okta-app-id;
       SSL_Insecure=true;
       LakeFormationEnabled=true;
       ```
     + 要使用基于 AWS 配置文件的 URL，请执行以下步骤：

       1. 配置具有 AWS 凭证文件的 [AWS 配置文件](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-profiles.html)，如下例所示。

          ```
          [athena_lf_dev]
          plugin_name=com.simba.athena.iamsupport.plugin.OktaCredentialsProvider
          idp_host=okta-idp-domain
          app_id=okta-app-id
          uid=athena-okta-user@anycompany.com
          pwd=password
          ```

       1. 对于 **URL**，输入单行连接字符串，如下例所示。为便于阅读，这些示例添加了换行符。

          ```
          jdbc:awsathena://AwsRegion=region-id;
          S3OutputLocation=s3://amzn-s3-demo-bucket/athena_results;
          profile=athena_lf_dev;
          SSL_Insecure=true;
          LakeFormationEnabled=true;
          ```

     请注意，这些示例是连接到 Athena 所需 URL 的基本表示形式。有关 URL 支持的参数的完整列表，请参阅 [JDBC 文档](connect-with-jdbc.md)。

   下图显示了使用连接 URL 的 SQL Workbench 连接配置文件。  
![\[SQL Workbench 中的连接配置文件。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-verify-access-4.png)

现在，您已为 Okta 用户建立了连接，您可以通过检索某些数据对其进行测试。

**要测试 Okta 用户的连接**

1. 选择 **Test**（测试），然后验证连接是否成功。

1. 从 SQL Workbench 的 **Statement**（语句）窗口中，运行以下 SQL `DESCRIBE` 命令。验证是否显示了所有列。

   ```
   DESCRIBE "tripdb"."nyctaxi"
   ```  
![\[所有列均已显示。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-verify-access-5.png)

1. 从 SQL Workbench 的 **Statement**（语句）窗口中，运行以下 SQL `SELECT` 命令。验证是否显示了所有列。

   ```
   SELECT * FROM tripdb.nyctaxi LIMIT 5
   ```  
![\[验证是否显示了所有列。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-verify-access-6.png)

接下来，您将验证 **athena-ba-user**（作为 **lf-business-analyst** 组的一部分）是否只能访问您之前在 Lake Formation 成中指定的表的前三列。

**要验证对 **athena-ba-user** 的访问**

1. 在 SQL Workbench 中的 **Connection profile**（连接配置文件）对话框中，创建另一个连接配置文件。
   + 对于连接配置文件名称，输入 ** Athena\$1Okta\$1Group\$1Connection**。
   + 对于 **Driver**（驱动程序），选择 Simba Athena JDBC 驱动程序。
   + 对于 **URL**，请执行以下操作之一：
     + 要使用连接 URL，请输入单行连接字符串。为便于阅读，以下示例添加了换行符。

       ```
       jdbc:awsathena://AwsRegion=region-id;
       S3OutputLocation=s3://amzn-s3-demo-bucket/athena_results;
       AwsCredentialsProviderClass=com.simba.athena.iamsupport.plugin.OktaCredentialsProvider;
       user=athena-ba-user@anycompany.com;
       password=password;
       idp_host=okta-idp-domain;
       App_ID=okta-application-id;
       SSL_Insecure=true;
       LakeFormationEnabled=true;
       ```
     + 要使用基于 AWS 配置文件的 URL，请执行以下步骤：

       1. 配置 AWS 配置文件，其具有类似于以下示例的凭证文件。

          ```
          [athena_lf_ba]
          plugin_name=com.simba.athena.iamsupport.plugin.OktaCredentialsProvider
          idp_host=okta-idp-domain
          app_id=okta-application-id
          uid=athena-ba-user@anycompany.com
          pwd=password
          ```

       1. 对于 **URL**，输入如下所示的单行连接字符串。为便于阅读，这些示例添加了换行符。

          ```
          jdbc:awsathena://AwsRegion=region-id;
          S3OutputLocation=s3://amzn-s3-demo-bucket/athena_results;
          profile=athena_lf_ba;
          SSL_Insecure=true;
          LakeFormationEnabled=true;
          ```

1. 选择 **Test**（测试）以确认连接是否成功。

1. 从 **SQL Statement**（SQL 语句）窗口中，如您之前的操作那样运行相同的 `DESCRIBE` 和 `SELECT` SQL 命令并检查结果。

   由于 **athena-ba-user** 是 **lf-business-analyst** 组中的成员，将仅返回您在 Lake Formation 控制台中指定的前三列。  
![\[仅返回前三列。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-verify-access-7.png)  
![\[前三列的数据。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-verify-access-8.png)

接下来，您需要返回到 Okta 控制台以将 `athena-ba-user` 添加到 `lf-developer` Okta 组。

**要将 athena-ba-user 添加到 lf-developer 组**

1. 以分配的 Okta 域的管理用户身份登录到 Okta 控制台。

1. 选择 **Directory**（目录），然后选择 **Groups**（组）。

1. 在组页面上，选择 **lf-developer** 组中。  
![\[选择 lf-developer 组。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-verify-access-9.png)

1. 选择 **Manage People**（管理人员）。

1. 从 **Not Members**（非成员）列表中，选择 **athena-ba-user**，以将其添加到 **lf-developer group**（lf-developer 组）。

1. 选择**保存**。

现在，您将返回到 Lake Formation 控制台，以为 **lf-developer** 组配置表权限。

**要为 lf-developer-group 配置表权限**

1. 以数据湖管理员身份登录 Lake Formation 控制台。

1. 在导航窗格中，选择**表**。

1. 选择 **nyctaxi** 表。

1. 选择 **Actions**（操作）、**Grant**（授权）。

1. 在 **Grant Permissions**（授予权限）对话框中，输入以下信息：
   + 对于 **SAML 和 Amazon Quick 用户和组**，按以下格式输入 Okta SAML lf-developer 组 ARN：
   + 对于 **Columns**（列）、**Choose filter type**（选择筛选条件类型）中，选择 **Include columns**（包括列）。
   + 选择 **trip\$1type** 列。
   + 对于 **Table permissions**（表权限），选择 **SELECT**（选择）。

1. 选择 **Grant**（授权）。

现在，您可以使用 SQL Workbench 验证 **lf-developer** 组的权限变更了。更改应反映在可用于 **athena-ba-user** 的数据中，该用户现在是 **lf-developer** 组的成员。

**要验证 athena-ba-user 用户的权限更改**

1. 关闭 SQL Workbench 程序，然后重新打开。

1. 连接到 **athena-ba-user** 的配置文件。

1. 从 **Statement**（语句）窗口中，发布与之前运行的相同 SQL 语句：

   这一次，将显示 **trip\$1type** 列。  
![\[第四列可用于查询。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-verify-access-10.png)

   由于 **athena-ba-user** 现在同时是 **lf-developer** 和 **lf-business-analyst** 组中的成员，这些组的 Lake Formation 权限组合将决定返回的列。  
![\[数据结果中的第四列。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-verify-access-11.png)

## 结论
<a name="security-athena-lake-formation-jdbc-okta-tutorial-conclusion"></a>

在本教程中，您使用 Okta 作为 SAML 提供程序配置了 Athena 与 AWS Lake Formation 的整合。您使用 Lake Formation 和 IAM 控制数据湖 AWS Glue Data Catalog 中 SAML 用户可用的资源。

## 相关资源
<a name="security-athena-lake-formation-jdbc-okta-tutorial-related-resources"></a>

有关信息，请参阅以下资源：
+ [通过 JDBC 连接到 Amazon Athena](connect-with-jdbc.md)
+ [启用对 Athena API 的联合访问](access-federation-saml.md)
+ 《[AWS Lake Formation 开发人员指南](https://docs.aws.amazon.com/lake-formation/latest/dg/)》
+ 《AWS Lake Formation 开发人员指南》**中的[授予和撤消数据目录权限](https://docs.aws.amazon.com/lake-formation/latest/dg/granting-catalog-permissions.html)。
+ 《IAM 用户指南**》中的 [身份提供程序和联合服务](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers.html)。
+ 《IAM 用户指南**》中的 [创建 IAM SAML 身份提供程序](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_saml.html)。
+ *AWS 安全博客*上的 [使用 Windows Active Directory、ADFS 和 SAML 2.0 启用对 AWS 的联合查询](https://aws.amazon.com/blogs/security/enabling-federation-to-aws-using-windows-active-directory-adfs-and-saml-2-0/)。