

# 教程：使用 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/)。