

# 将可信身份传播与 Amazon Athena 驱动程序结合使用
<a name="using-trusted-identity-propagation"></a>

可信身份传播为希望集中管理数据权限并根据其跨服务边界的 IdP 身份授权请求的组织提供了一种新的身份验证方法。借助 IAM Identity Center，您可以配置现有 IdP 来管理用户和群组，并使用 AWS Lake Formation 为这些 IdP 身份定义对目录资源的精细访问控制权限。Athena 支持在查询数据以审计 IdP 身份数据访问权限时，进行身份传播，以帮助您的组织满足监管和合规要求。

现在，您可以通过 IAM Identity Center 的单点登录功能，连接到使用 Java 数据库连接（JDBC）或开放式数据库连接（ODBC）驱动程序的 Athena。通过 PowerBI、Tableau 或 DBeaver 等工具访问 Athena 时，您的身份和权限会自动通过 IAM Identity Center 传播到 Athena。这意味着在查询数据时会直接强制执行您的个人数据访问权限，无需进行单独的身份验证步骤或凭证管理。

对于管理员来说，此功能可以通过 IAM Identity Center 和 Lake Formation 集中控制访问权限，确保对连接到 Athena 的所有受支持分析工具强制执行一致的权限管理。首先，请确保您的组织已将 IAM Identity Center 配置为您的身份源，并为您的用户设置相应的数据访问权限。

