

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

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

借助 [IAM Identity Center](https://docs.amazonaws.cn/singlesignon/latest/userguide/what-is.html)，您可以管理员工身份（也称为员工用户）的登录安全性。您可以在 IAM Identity Center 中创建或连接员工用户，并集中管理他们对所有 Amazon 账户和应用程序的访问权限。您可以使用多账户权限为这些用户分配 Amazon Web Services 账户 的访问权限。您可以使用应用程序分配为用户分配对启用了 IAM Identity Center 的应用程序、云应用程序和客户安全断言标记语言（SAML 2.0）应用程序的访问权限。有关更多信息，请参阅*《Amazon IAM Identity Center 用户指南》*中的 [Trusted identity propagation across applications](https://docs.amazonaws.cn/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.amazonaws.cn/athena/latest/APIReference/API_GetWorkGroup.html) API 操作的响应返回的 `IdentityCenterApplicationArn`。
+ 必须将 Amazon S3 访问权限管控配置为使用可信身份传播身份。有关更多信息，请参阅《Amazon S3 用户指南》**中的 [S3 访问权限管控和公司目录身份](https://docs.amazonaws.cn/AmazonS3/latest/userguide/access-grants-directory-ids.html)。
+ 启用 IAM Identity Center 的 Athena 工作组需要将 Lake Formation 配置为使用 IAM Identity Center 身份。有关配置信息，请参阅《Amazon Lake Formation 开发人员指南》**中的[集成 IAM Identity Center](https://docs.amazonaws.cn/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.amazonaws.cn/emr/latest/ManagementGuide/emr-studio-athena.html)。
+ 可信身份传播与以下 Athena 功能不兼容。
  + 已启用 IAM Identy Center 的工作组的 `aws:CalledVia` 上下文键
  + Athena for Spark 工作组。
  + 对 Athena API 的联合访问
  + 使用 Lake Formation 以及 Athena JDBC 和 ODBC 驱动程序对 Athena 进行联合访问。
+ 您只能在以下 Amazon Web Services 区域中将可信身份传播与 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` 托管策略。有关更多信息，请参阅 [Amazon 托管策略：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.amazonaws.cn/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 角色，它授权 Amazon 服务代表您访问其他 Amazon 服务。要查询联合目录或运行 UDF，请使用相应的 Lambda 权限更新服务角色。有关更多信息，请参阅 *IAM 用户指南*中的[创建向 Amazon 服务委派权限的角色](https://docs.amazonaws.cn/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.amazonaws.cn/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"
        }
    ]
}
```

------