為儀表板設定 Amazon Cognito 份驗證 OpenSearch - Amazon OpenSearch 服務

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

為儀表板設定 Amazon Cognito 份驗證 OpenSearch

您可以使用 Amazon Cognito 驗證和保護您的亞馬遜 OpenSearch 服務預設 OpenSearch儀表板安裝。Amazon Cognito 身份驗證是選用的,且僅適用於使用 OpenSearch 或彈性搜尋 5.1 或更新版本的網域。如果您不設定 Amazon Cognito 身分驗證,您仍然可以使用以 IP 為基礎的存取政策代理伺服器、HTTP 基本身分驗證或 SAML 來保護 Dashboards。

大部分身份驗證程序都發生在 Amazon Cognito 中,但本節提供了將 Amazon Cognito 資源設定為與 OpenSearch 服務網域搭配使用的指導方針和要求。標準定價適用於所有 Amazon Cognito 資源。

提示

第一次設定網域以使用 OpenSearch 儀表板的 Amazon Cognito 身份驗證時,建議您使用主控台。Amazon Cognito 資源完全可自訂,而主控台可協助您識別和了解重要的功能。

先決條件

您必須滿足數個先決條件,才能為 OpenSearch 儀表板設定 Amazon Cognito 身份驗證。 OpenSearch 服務主控台有助於簡化這些資源的建立,但瞭解每個資源的用途有助於設定和疑難排解。針對 Dashboards 的 Amazon Cognito 身分驗證需要下列資源:

  • Amazon Cognito 使用者集區

  • Amazon Cognito 身分集區

  • 連接 AmazonOpenSearchServiceCognitoAccess 政策的 IAM 角色 (CognitoAccessForAmazonOpenSearch)

注意

使用者集區和身分集區必須在相同的 AWS 區域。您可以使用相同的使用者集區、身分集區和 IAM 角色,將儀表板的 Amazon Cognito 身份驗證新增到多個 OpenSearch 服務網域。如需進一步了解,請參閱 配額

關於使用者集區

使用者集區有兩個主要功能:建立和管理使用者目錄,並讓使用者註冊和登入。如需建立使用者集區的說明,請參閱 Amazon Cognito 開發人員指南中的建立使用者集區

當您建立要搭配 OpenSearch Service 使用的使用者集區時,請考量下列事項:

  • 您的 Amazon Cognito 使用者集區必須擁有網域名稱。 OpenSearch 服務使用此網域名稱將使用者重新導向至登入頁面以存取儀表板。除了網域名稱,使用者集區不需要任何非預設組態。

  • 您必須指定集區所需的標準屬性 -​ 例如名稱、出生日期、電子郵件地址和電話號碼等屬性。在您建立使用者集區之後您無法變更這些屬性,因此請選擇目前對您重要的屬性。

  • 建立您的使用者集區時,選擇使用者是否可以建立自己的帳戶、帳戶的最低密碼強度,以及是否啟用多重要素驗證。如果您計劃使用外部身分提供者,這些設定是無關緊要的。通常,您可以讓使用者集區做為身分提供者並且啟用外部身分提供者,但大多數使用者偏好非此即彼。

使用者集區 ID 採用 region_ID 格式。如果您打算使用 AWS CLI 或 AWS SDK 來設定 OpenSearch 服務,請記下 ID。

關於身分集區

身分集區可讓您在使用者登入後將臨時受限的許可角色指派給使用者。如需有關建立身分集區的說明,請參閱 Amazon Cognito 開發人員指南中的身分集區。當您建立要搭配 OpenSearch Service 使用的身分識別集區時,請考量下列事項:

  • 如果您使用 Amazon Cognito 主控台,您必須選擇 Enable access to unauthenticated identities (允許存取未經驗證的身分) 核取方塊,以建立身分集區。建立身分集區並設定 OpenSearch 服務網域後,Amazon Cognito 會停用此設定。

  • 您不需要新增外部身分提供者到身分集區。當您將 OpenSearch 服務設定為使用 Amazon Cognito 身份驗證時,它會將身分集區設定為使用您剛建立的使用者集區。

  • 建立身分集區之後,您必須選擇未經授權和經過授權的 IAM 角色。這些角色指定使用者登入前後的存取政策。如果您使用 Amazon Cognito 主控台,它可為您建立這些角色。在您建立經過授權的角色後,請記下採用 arn:aws:iam::123456789012:role/Cognito_identitypoolnameAuth_Role 格式的 ARN。

