Amazon Q Business - 身份联合应用程序

Amazon Q Business 通过 AWS Identity and Access Management 连接您公司的身份系统,以进行用户管理和身份验证。本章将简要介绍如何使用 IAM 联合来创建和配置 Amazon Q Business 应用程序以管理最终用户访问。

Okta IAM 联合

以下步骤介绍如何将 Amazon Q Business 与 Okta 集成:

先决条件

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

  • 创建 Okta 账户并添加至少一个具有有效电子邮件地址的用户。
  • 创建 IAM 策略,其中包含 IAM 角色中概述的权限,用于使用 IAM 联合实现 Amazon Q Business Web 体验。

步骤 1:设置 Okta 应用程序

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

  • 登录 Okta并转到管理控制台。
  • 在左侧导航窗格中,选择"应用程序",然后选择"创建应用程序集成"。
  • 在"创建新的应用程序集成"页面上,选择"SAML 2.0",然后选择"下一步"。
  • 在"创建 SAML 集成"页面上的"常规设置"中,对于"应用程序名称",输入应用程序的名称并选择"下一步"。
  • 在"配置 SAML"中,执行以下操作:
    • 对于"单点登录 URL",输入您的 Web 应用程序端点。
    • 自定义应用程序端点 URL 格式:[您的 URL]/saml(例如http://localhost: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(例如 http://localhost:8000/saml)

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

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

      <
    • 对于 Audience URI(SP 身份 ID),输入以下 AWS 端点:https://signin.aws.amazon.com/saml
    • 对于 Name ID 格式,设置为 Persistent。
    • 然后,向下滚动到页面底部并选择 Next。
  • 在 Create SAML Integration 页面上选择最佳选项,然后单击 Finish。您将被重定向到应用程序摘要页面。
  • 在应用程序摘要页面上,从顶部导航菜单中选择分配,然后选择分配
  • 接下来,下载 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 中的分配的 iam-idp 名称。
    • "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 Business 应用程序

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

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

步骤 5:设置 Q Business Retriever

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

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

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

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

步骤 6:链接 Q Business 数据源

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

如果您使用 Amazon Q Business 检索器,则可以从以下选项中进行选择:

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

步骤 7:管理访问权限

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

  • 登录 AWS 管理控制台并打开 Amazon Q Business 控制台。
  • 完成创建 Amazon Q Business 应用程序的步骤。
  • 将默认订阅层设置为 Q Business Pro 或 Q Business Lite。这将是所有用户登录您的 Web 体验的默认设置。
  • 选择"创建应用程序"。

自定义 Web 体验

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

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

将应用程序连接到单个 IdP

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

使用 SAML

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

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

使用 OIDC

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

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

创建 IAM API 应用程序

完成下面提到的步骤,使用 API 创建 IAM 联合应用程序

先决条件

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

  • 创建 Amazon Q Business 应用程序。
  • 创建 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 角色。为此,请执行以下步骤:
    • 创建一个名为 strategies 的目录。
    • <
    • 在该目录中,创建并保存一个名为 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 策略。为此,请执行以下步骤:

      在策略目录中,创建并保存一个名为 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