Amazon Q 企业版 - 身份联合应用



Amazon Q 企业版通过 AWS Identity and Access Management 与您公司的身份系统连接,用于用户管理和身份验证。本章将简要介绍如何使用 IAM 联合身份访问管理最终用户访问权限来创建和配置 Amazon Q 企业版应用。

Okta IAM 联合身份

以下步骤展示如何将 Amazon Q 企业版与 Okta 集成。

先决条件

在开始将 Amazon Q 企业版与 Okta 集成之前,请确保您已:

  • 创建 Okta 帐户并添加至少一个具有有效电子邮件地址的用户。
  • 创建包含使用 IAM 联合身份访问的 Amazon Q 企业版 Web 体验中 IAM 角色中概述的权限的 IAM 策略。

步骤 1:设置 Okta 应用

要创建 Okta 实例,请按照以下步骤操作:

  • 登录 Okta 并进入管理控制台。
  • 在左侧导航窗格中,选择“应用程序”,然后选择“创建应用程序集成”。
  • 在“创建新的应用程序集成”页面上,选择 SAML 2.0,然后选择“下一步”。
  • 在“创建 SAML 集成”页面上的“常规设置”中,为“应用程序名称”输入应用程序的名称,然后选择“下一步”。
  • 在“配置 SAML”中,执行以下操作:
    • 对于“单点登录 URL”,请输入您的 Web 应用程序端点。
    • 自定义应用端点 URL 格式:[您的 URL]/saml(例如:https://127.0.0.1:8000/saml

      生成的 Web 体验端点 URL 格式:[您的 URL]/saml(例如:https://abcdefgh.qbusiness.us-east-1.on.aws/saml

    • 取消选中“将其用于接收者 URL”“目标 URL”复选框。
    • 然后,对于“接收者 URL 字段”,请输入以下 AWS 端点:https://signin.aws.amazon.com/saml
    • 对于“目标 URL”,请输入您的 Web 应用程序端点。
    • 自定义应用端点 URL 格式:[您的 URL]/saml(例如:https://127.0.0.1:8000/saml

      生成的 Web 体验端点 URL 格式:[您的 URL]/saml(例如:https://abcdefgh.qbusiness.us-east-1.on.aws/saml

      生成的 Web 体验端点 URL 格式:目前输入占位符 URL(例如:http://sampleurl.com),并在 Amazon Q 企业版应用程序创建过程结束时更新。

    • 对于“受众 URI”(SP 标识 ID),请输入以下 AWS 端点:https://signin.aws.amazon.com/saml
    • 对于“名称 ID 格式”,设置为“持久”。
    • 然后,向下滚动到页面底部,然后选择“下一步”。
  • 在“创建 SAML 集成”页面上选择最佳选项,然后单击“完成”。您将被重定向到应用程序摘要页面。
  • 在应用程序摘要页面上,从顶部导航菜单中选择“分配”,然后选择“分配”
  • 接下来,您下载 SAML 负载并复制您的“登录 URL”。

步骤 2:添加 IAM 身份提供商

要将 Okta 连接到 AWS Identity and Access Management,请按照以下步骤操作:

  • 登录 AWS Identity and Access Management 控制台。
  • 在左侧导航菜单中,从“访问管理”中选择“身份提供商”
  • “身份提供商”中选择“添加提供商”
  • 在“添加身份提供商”中,对于“配置提供商”,请执行以下操作:
    • 对于“提供商类型”,选择“SAML”
    • 对于“提供商名称”,添加一个名称来标识您的身份提供商。
    • 对于“元数据文档”,上传您在步骤 1 中从 Okta 下载并保存的 .xml 文件。
    • 选择“添加提供商”
  • “身份提供商”摘要页面上,从“提供商”中选择您刚刚添加的提供商,然后执行以下操作:
    • 从摘要页面复制并保存 ARN。您需要它来创建信任策略和 Okta 设置。ARN 格式:arn:aws:iam::aws-account-id:saml-provider/assigned-iam-idp-name
    • 然后,选择“分配角色”以使用身份提供商所需的权限创建 IAM 角色。
  • “分配角色”中,对于“角色选项”,选择“创建新角色”。
  • 然后,在“选定的信任实体页面”上,执行以下操作:
    • 对于“受信任实体类型”,选择 SAML 2.0 联合身份。
    • 在 SAML 2.0 联合身份中,从 SAML 2.0 基于提供商的下拉列表中,选择您添加的身份提供商。
    • 对于“允许访问”,选择“仅允许编程访问”。
    • 对于“属性”,选择 SAML:aud。
    • 对于“值”,输入以下内容:https://signin.aws.amazon.com/saml。
    • 选择“下一步”。
  • 在“添加权限”页面上选择具有所需权限的 IAM 策略,然后单击“下一步”。
  • 在“名称、审核和创建”页面上输入角色名称、可选说明和标签。然后,单击“创建角色”。
  • 在“角色”页面上,选择您刚刚创建的 IAM 角色。然后,在角色摘要页面上,执行以下操作:
    • 复制并保存角色 ARN(例如,arn:aws:iam::111122223333:role/sample-role),用于将您的 AWS IAM 身份提供商实例连接到 Okta。
    • 通过添加新的语句来编辑信任策略,将“account_id”替换为您的 AWS 帐户 ID,将“saml_provider”替换为您的 IAM 身份提供商 ARN 中的 assigned-iam-idp-name。
    • "Version": "2012-10-17",
      "Statement": [
          {
              "Effect": "Allow",
              "Principal": {
                  "Federated": "arn:aws:iam::{{account_id}}:saml-provider/[[saml_provider]]"
              },
              "Action": "sts:AssumeRoleWithSAML",
              "Condition": {
                  "StringEquals": {
                      "SAML:aud": "https://signin.aws.amazon.com/saml"
                  }
              }
          },
          {
              "Effect": "Allow",
              "Principal": {
                  "Federated": "arn:aws:iam::{{account_id}}:saml-provider/[[saml_provider]]"
              },
              "Action": "sts:TagSession",
              "Condition": {
                  "StringLike": {
                      "aws:RequestTag/Email": "*"
                  }
              }
          }
      ]
              
    • 然后,选择“更新策略”。

步骤 3:将 IAM 连接到 Okta

在此步骤中,我们正在配置 AWS IAM 和 Okta 之间的信任关系。

  • 登录 Okta 并进入管理控制台。
  • 在左侧导航窗格中,选择“应用程序”,然后选择您创建的 Okta 应用程序。
  • 在“常规”中,从“SAML 设置”中选择“编辑”。
  • 在“编辑 SAML”中,对于“常规设置”,选择“下一步”。
  • 在“配置 SAML”中,向下滚动到“属性语句”部分,然后添加属性。

步骤 4:创建 Q 企业版应用

要使用控制台创建应用程序,请按照以下步骤操作:

  • 登录 AWS 管理控制台并打开 Amazon Q 企业版控制台。
  • 从“工作原理”菜单中,选择“试用快速应用程序”。
  • 在“创建应用程序”页面上的“应用程序设置”中,输入您的 Amazon Q 企业版应用程序的应用程序名称。
  • 在“服务访问”中,从选项(例如“创建并使用新的服务链接角色 (SLR)”、“创建并使用新的服务角色 (SR)”、“使用现有的服务角色 (SR)/服务链接角色 (SLR)”和“服务角色名称”)中选择授权 Amazon Q 企业版的方法。
  • 要自定义您的加密设置,请选择“自定义加密设置(高级)”。
  • 对于“访问管理方法”,选择“IAM Identity Center”。
  • 要在 Amazon Q 企业版中为 IAM Identity Center 集成启用跨区域调用,请先创建一个 IAM Identity Center 实例,然后激活“启用跨区域调用”。
  • 然后将 Amazon Q 企业版连接到 IAM Identity Center。
  • 要开始创建应用程序,请选择“创建”。

步骤 5:设置 Q 企业版检索器

要使用控制台创建 Amazon Q 企业版检索器,请按照以下步骤操作:

  • 登录 AWS 管理控制台并打开 Amazon Q 企业版控制台。
  • 完成创建 Amazon Q 企业版应用程序的步骤。
  • 然后,对于“选择检索器”,选择“使用本机检索器”。
  • “索引配置”中,根据您的用例在“入门”和“企业”索引类型之间进行选择,并选择您需要的单元数量。
  • 对于“标签”,选择是否要添加索引标签。
  • 要创建检索器和索引,请选择“创建”。

要使用控制台创建 Amazon Kendra 检索器,请按照以下步骤操作:

  • 登录 AWS 管理控制台并打开 Amazon Q 企业版控制台。
  • 完成创建 Amazon Q 企业版应用程序的步骤。
  • 在“选择检索器”中,选择“使用现有检索器”。
  • 在“标签”中,选择是否要添加检索器标签。
  • 要将您的应用程序环境连接到您的数据源,请选择“下一步”。

步骤 6:链接 Q 企业版数据源

为您的 Amazon Q 企业版应用程序选择一个检索器,然后将其连接到数据源。可用的数据源取决于您选择的检索器。

如果您使用 Amazon Q 企业版检索器,您可以从以下选项中选择:

  • 通过使用 CreateDataSource API 操作连接到任何 Amazon Q 企业版支持的数据源连接器。
  • 通过使用 BatchPutDocument API 操作直接上传文档。

步骤 7:管理访问权限

要管理用户访问权限,请按照以下步骤操作:

  • 登录 AWS 管理控制台并打开 Amazon Q 企业版控制台。
  • 完成创建 Amazon Q 企业版应用程序的步骤。
  • 将默认订阅层级设置为 Q 企业版专业版或 Q 企业版精简版。这将成为所有登录到您的 Web 体验的用户默认设置。
  • 选择“创建应用程序”。

自定义 Web 体验

要自定义 Amazon Q 企业版 Web 体验,您需要按照以下步骤操作:

  • 登录AWS 管理控制台并打开Amazon Q 企业版控制台
  • 完成创建 Amazon Q 企业版应用程序的步骤。
  • 然后,在Amazon Q 企业版应用程序环境页面上,选择您的应用程序,然后选择“自定义 Web 体验”
  • “自定义 Web 体验”中,从右侧导航窗格中选择“自定义 Web 体验”
  • 在“自定义 Web 体验”中,输入标题、欢迎消息、显示示例提示。
  • 然后选择“保存”

将应用连接到单个 IdP

您可以将多个 Amazon Q 企业版自定义应用程序连接到单个基于 SAML 2.0 或 OIDC 的身份提供商 (IdP) 应用程序。

使用 SAML

要使用 SAML 将多个 Amazon Q 企业版自定义应用程序连接到 Okta,请按照以下步骤操作:

  • 登录 Okta 并进入管理控制台。
  • 在左侧导航窗格中,选择“应用程序”,然后选择您现有的 SAML 2.0 应用程序。
  • 从“常规”中,选择“SAML 设置”。
  • 保持您的“常规设置”不变,然后选择“下一步”。
  • 编辑 SAML 集成:在“SAML 设置”中的“常规”下,为您的第一个 SAML 应用程序输入“单点登录 URL”和“受众 URI”。
  • 然后,从“常规”中,选择“显示高级设置”。
  • 向下滚动到“其他可请求的 SSO URL”,然后选择“添加其他”。
  • 添加其他 SAML 应用程序的“单点登录 URL”,包括每个应用程序的索引值。使用格式:https://127.0.0.1:8000/saml。
  • 然后,向下滚动并选择“下一步”。
  • 在“反馈”页面上,选择“完成”。

使用 OIDC

要使用 OIDC 将多个 Amazon Q 企业版自定义应用程序连接到 Okta,请按照以下步骤操作:

  • 登录 Okta 并进入管理控制台。
  • 从“常规”中,向下滚动到“常规设置”,然后选择“编辑”。
  • 从“登录”中,对于“登录重定向 URI”,然后选择“编辑”。
  • 在“登录重定向 URI”中,选择“添加 URI”以添加多个 URI。然后,选择“保存”。

创建 IAM API 应用

请按照以下步骤完成创建使用 API 的 IAM 联合身份应用程序。

先决条件

在开始设置进行 Sig V4 身份验证的 API 调用之前,请确保您已完成以下操作:

  • 创建 Amazon Q 企业版应用程序。
  • 创建 Okta IdP 实例并设置用户和组。这些步骤也适用于连接到您的 IAM 实例的其他身份提供商。
  • 为您的 Amazon Q Business 应用程序创建了一个 IAM 实例,并连接了 Okta 作为您的身份源。
  • 配置对 AWS CLI 的访问。

一次性设置

以下部分概述了设置 Amazon Q Business 控制平面的步骤。您只需要执行这些步骤一次。

  • 在 Okta 中创建 OIDC 应用程序集成。
  • 使用以下命令创建 IAM 身份提供商
  • aws iam \
    create-open-id-connect-provider \
    --url issuer-url
        
  • 接下来,创建 IAM 角色。为此,请执行以下步骤
    • 创建一个名为 policies 的目录。
    • 在该目录中,创建一个名为 trustpolicyforfederation.json 的文件并保存,其中包含以下 JSON 代码
    • {
          "Version": "2012-10-17",
          "Statement": {
              "Sid": "RoleForOkta",
              "Effect": "Allow",
              "Principal": {
                  "Federated": "OpenIdConnectProviderArn"
              },
              "Action": "sts:AssumeRoleWithWebIdentity",
              "Condition": {
                  "StringEquals": {
                      "issuer-url:aud": "client-id"
                  }
              }
          }
      }
               
              

      接下来,为您的 Web 体验创建 IAM 策略。为此,请执行以下步骤

      在 policies 目录中,创建一个名为 permspolicyforfederation.json 的文件并保存,其中包含以下 JSON 代码

      "Version": "2012-10-17",
      "Statement": [{
          "Sid": "QBusinessConversationPermissions",
          "Effect": "Allow",
          "Action": [
              "qbusiness:Chat",
              "qbusiness:ChatSync",
              "qbusiness:ListMessages",
              "qbusiness:ListConversations",
              "qbusiness:PutFeedback",
              "qbusiness:DeleteConversation",
              "qbusiness:GetWebExperience",
              "qbusiness:GetApplication",
              "qbusiness:ListPlugins",
              "qbusiness:GetChatControlsConfiguration",
              "qbusiness:ListRetrievers"
          ],
          "Resource": "arn:aws:qbusiness:{{region}}:{{source_account}}:application/{{application_id}}"
      },
      {
          "Sid": "QBusinessRetrieverPermission",
          "Effect": "Allow",
          "Action": [
              "qbusiness:GetRetriever"
          ],
          "Resource": [
              "arn:aws:qbusiness:{{region}}:{{source_account}}:application/{{application_id}}",
              "arn:aws:qbusiness:{{region}}:{{source_account}}:application/{{application_id}}/retriever/*"
          ]
      },
      {
          "Sid": "QBusinessAutoSubscriptionPermission",
          "Effect": "Allow",
          "Action":  [
              "user-subscriptions:CreateClaim" 
          ],
          "Condition":  {
              "Bool":  {
                  "user-subscriptions:CreateForSelf": "true" 
              },
              "StringEquals":  {
                  "aws:CalledViaLast": "qbusiness.amazonaws.com" 
              }
          },
          "Resource":  [
              "*" 
          ]
      },
      {
          "Sid": "QBusinessKMSDecryptPermissions",
          "Effect": "Allow",
          "Action": [
              "kms:Decrypt"
          ],
          "Resource": [
              "arn:aws:kms:{{region}}:{{account_id}}:key/[[key_id]]"
          ],
          "Condition": {
              "StringLike": {
                  "kms:ViaService": [
                      "qbusiness.{{region}}.amazonaws.com",
                      "qapps.{{region}}.amazonaws.com"
                  ]
              }
          }
      },
      {
          "Sid": "QAppsResourceAgnosticPermissions",
          "Effect": "Allow",
          "Action": [
              "qapps:CreateQApp",
              "qapps:PredictQApp",
              "qapps:PredictProblemStatementFromConversation",
              "qapps:PredictQAppFromProblemStatement",
              "qapps:ListQApps",
              "qapps:ListLibraryItems",
              "qapps:CreateSubscriptionToken"
          ],
          "Resource": "arn:aws:qbusiness:{{region}}:{{source_account}}:application/{{application_id}}"
      },
      {
          "Sid": "QAppsAppUniversalPermissions",
          "Effect": "Allow",
          "Action": [
              "qapps:DisassociateQAppFromUser"
          ],
          "Resource": "arn:aws:qapps:{{region}}:{{source_account}}:application/{{application_id}}/qapp/*"
      },
      {
          "Sid": "QAppsAppOwnerPermissions",
          "Effect": "Allow",
          "Action": [
              "qapps:GetQApp",
              "qapps:CopyQApp",
              "qapps:UpdateQApp",
              "qapps:DeleteQApp",
              "qapps:ImportDocument",
              "qapps:ImportDocumentToQApp",
              "qapps:CreateLibraryItem",
              "qapps:UpdateLibraryItem",
              "qapps:StartQAppSession"
          ],
          "Resource": "arn:aws:qapps:{{region}}:{{source_account}}:application/{{application_id}}/qapp/*",
          "Condition": {
              "StringEqualsIgnoreCase": {
                  "qapps:UserIsAppOwner": "true"
              }
          }
      },
      {
          "Sid": "QAppsPublishedAppPermissions",
          "Effect": "Allow",
          "Action": [
              "qapps:GetQApp",
              "qapps:CopyQApp",
              "qapps:AssociateQAppWithUser",
              "qapps:GetLibraryItem",
              "qapps:CreateLibraryItemReview",
              "qapps:AssociateLibraryItemReview",
              "qapps:DisassociateLibraryItemReview",
              "qapps:StartQAppSession"
          ],
          "Resource": "arn:aws:qapps:{{region}}:{{source_account}}:application/{{application_id}}/qapp/*",
          "Condition": {
              "StringEqualsIgnoreCase": {
                  "qapps:AppIsPublished": "true"
              }
          }
      },
      {
          "Sid": "QAppsAppSessionModeratorPermissions",
          "Effect": "Allow",
          "Action": [
              "qapps:ImportDocument",
              "qapps:ImportDocumentToQAppSession",
              "qapps:GetQAppSession",
              "qapps:GetQAppSessionMetadata",
              "qapps:UpdateQAppSession",
              "qapps:UpdateQAppSessionMetadata",
              "qapps:StopQAppSession"
          ],
          "Resource": "arn:aws:qapps:{{region}}:{{source_account}}:application/{{application_id}}/qapp/*/session/*",
          "Condition": {
              "StringEqualsIgnoreCase": {
                  "qapps:UserIsSessionModerator": "true"
              }
          }
      },
      {
          "Sid": "QAppsSharedAppSessionPermissions",
          "Effect": "Allow",
          "Action": [
              "qapps:ImportDocument",
              "qapps:ImportDocumentToQAppSession",
              "qapps:GetQAppSession",
              "qapps:GetQAppSessionMetadata",
              "qapps:UpdateQAppSession"
          ],
          "Resource": "arn:aws:qapps:{{region}}:{{source_account}}:application/{{application_id}}/qapp/*/session/*",
          "Condition": {
              "StringEqualsIgnoreCase": {
                  "qapps:SessionIsShared": "true"
              }
          }
      }
          
    • 最后,使用以下命令在 IAM 中创建并附加角色
    • aws iam \
      create-role \
      --role-name 
      --assume-role-policy-document file://policies/trustpolicyforfederation.json \
      --policy-document file://policies/permspolicyforfederation.json 
              

API 调用会话工作流程

首先,使用来自 Okta 的 IdToken 调用 AssumeRoleWithWebIdentity API 以获取 AWS 凭证。为此,请使用以下命令

aws sts
assume-role-with-web-identity
--role-arn role arn
--role-session-name session-name
--web-identity-token id-token-from-okta

然后,使用您从 AssumeRoleWithWebIdentity API 调用收到的凭证,在您的命令行环境中设置以下环境变量。

AWS_ACCESS_KEY_ID="identity-aware-sigv4-access-key"
AWS_SECRET_ACCESS_KEY="identity-aware-sigv4-secret-key"
AWS_SESSION_TOKEN="identity-aware-sigv4-session-token"

然后,使用以下命令进行 Amazon Q Business API 调用

aws qbusiness \
chat-sync \
--application-id application-id
--user-message sample-chat-request
广告