身分集區 ID 採用 region:ID-ID-ID-ID-ID 格式。如果您打算使用 AWS CLI 或 AWS SDK 來設定 OpenSearch 服務,請記下 ID。

關於 CognitoAccessForAmazonOpenSearch角色

OpenSearch 服務需要許可才能設定 Amazon Cognito 使用者和身分集區,並將其用於身分驗證。您可以為此目的使用AmazonOpenSearchServiceCognitoAccess,這是一個AWS受管理的策略。 AmazonESCognitoAccess是服務重新命名為 Amazon OpenSearch 服務AmazonOpenSearchServiceCognitoAccess時所取代的舊版政策。這兩個政策提供啟用 Cognito 身分驗證所必需的最低 Amazon Cognito 許可。如需了解政策 JSON,請參閱 IAM 主控台

如果您使用主控台建立或設定 OpenSearch 服務網域,它會為您建立 IAM 角色,並將AmazonOpenSearchServiceCognitoAccess政策 (如果是 Elasticsearch 網域的AmazonESCognitoAccess政策) 附加至該角色。此角色的預設名稱為 CognitoAccessForAmazonOpenSearch

角色權限原則AmazonOpenSearchServiceCognitoAccessAmazonESCognitoAccess兩者都允許 OpenSearch Service 在所有身分識別和使用者集區上完成下列動作:

  • 動作:cognito-idp:DescribeUserPool

  • 動作:cognito-idp:CreateUserPoolClient

  • 動作:cognito-idp:DeleteUserPoolClient

  • 動作:cognito-idp:UpdateUserPoolClient

  • 動作:cognito-idp:DescribeUserPoolClient

  • 動作:cognito-idp:AdminInitiateAuth

  • 動作:cognito-idp:AdminUserGlobalSignOut

  • 動作:cognito-idp:ListUserPoolClients

  • 動作:cognito-identity:DescribeIdentityPool

  • 動作:cognito-identity:SetIdentityPoolRoles

  • 動作:cognito-identity:GetIdentityPoolRoles

如果您使用AWS CLI或其中一個 AWS SDK,則必須在設定 OpenSearch Service 網域時建立自己的角色、附加原則,並指定此角色的 ARN。角色必須具有下列信任關係:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "opensearchservice.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }

如需說明,請參閱 IAM 使用者指南中的建立角色以委派許可給 AWS 服務連接及分開 IAM 政策

設定網域以使用 Amazon Cognito 身分驗證

完成先決條件後,您可以將 OpenSearch 服務網域設定為使用適用於儀表板的 Amazon Cognito。

注意

並非所有 AWS 區域 皆可使用 Amazon Cognito。如需支援區域的清單,請參閱 AWS 區域 和節點。您不需要為用於 OpenSearch 服務的 Amazon Cognito 使用相同的區域。

設定 Amazon Cognito 身分驗證 (主控台)

由於主控台會為您建立CognitoAccessForAmazonOpenSearch角色,因此可提供最簡單的設定體驗。除了標準 OpenSearch 服務許可之外,您還需要以下一組許可,才能使用主控台建立使用 Amazon Cognito 身份驗證 OpenSearch 儀表板的網域。