**Topics**
+ [关键定义](#using-trusted-identity-propagation-key-definitions)
+ [注意事项](#using-trusted-identity-propagation-considerations)
+ [先决条件](#using-trusted-identity-propagation-prerequisites)
+ [将 Athena 连接到 IAM Identity Center](using-trusted-identity-propagation-setup.md)
+ [使用 AWS CloudFormation 配置和部署资源](using-trusted-identity-propagation-cloudformation.md)

## 关键定义
<a name="using-trusted-identity-propagation-key-definitions"></a>

1. **应用程序角色**：用于交换令牌、检索工作组和客户管理的 AWS IAM Identity Center 应用程序 ARN 的角色。

1. **访问角色**：用于 Athena 驱动程序的角色，可使用身份增强型凭证运行客户工作流程。这意味着需要有此角色才能访问下游服务。

1. **客户管理的应用程序**：AWS IAM Identity Center 应用程序。有关更多信息，请参阅 [Customer Managed Application](https://docs.aws.amazon.com/singlesignon/latest/userguide/customermanagedapps.html)。

## 注意事项
<a name="using-trusted-identity-propagation-considerations"></a>

1. 此功能仅适用于 Athena 正式发布且支持可信身份传播功能的区域。有关可用性的更多信息，请参阅[注意事项和限制](https://docs.aws.amazon.com/athena/latest/ug/workgroups-identity-center.html)。

1. JDBC 和 ODBC 驱动程序支持通过启用 IAM 的工作组进行可信身份传播。

1. 您可以使用此身份验证插件将 JDBC 和 ODBC 用作独立驱动程序，也可以将它们与任何具有可信身份传播功能的 BI 或 SQL 工具结合使用。

## 先决条件
<a name="using-trusted-identity-propagation-prerequisites"></a>

1. 您必须有启用的 AWS IAM Identity Center 实例。有关更多信息，请参阅 [What is IAM Identity Center?](https://docs.aws.amazon.com/singlesignon/latest/userguide/identity-center-instances.html)。

1. 您必须有一个有效的外部身份提供者，并且用户或组必须存在于 AWS IAM Identity Center 中。您可以手动配置用户或群组或使用 SCIM 自动配置用户或群组。有关更多信息，请参阅 [Provisioning an external identity provider into IAM Identity Center using SCIM](https://docs.aws.amazon.com/singlesignon/latest/userguide/provision-automatically.html)。

1. 您必须向用户或组授予 Lake Formation 访问目录、数据库和表的权限。有关更多信息，请参阅[使用 Athena 查询注册到 Lake Formation 的数据](https://docs.aws.amazon.com/athena/latest/ug/security-athena-lake-formation.html)。

1. 要使用 JDBC 或 ODBC 驱动程序运行 Athena 查询，您必须有有效的 BI 工具或 SQL 客户端。

# 将 Athena 连接到 IAM Identity Center
<a name="using-trusted-identity-propagation-setup"></a>

以下章节介绍了将 Athena 连接到 IAM Identity Center 的过程。

## 设置可信令牌发布者
<a name="using-trusted-identity-propagation-step1"></a>

按照[设置可信令牌发布者](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_oidc.html)指南来设置可信令牌发布者。此操作将创建 AWS IAM Identity Center。

**注意**  
对于**提供者类型**，选择 **OpenID Connect**。对于**提供者 URL**，请输入您身份提供者的发布者 URL。对于**受众**，请指定身份提供者为您的应用程序发布的客户端 ID。  
 

复制 AWS IAM 身份提供者的应用程序资源名称（ARN）。有关更多信息，请参阅[身份提供者和联合身份验证](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers.html)。

## 设置 IAM 角色
<a name="using-trusted-identity-propagation-step2"></a>

### 设置 IAM 应用程序角色
<a name="using-trusted-identity-propagation-step2-application-role"></a>

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

1. 在左侧的导航窗格中，选择**角色**，然后选择**创建角色**。

1. 对于**可信实体类型**，选择**自定义信任策略**，如下所示：

   1. 对于**联合主体**，添加您在设置可信令牌发布者期间复制的 AWS IAM 身份提供者 ARN。

   1. 对于策略条件，添加来自外部联合身份提供者的受众。

1. 添加以下内联策略，向用户授予 [CreateTokenWithIAM](https://docs.aws.amazon.com/singlesignon/latest/OIDCAPIReference/API_CreateTokenWithIAM.html)、[ListTagsForResource](https://docs.aws.amazon.com/athena/latest/APIReference/API_ListTagsForResource.html) 和 [AssumeRoleWithWebIdentity](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html) 权限。

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

****  

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

------
**注意**  
`CreateTokenWithIam` 权限是在客户管理的 IAM Identity Center 应用程序中授予的。

1. 复制应用程序角色 ARN。

### 设置 IAM 访问角色
<a name="using-trusted-identity-propagation-step2-access-role"></a>

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

1. 在左侧的导航窗格中，选择**角色**，然后选择**创建角色**。

1. 对于**可信实体类型**，选择**自定义信任策略**，如下所示：

   1. 对于**联合主体**，添加在可信令牌发行者设置期间复制的 AWS IAM Identity Center ARN。

   1. 对于 **AWS 主体**，添加在 IAM 应用程序角色设置期间复制的 AWS IAM 应用程序角色 ARN。

1. 添加以下**内联策略**以授予对驱动程序工作流程的访问权限：

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "athena:StartQueryExecution",
                   "athena:GetQueryExecution",
                   "athena:GetQueryResults",
                   "athena:ListWorkGroups",
                   "athena:ListDataCatalogs",
                   "athena:ListDatabases",
                   "athena:ListTableMetadata"
               ],
               "Resource": "*"
           },
           {
               "Effect": "Allow",
               "Action": [
                   "s3:ListBucket",
                   "s3:GetObject",
                   "s3:PutObject"
               ],
               "Resource": "*"
           },
           {
               "Effect": "Allow",
               "Action": [
                   "glue:GetDatabase",
                   "glue:GetDatabases",
                   "glue:CreateTable",
                   "glue:GetTable",
                   "glue:GetTables",
                   "glue:UpdateTable",
                   "glue:DeleteTable",
                   "glue:BatchDeleteTable",
                   "glue:GetTableVersion",
                   "glue:GetTableVersions",
                   "glue:DeleteTableVersion",
                   "glue:BatchDeleteTableVersion",
                   "glue:CreatePartition",
                   "glue:BatchCreatePartition",
                   "glue:GetPartition",
                   "glue:GetPartitions",
                   "glue:BatchGetPartition",
                   "glue:UpdatePartition",
                   "glue:DeletePartition",
                   "glue:BatchDeletePartition"
               ],
               "Resource": "*"
           },
           {
               "Effect": "Allow",
               "Action": [
                   "lakeformation:GetDataAccess"
               ],
               "Resource": "*"
           }
       ]
   }
   ```

------

1. 复制访问角色的 ARN。

## 配置 AWS IAM Identity Center 客户托管的应用程序
<a name="using-trusted-identity-propagation-step3"></a>

要配置客户管理型应用程序，请按照 [Set up customer managed OAuth 2.0 applications for trusted identity propagation](https://docs.aws.amazon.com/singlesignon/latest/userguide/customermanagedapps-trusted-identity-propagation-set-up-your-own-app-OAuth2.html) 中的步骤，并注意以下 Athena 事项。
+ 对于**标签**，添加以下键值对：
  + **键**：**AthenaDriverOidcAppArn**
  + **值**：在 IAM 访问角色设置期间复制的 **AccessroLearn**。
+ [指定应用程序凭证](https://docs.aws.amazon.com/singlesignon/latest/userguide/customermanagedapps-trusted-identity-propagation-set-up-your-own-app-OAuth2.html#customermanagedapps-trusted-identity-propagation-set-up-your-own-app-OAuth2-specify-application-credentials)时，添加您在 IAM 应用程序角色设置期间复制的 AWS IAM 应用程序角色 ARN。
+ 对于**可以接收请求的应用程序**，选择 **AWS-Lake-Formation-AWS-Glue-Data-Catalog-<account-id>**。
+ 对**要应用的访问范围**，选择 **lakeformation:query** 用于启用 IAM 的工作组，或者选择 **lakeformation:query**、**athena:workgroup:read\$1write** 和 **s3:access\$1grants:read\$1write** 用于启用 Identity Center 的工作组。

## 配置工作组关联
<a name="using-trusted-identity-propagation-step4"></a>

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

1. 从列表中选择一个工作组，然后打开**标签**选项卡。

1. 选择**管理标签**并输入以下内容：

   1. **密钥** – `AthenaDriverOidcAppArn`

   1. **值**：AWS IAM Identity Center 应用程序的 ARN。

1. 选择**保存**。

管理员完成一次性设置后，他们可以向其用户分发基本的连接详细信息。用户需要以下五个必填参数才能运行 SQL 工作负载：

1. **ApplicationRoleARN**：应用程序角色 ARN

1. **JwtWebIdentityToken**:用于身份验证的 JWT 令牌

1. **WorkgroupARN**：Athena 工作组的 ARN

1. **JwtRoleSessionName**：JWT 角色的会话名称

1. **CredentialsProvider**：凭证提供者配置

**注意**  
我们通过策略式标记简化了连接字符串的配置。通过正确标记 Athena 工作组和 AWS IAM Identity Center 客户管理的应用程序，管理员无需用户提供 `AccessRoleArn` 和 `CustomerIdcApplicationArn`。该插件会使用应用程序角色查找必要的标签并为其工作流程检索相应的 ARN 值来自动处理此问题。  
管理员仍然可以根据需要调整应用程序角色权限，让用户在连接字符串中提供 `AccessRoleArn` 或 `CustomerIdcApplicationArn`。

## 使用启用了可信身份传播功能的 Athena 驱动程序运行查询
<a name="using-trusted-identity-propagation-step5"></a>

下载要使用的驱动程序的最新版。有关 JDBC 安装的更多信息，请参阅[开始使用 JDBC 3.x 驱动程序](jdbc-v3-driver-getting-started.md)。您可以选择基于支持的平台安装 ODBC 驱动程序。有关更多信息，请参阅 [开始使用 ODBC 2.x 驱动程序](odbc-v2-driver-getting-started.md)。根据您要使用的驱动程序，提供以下文章中列出的参数：
+ [JDBC 身份验证插件连接参数](jdbc-v3-driver-jwt-tip-credentials.md)
+ [ODBC 身份验证插件连接参数](odbc-v2-driver-jwt-tip.md)

**注意**  
只有 JDBC 3.6.0 及更高版和 ODBC 2.0.5.0 及更高版，才支持将可信身份传播与驱动程序结合使用。

## 将 Athena 驱动程序和可信身份传播与 DBeaver 结合使用
<a name="using-trusted-identity-propagation-step6"></a>

1. 从 Athena 下载带有依赖关系的最新 JDBC jar。有关更多信息，请参阅 [Athena JDBC 3.x 驱动程序](jdbc-v3-driver.md)。

1. 在计算机上打开 DBeaver 应用程序。

1. 导航到屏幕顶部的**数据库**菜单，然后选择**驱动程序管理器**。

1. 选择**新建**，然后选择**库**。

1. 添加最新的驱动程序并选择**查找类**。此时系统会给你一个类似 `com.amazon.athena.jdbc.AthenaDriver` 的文件路径。

1. 打开**设置**选项卡，并填写以下字段

   1. **驱动程序名称**：Athena JDBC 可信身份传播

   1. **类名称**：`com.amazon.athena.jdbc.AthenaDriver`

   1. 选择**不进行身份验证**选项。

1. 选择**连接到数据库**，然后找到 Athena JDBC 可信身份传播。这会将您导向至 JDBC URL。有关更多信息，请参阅 [配置驱动程序](jdbc-v3-driver-getting-started.md#jdbc-v3-driver-configuring-the-driver)。

1. 提供以下详细信息

   1. **Workgroup**：您要在其中运行查询的工作组。有关工作组的信息，请参阅 [WorkGroup](https://docs.aws.amazon.com/athena/latest/APIReference/API_WorkGroup.html)。

   1. **Region**：将在其中运行查询的 AWS 区域。有关区域列表，请参阅 [Amazon Athena endpoints and quotas](https://docs.aws.amazon.com/general/latest/gr/athena.html)。

   1. **OutputLocation**：用于存储查询结果的 Amazon S3 位置。有关输出位置的信息，请参阅 [ResultConfiguration](https://docs.aws.amazon.com/athena/latest/APIReference/API_ResultConfiguration.html)。

   1. **CredentialsProvider**：输入 `JWT_TIP`。

   1. **ApplicationRoleArn**：用于启用 `AssumeRoleWithWebIdentity` 的角色 ARN。有关 ARN 角色的更多信息，请参阅 AWS Security Token Service API Reference 中的 [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)。

   1. **WorkgroupArn**：将在其中运行查询的工作组 ARN。它必须与 **Workgroup** 字段中提供的工作组一致。有关工作组的信息，请参阅 [WorkGroup](https://docs.aws.amazon.com/athena/latest/APIReference/API_WorkGroup.html)。

   1. **JwtRoleSessionName**：使用 JWT 凭证进行身份验证时的会话名称。它可以是您选择的任何名称。

   1. **JwtWebIdentityToken**：从外部联合身份提供者处获得的 JWT 令牌。此令牌用于向 Athena 进行身份验证。

      ```
      jdbc:athena://Workgroup=<value>;Region=<region>;OutputLocation=<location>;CredentialsProvider=JWT_TIP;ApplicationRoleArn=<arn>;WorkgroupArn=<arn>;JwtRoleSessionName=JDBC_TIP_SESSION;JwtWebIdentityToken=<token>;
      ```

1. 选择**确定**关闭窗口。完成此步骤后，DBeaver 将开始加载您的元数据，您应该会开始看到目录、数据库和表被填充。
**注意**  
如果令牌中存在 JTI 声明，并且您在选择**确定**前选择了**测试连接**，则系统会阻止相同的 JTI 被重复用于令牌交换。有关更多信息，请参阅 [Prerequisites and considerations for trusted token issuers](https://docs.aws.amazon.com/singlesignon/latest/userguide/using-apps-with-trusted-token-issuer.html#trusted-token-issuer-prerequisites)。为了处理这个问题，JDBC 实现了内存缓存，内存缓存的生命周期取决于主驱动程序实例。对于 ODBC，可以选择使用[文件缓存](odbc-v2-driver-jwt-tip.md#odbc-v2-driver-jwt-tip-file-cache)，此功能允许缓存和重复使用临时凭证，以减少会话生命周期中使用的 Web 身份令牌数量。

1. 打开 **SQL 查询编辑器**并开始运行查询。要验证用户的传播身份，请参阅 [Cloudtrail logs](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-user-guide.html)。

# 使用 AWS CloudFormation 配置和部署资源
<a name="using-trusted-identity-propagation-cloudformation"></a>

您可以使用 CloudFormation 模板配置和部署资源，从而开始将可信身份传播与 Athena 驱动程序结合使用，如下所示。

1. 下载 CloudFormation 模板以设置 IAM Identity Center 客户管理的应用程序和访问角色以及工作组和 IAM Identity Center 应用程序标签。你可以从此 [CloudFormation 模板链接](https://downloads.athena.us-east-1.amazonaws.com/drivers/CFNTemplate/AthenaDriversTrustedIdentityPropagationCFNTemplate.yaml)下载模板。

1. 运行 `create-stack` AWS CLI 命令以部署 CloudFormation 堆栈，这会按以下方式预置已配置的资源。

   ```
   aws cloudformation create-stack \
       --stack-name my-stack \
       --template-url URL_of_the_file_that_contains_the_template_body \
       --parameters file://params.json
   ```

1. 要查看资源预置的状态，请导航到 CloudFormation 控制台。集群创建完成后，在 Identity Center 控制台中查看新的 IAM Identity Center 应用程序。您可以在 IAM 控制台中查看 IAM 角色。

   这些标签将在工作组和 IAM Identity Center 应用程序中关联。

1. 使用创建的角色和应用程序，您可以立即使用 Athena 驱动程序。要使用 JDBC 驱动程序，请参阅 [JDBC 身份验证插件连接参数](jdbc-v3-driver-jwt-tip-credentials.md)。要使用 JDBC 驱动程序，请参阅 [ODBC 身份验证插件连接参数](odbc-v2-driver-jwt-tip.md)。