{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": [ "ec2:DescribeVpcs", "cognito-identity:ListIdentityPools", "cognito-idp:ListUserPools", "iam:CreateRole", "iam:AttachRolePolicy" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "iam:GetRole", "iam:PassRole" ], "Resource": "arn:aws:iam::123456789012:role/service-role/CognitoAccessForAmazonOpenSearch" } ] }

如需有關將許可新增至身分 (使用者、使用者群組或角色) 的說明,請參閱新增 IAM 身分許可 (主控台)

如果 CognitoAccessForAmazonOpenSearch 已存在,您需要的許可更少:

{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": [ "ec2:DescribeVpcs", "cognito-identity:ListIdentityPools", "cognito-idp:ListUserPools" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "iam:GetRole", "iam:PassRole" ], "Resource": "arn:aws:iam::123456789012:role/service-role/CognitoAccessForAmazonOpenSearch" } ] }
若要設定 Dashboards 的 Amazon Cognito 身分驗證 (主控台)
  1. 在以下位置打開亞馬遜 OpenSearch 服務控制台 https://console.aws.amazon.com/aos/home/

  2. Domains (網域) 下,選取您要設定的網域。

  3. 選擇 Actions (動作)、Edit security configuration (編輯安全組態)。

  4. 選擇 Enable Amazon Cognito authentication (啟用 Amazon Cognito 身分驗證)。

  5. 對於 Region (區域),選擇包含您的 Amazon Cognito 使用者集區與身分集區的 AWS 區域。

  6. 對於 Cognito user pool (Cognito 使用者集區),選擇使用者集區或建立集區。如需準則,請參閱關於使用者集區

  7. 對於 Cognito identity pool (Cognito 身分集區),選擇身分集區或建立集區。如需準則,請參閱關於身分集區

    注意

    Create user pool (建立使用者集區) 和 Create identity pool (建立身分集區) 連結會將您導向到 Amazon Cognito 主控台,並要求您手動建立這些資源。此程序不是自動的。如需進一步了解,請參閱 先決條件

  8. 對於 IAM role name (IAM 角色名稱),使用 CognitoAccessForAmazonOpenSearch 的預設值 (建議) 或輸入新名稱。若要進一步了解此角色的目的,請參閱關於 CognitoAccessForAmazonOpenSearch角色

  9. 選擇 Save Changes (儲存變更)。

在您的網域完成處理之後,請參閱允許已經過身分驗證的角色設定身分提供者以取得其他設定步驟。

設定 Amazon Cognito 身分驗證 (AWS CLI)

使用--cognito-options參數來設定您的 OpenSearch 服務網域。由 create-domainupdate-domain-config 命令使用以下語法:

--cognito-options Enabled=true,UserPoolId="user-pool-id",IdentityPoolId="identity-pool-id",RoleArn="arn:aws:iam::123456789012:role/CognitoAccessForAmazonOpenSearch"

範例

以下範例在 us-east-1 區域建立網域,該區域使用 CognitoAccessForAmazonOpenSearch 角色來啟用 Dashboards 的 Amazon Cognito 身分驗證,並提供對 Cognito_Auth_Role 的網域存取:

aws opensearch create-domain --domain-name my-domain --region us-east-1 --access-policies '{ "Version":"2012-10-17", "Statement":[{"Effect":"Allow","Principal":{"AWS": ["arn:aws:iam::123456789012:role/Cognito_Auth_Role"]},"Action":"es:ESHttp*","Resource":"arn:aws:es:us-east-1:123456789012:domain/*" }]}' --engine-version "OpenSearch_1.0" --cluster-config InstanceType=m4.xlarge.search,InstanceCount=1 --ebs-options EBSEnabled=true,VolumeSize=10 --cognito-options Enabled=true,UserPoolId="us-east-1_123456789",IdentityPoolId="us-east-1:12345678-1234-1234-1234-123456789012",RoleArn="arn:aws:iam::123456789012:role/CognitoAccessForAmazonOpenSearch"

在您的網域完成處理之後,請參閱允許已經過身分驗證的角色設定身分提供者以取得其他設定步驟。

設定 Amazon Cognito 身分驗證 (AWS 開發套件)

開AWS發套件 (Android 和 iOS 開發套件除外) 支援亞馬遜 OpenSearch 服務 API 參考中定義的所有操作,包括CreateDomainUpdateDomainConfig操作的CognitoOptions參數。如需安裝與使用 AWS 開發套件的詳細資訊,請參閱 AWS 軟體開發套件

在您的網域完成處理之後,請參閱允許已經過身分驗證的角色設定身分提供者以取得其他設定步驟。

允許已經過身分驗證的角色

依預設,您依照中的準則設定的已驗證 IAM 角色關於身分集區沒有存取 OpenSearch 儀表板的必要權限。您必須提供該角色額外的許可。

注意

如果您設定了精細的存取控制,並使用開放式或 IP 型存取原則,則可以略過此步驟。

您可以在以身分識別為基礎的原則中包含這些權限,但除非您希望經過驗證的使用者能夠存取所有 OpenSearch Service 網域,否則附加至單一網域的資源型原則是較好的方法。

針對 Principal,指定您使用 關於身分集區 中的準則設定之 Cognito 經身分驗證角色的 ARN。

{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Principal":{ "AWS":[ "arn:aws:iam::123456789012:role/Cognito_identitypoolnameAuth_Role" ] }, "Action":[ "es:ESHttp*" ], "Resource":"arn:aws:es:region:123456789012:domain/domain-name/*" } ] }

如需將以資源為基礎的原則新增至 OpenSearch 服務網域的指示,請參閱設定存取政策

設定身分提供者

當您將網域設定為針對儀表板使用 Amazon Cognito 身份驗證時,Ser OpenSearch vice 會將應用程式用戶端新增到使用者集區,並將使用者集區作為身分驗證提供者新增至身分集區。

警告

不重新命名或刪除應用程式用戶端。

根據您設定使用者集區的方式而定,您可能需要手動建立使用者帳戶,或者使用者可以建立自己的帳戶。如果這些設定是可接受的,您便無需做進一步的動作。不過,許多人偏好使用外部身分提供者。

若要啟用 SAML 2.0 身分提供者,您必須提供 SAML 中繼資料文件。若要啟用社交身分提供者,例如,Login with Amazon、Facebook 和 Google,您必須擁有這些供應商提供的應用程式 ID 和應用程式密碼。您可以啟用任意組合的身分提供者。

設定使用者集區的最簡單方式就是使用 Amazon Cognito 主控台。如需說明,請參閱 Amazon Cognito 開發人員指南中的使用來自使用者集區的聯合為您的使用者集區應用程式指定身分提供者設定

(選用) 設定精細分級的存取

您可能已經注意到預設的身分集區設定指派每位登入的使用者相同的 IAM 角色 (Cognito_identitypoolAuth_Role),這表示每位使用者可以存取相同的 AWS 資源。如果您想要搭配使用精細存取控制與 Amazon Cognito (例如,如果希望您組織的分析師擁有多個索引的唯讀存取權,而開發人員擁有所有索引的寫入存取權),您有兩個選擇:

  • 建立使用者群組並設定您的身分提供者,以根據使用者的身分驗證字符選擇 IAM 角色 (建議)。

  • 設定您的身分提供者,以根據一個或多個規則選擇 IAM 角色。

如需包含精細存取控制的演練,請參閱 教學課程:使用 IAM 主要使用者和 Amazon Cognito 身分驗證設定網域

重要

與預設角色相似,Amazon Cognito 必須是每個額外角色信任關係的一部分。如需詳細資訊,請參閱 Amazon Cognito 開發人員指南中的建立角色以進行角色映射

使用者群組和字符

當您建立使用者群組時,您為群組成員選擇 IAM 角色。如需有關建立群組的資訊,請參閱 Amazon Cognito 開發人員指南中的使用者群組

在您建立一或多個使用者群組後,您可以設定您的驗證供應商,以指派使用者其群組的角色,而不是身分集區的預設角色。選取 Choose role from token (從字符中選擇角色),然後選擇 Use default Authenticated role (使用預設已經過身分驗證的角色) 或 DENY (拒絕),以指定身分集區應該如何處理不屬於群組的使用者。

規則

規則本質上是 Amazon Cognito 依序評估的一系列 if 陳述式。例如,如果使用者的電子郵件地址包含 @corporate,Amazon Cognito 會為該使用者指派 Role_A。如果使用者的電子郵件地址包含 @subsidiary,它會指派該使用者 Role_B。否則,它會指派使用者預設驗證角色。

若要進一步了解,請參閱 Amazon Cognito 開發人員指南中的使用以規則為基礎的映射來指派角色給使用者

(選用) 自訂登入頁面

您可以使用 Amazon Cognito 主控台上傳自訂標誌,並對登入頁面進行 CSS 變更。如需 CSS 屬性的說明和完整清單,請參閱 Amazon Cognito 開發人員指南中的為您的使用者集區指定應用程式 UI 自訂設定

(選用) 設定進階安全性

Amazon Cognito 使用者集區支援進階安全功能,例如多重驗證、遭盜用認證檢查和調整式驗證。如需進一步了解,請參閱 Amazon Cognito 開發人員指南中的管理安全性

測試

在您滿意您的設定之後,請驗證使用者體驗是否符合您的期望。

存取 OpenSearch 儀表板
  1. 在 Web 瀏覽器中導覽至 https://opensearch-domain/_dashboards。若要直接登入特定租用戶,請將 ?security_tenant=tenant-name 附加至 URL。

  2. 使用您慣用的登入資料登入。

  3. 載入 OpenSearch 儀表板之後,請至少設定一個索引模式。Dashboards 使用這些模式來識別您要分析的索引。輸入 *,選擇 Next step (下一步),然後選擇 Create index pattern (建立索引模式)

  4. 若要搜尋或探索您的資料,請選擇 Discover (探索)

如果此程序中的任何步驟失敗,請參閱常見的設定問題以取得故障診斷資訊。

配額

Amazon Cognito 對於許多資源有軟性限制。如果您想要為大量 OpenSearch 服務網域啟用儀表板身份驗證,請檢閱 Amazon Cognito 中的配額,並視需要增加請求限制

每個 OpenSearch 服務網域都會將應用程式用戶端新增至使用者集區,以便將驗證提供者新增至身分識別集區。如果您為 10 個以上的網域啟用 OpenSearch 儀表板身份驗證,則可能會遇到「每個身分集區的 Amazon Cognito 使用者集區提供者上限」限制。如果您超過限制,您嘗試設定為使用儀表板的 Amazon Cognito 身份驗證的任何 OpenSearch 服務網域都可能會卡在「處理」的組態狀態。

常見的設定問題

下表列出常見的設定問題和解決方案。

配置 OpenSearch 服務
問題 解決方案

OpenSearch Service can't create the role (主控台)

您沒有正確的 IAM 許可。新增 設定 Amazon Cognito 身分驗證 (主控台) 中指定的許可。

User is not authorized to perform: iam:PassRole on resource CognitoAccessForAmazonOpenSearch (主控台)

您沒有該CognitoAccessForAmazonOpenSearch角色的iam:PassRole權限。將下列政策連接至您的帳戶:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iam:PassRole" ], "Resource": "arn:aws:iam::123456789012:role/service-role/CognitoAccessForAmazonOpenSearch" } ] }

或者,您可以連接 IAMFullAccess 政策。

User is not authorized to perform: cognito-identity:ListIdentityPools on resource

您沒有 Amazon Cognito 的讀取許可。將 AmazonCognitoReadOnly 政策連接至您的帳戶。

An error occurred (ValidationException) when calling the CreateDomain operation: OpenSearch Service must be allowed to use the passed role

OpenSearch 未在CognitoAccessForAmazonOpenSearch角色的信任關係中指定服務。確認您的角色使用 關於 CognitoAccessForAmazonOpenSearch角色 中指定的信任關係。或者,使用主控台來設定 Amazon Cognito 身分驗證。主控台會為您建立一個角色。

An error occurred (ValidationException) when calling the CreateDomain operation: User is not authorized to perform: cognito-idp:action on resource: user pool

--cognito-options 中指定的角色沒有存取 Amazon Cognito 的許可。確認角色已與 AWS 受管 AmazonOpenSearchServiceCognitoAccess 政策連接。或者,使用主控台來設定 Amazon Cognito 身分驗證。主控台會為您建立一個角色。
An error occurred (ValidationException) when calling the CreateDomain operation: User pool does not exist

OpenSearch 服務找不到使用者集區。確認您已建立一個且具有正確的 ID。若要尋找 ID,您可以使用 Amazon Cognito 主控台或以下 AWS CLI 命令:

aws cognito-idp list-user-pools --max-results 60 --region region

An error occurred (ValidationException) when calling the CreateDomain operation: IdentityPool not found

OpenSearch 服務找不到身分集區。確認您已建立一個且具有正確的 ID。若要尋找 ID,您可以使用 Amazon Cognito 主控台或以下 AWS CLI 命令:

aws cognito-identity list-identity-pools --max-results 60 --region region

An error occurred (ValidationException) when calling the CreateDomain operation: Domain needs to be specified for user pool

使用者集區沒有網域名稱。您可以使用 Amazon Cognito 主控台或以下 AWS CLI 命令來設定一個:
aws cognito-idp create-user-pool-domain --domain name --user-pool-id id
存取 OpenSearch 儀表板
問題 解決方案
登入頁面不會顯示我慣用的身分提供者。

檢查您是否已依照中的指定啟用 OpenSearch 服務應用程式用戶端的身分識別提供者設定身分提供者

登入頁面看起來不似與我的組織關聯。

請參閱 (選用) 自訂登入頁面

我的登入資料無法運作。

確認您已如 設定身分提供者 中所指定,來設定身分提供者。

如果您使用使用者集區做為身分提供者,請檢查該帳戶是否存在於 Amazon Cognito 主控台上。

OpenSearch 儀表板根本不加載或無法正常工作。

Amazon Cognito 經過身分驗證的角色需要網域 (/*) 的 es:ESHttp* 許可來存取和使用 Dashboards。如 允許已經過身分驗證的角色 中所指定,檢查您新增的存取政策。

當我從一個索引標籤登出 OpenSearch 儀表板時,剩餘的索引標籤會顯示一則訊息,指出重新整理權杖已被撤銷。

當您在使用 Amazon Cognito 身份驗證時登出 OpenSearch 儀表板工作階段時, OpenSearch 服務會執行一項AdminUserGlobalSignOut作業,將您登出所有使用中的 OpenSearch 儀表板工作階段。

Invalid identity pool configuration. Check assigned IAM roles for this pool. Amazon Cognito 無權代表已經過身分驗證的使用者擔任 IAM 角色。修改角色的信任關係,使其包含:
{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Principal": { "Federated": "cognito-identity.amazonaws.com" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "cognito-identity.amazonaws.com:aud": "identity-pool-id" }, "ForAnyValue:StringLike": { "cognito-identity.amazonaws.com:amr": "authenticated" } } }] }
Token is not from a supported provider of this identity pool. 當您從使用者集區移除應用程式用戶端時,可能發生此少見的錯誤。嘗試在新的瀏覽器工作階段中開啟 Dashboards。

停用儀表板的 Amazon Cognito 份驗證 OpenSearch

使用下列步驟來停用 Dashboards 的 Amazon Cognito 身分驗證。

若要停用 Dashboards 的 Amazon Cognito 身分驗證 (主控台)
  1. 在以下位置打開亞馬遜 OpenSearch 服務控制台 https://console.aws.amazon.com/aos/home/

  2. Domains (網域) 下,選擇您要設定的網域。

  3. 選擇 Actions (動作)、Edit security configuration (編輯安全組態)。

  4. 取消選擇 Enable Amazon Cognito authentication (啟用 Amazon Cognito 身分驗證)。

  5. 選擇 Save Changes (儲存變更)。

重要

如果您不再需要 Amazon Cognito 使用者集區和身分集區,請刪除它們。否則,您需繼續負擔費用。

刪除針對儀表板使用 Amazon Cognito 身份驗證的 OpenSearch 網域

若要防止使用適用於儀表板的 Amazon Cognito 身份驗證的網域卡在處理的組態狀態中,請先刪除 OpenSearch 服務網域,然後再刪除其相關聯的 Amazon Cognito 使用者和身分集區。