Amazon OpenSearch 服務中的 Identity and Access Management - Amazon OpenSearch 服務

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

Amazon OpenSearch 服務中的 Identity and Access Management

Amazon OpenSearch 服務提供了多種方法來控制對您的域的訪問。本主題涵蓋各種政策類型、它們如何彼此互動,以及如何建立自己的自訂政策。

重要

VPC 支援引入了 OpenSearch 服務存取控制的一些額外考量。如需詳細資訊,請參閱 關於 VPC 網域上的存取政策

政策的類型

OpenSearch 服務支援三種類型的存取原則:

資源型政策

建立網域時,您可以新增以資源為基礎的政策 (通常稱為網域存取政策)。這些政策指定主體可以對域的子資源執行哪些操作 (跨叢集搜尋除外)。子資源包括 OpenSearch 索引和 API。Principal 元素指定允許存取的帳戶、使用者或角色。Resource 元素指定這些委託人可以存取哪些子資源。

例如,以下以資源為基礎的政策向 test-domain 上的子資源授予 test-user 完整存取權 (es:*):

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::123456789012:user/test-user" ] }, "Action": [ "es:*" ], "Resource": "arn:aws:es:us-west-1:987654321098:domain/test-domain/*" } ] }

此政策適用兩個重要考量:

  • 這些權限只適用於此網域。除非您在其他網域上建立類似的政策,否則 test-user 只能存取 test-domain

  • Resource 元素中的結尾 /* 很重要,並指出以資源為基礎的政策僅適用於網域的子資源,不適用於網域本身。在以資源為基礎的政策中,es:* 動作相當於 es:ESHttp*

    例如,test-user 可以提出索引請求 (GET https://search-test-domain.us-west-1.es.amazonaws.com/test-index),但不能更新網域的組態 (POST https://es.us-west-1.amazonaws.com/2021-01-01/opensearch/domain/test-domain/config)。請注意兩個端點之間的差異。存取設定 API 需要以身分識別為基礎的原則。

您可以新增萬用字元來指定部分索引名稱。此範例可識別任何以 commerce 開頭的索引︰

arn:aws:es:us-west-1:987654321098:domain/test-domain/commerce*

在此情況下,該萬用字元代表 test-user 可以向 test-domain 中名稱以 commerce 開頭的索引發出請求。

若要進一步限制 test-user,您可以套用以下政策:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::123456789012:user/test-user" ] }, "Action": [ "es:ESHttpGet" ], "Resource": "arn:aws:es:us-west-1:987654321098:domain/test-domain/commerce-data/_search" } ] }

現在 test-user 可以執行一項操作:根據 commerce-data 搜尋。其他所有網域內的索引均無法存取,而且無使用 es:ESHttpPutes:ESHttpPost 動作的許可,因此 test-user 無法新增或修改文件。

接著,您可能會決定設定進階使用者角色。這個政策可授予 power-user-role 權限,以利其操作索引中全部 URI 適用的 HTTP GET 和 PUT 方法:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::123456789012:role/power-user-role" ] }, "Action": [ "es:ESHttpGet", "es:ESHttpPut" ], "Resource": "arn:aws:es:us-west-1:987654321098:domain/test-domain/commerce-data/*" } ] }

如果您的網域位於 VPC 或使用精細存取控制,您可以使用開放網域存取政策。否則,您的網域存取政策必須包含一些限制 (依委託人或 IP 地址)。

如需有關所有可行動作的詳細資訊,請參閱政策元素參考。若要更精細地控制您的資料,請搭配使用開放網域存取政策與精細存取控制

身分型政策

不同於資源型政策 (屬於每個 OpenSearch Service 網域的一部分),您可以使用 AWS Identity and Access Management (IAM) 服務將以身分識別為基礎的政策附加到使用者或角色。就像以資源為基礎的政策一樣,以身分為基礎的政策會指定誰可以存取服務、可以執行哪些動作,以及可以在哪些資源執行那些動作 (如果適用)。

雖然他們不需要這麼做,但以身分為基礎的政策往往更加通用。它們通常只管理使用者可執行的組態 API 動作。當您有這些原則之後,您可以在 OpenSearch Service 中使用以資源為基礎的原則 (或精細的存取控制),為使用者提供 OpenSearch 索引和 API 的存取權。

注意

具有 AWS 受管理AmazonOpenSearchServiceReadOnlyAccess原則的使用者無法在主控台上看到叢集健全狀況狀態。若要允許使用者查看叢集健康狀態 (和其他 OpenSearch 資料),請將es:ESHttpGet動作新增至存取原則,並將其附加至其帳戶或角色。

由於以身分為基礎的政策附加到使用者或角色 (委託人),JSON 不指定委託人。下列政策授與動作存取權,該動作的開頭是 DescribeList。這組動作提供的唯讀存取權限用於網域組態,而非儲存在網域本身的資料:

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "es:Describe*", "es:List*" ], "Effect": "Allow", "Resource": "*" } ] }

管理員可能擁有 OpenSearch Service 的完整存取權,以及儲存在所有網域中的所有資料:

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "es:*" ], "Effect": "Allow", "Resource": "*" } ] }

身分型政策讓您能使用標籤來控制對組態 API 的存取。例如,如果網域具有 team:devops 標籤,下列政策可讓所連接的委託人檢視並更新網域的組態:

{ "Version": "2012-10-17", "Statement": [{ "Action": [ "es:UpdateDomainConfig", "es:DescribeDomain", "es:DescribeDomainConfig" ], "Effect": "Allow", "Resource": "*", "Condition": { "ForAnyValue:StringEquals": { "aws:ResourceTag/team": [ "devops" ] } } }] }

您也可以使用標籤來控制對 OpenSearch API 的存取。 OpenSearch API 的基於標籤的策略僅適用於 HTTP 方法。例如,如果網域具有environment:production標籤,下列原則可讓附加的主體將 GET 和 PUT 要求傳送至 OpenSearch API:

{ "Version": "2012-10-17", "Statement": [{ "Action": [ "es:ESHttpGet", "es:ESHttpPut" ], "Effect": "Allow", "Resource": "*", "Condition": { "ForAnyValue:StringEquals": { "aws:ResourceTag/environment": [ "production" ] } } }] }

如需對 OpenSearch API 進行更精細的控制,請考慮使用精細的存取控制

注意

將一或多個 OpenSearch API 新增至任何以標籤為基礎的原則之後,您必須執行單一標籤作業 (例如新增、移除或修改標籤),變更才能在網域上生效。您必須使用服務軟體 R20211203 或更新版本,才能在標籤式政策中包含 OpenSearch API 作業。

OpenSearch 服務支援設定 API 的RequestTagTagKeys全域條件金鑰,而不是 OpenSearch API。這些條件僅適用於在請求中包含標籤的 API 呼叫,例如 CreateDomainAddTags 以及 RemoveTags。下列政策可讓所連接的委託人建立網域,但前提是他們在請求中包含 team:it 標籤:

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": [ "es:CreateDomain", "es:AddTags" ], "Resource": "*", "Condition": { "StringEquals": { "aws:RequestTag/team": [ "it" ] } } } }

如需有關使用標籤進行存取控制,以及以資源為基礎的政策和以身分為基礎的政策之間差異的詳細資訊,請參閱 IAM 使用者指南

以 IP 為基礎的政策

以 IP 為基礎的政策,限制存取到一或多個 IP 地址或 CIDR 區塊的網域。從技術層面來看,以 IP 為基礎的政策不是明確的政策類型。反而,其乃以資源為基礎的政策,負責指定匿名委託人並包含特殊的 Condition 元素。

IP 原則的主要吸引力在於它們允許對 OpenSearch Service 網域的未簽署要求,這可讓您使用 curlOpenSearch 儀表板等用戶端,或透過 Proxy 伺服器存取網域。如需進一步了解,請參閱使用 Proxy 從 OpenSearch 儀表板存取 OpenSearch 服務

注意

如果為網域啟用 VPC 存取,您無法設定以 IP 為基礎的政策。您反而可以使用安全群組來控制哪些 IP 地址可以存取網域。如需詳細資訊,請參閱 關於 VPC 網域上的存取政策

以下政策會將對 test-domain 的存取權限授予所有來自指定 IP 範圍的 HTTP 請求:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": [ "es:ESHttp*" ], "Condition": { "IpAddress": { "aws:SourceIp": [ "192.0.2.0/24" ] } }, "Resource": "arn:aws:es:us-west-1:987654321098:domain/test-domain/*" } ] }

如果您的網域具備公有端點且不使用精細存取控制,我們建議將 IAM 委託人與 IP 地址合併。這項政策只有在請求是來自指定 IP 範圍時,才會授予 test-user HTTP 存取:

{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::987654321098:user/test-user" ] }, "Action": [ "es:ESHttp*" ], "Condition": { "IpAddress": { "aws:SourceIp": [ "192.0.2.0/24" ] } }, "Resource": "arn:aws:es:us-west-1:987654321098:domain/test-domain/*" }] }

提出和簽署 OpenSearch 服務請求

即使您設定完全開放的以資源為基礎的存取原則,對 OpenSearch Service 設定 API 的所有要求也必須簽署。如果您的政策指定 IAM 角色或使用者,對 OpenSearch API 的請求也必須使用 AWS 簽名版本 4 簽署。簽署方法因 API 而異:

  • 若要呼叫 OpenSearch 服務設定 API,建議您使用其中一個 AWS SDK。開發套件已大幅簡化程序,相較於建立和簽署您自己的請求,可為您節省大量時間。組態 API 端點使用下列格式:

    es.region.amazonaws.com/2021-01-01/

    例如,下列請求提出對 movies​ 網域進行組態變更,但是您必須自行登入 (不建議):

    POST https://es.us-east-1.amazonaws.com/2021-01-01/opensearch/domain/movies/config { "ClusterConfig": { "InstanceType": "c5.xlarge.search" } }

    若您使用其中一個開發套件,例如 Boto 3,開發套件會自動處理下列簽署:

    import boto3 client = boto3.client(es) response = client.update_domain_config( DomainName='movies', ClusterConfig={ 'InstanceType': 'c5.xlarge.search' } )

    如需 Java 程式碼範例,請參閱使用AWS與亞馬遜互動的 SDKOpenSearch服務

  • 若要呼叫 OpenSearch API,您必須簽署自己的要求。這 OpenSearch 些 API 使用以下格式:

    domain-id.region.es.amazonaws.com

    例如,以下請求將搜尋 thormovies 索引:

    GET https://my-domain.us-east-1.es.amazonaws.com/movies/_search?q=thor
注意

對於使用 Signature Version 4 簽署的 HTTP POST 請求,此服務會忽略 URL 中傳入的參數。

當政策衝突時

當與政策相違或未明確提及使用者時,事情就變得複雜了。IAM 使用者指南中的了解 IAM 如何運作提供了政策評估邏輯的簡要總結:

  • 根據預設,所有的請求一律拒絕。

  • 明確允許覆寫這個預設值。

  • 明確拒絕覆寫任何允許。

例如,如果以資源為基礎的策略授與您存取網域子資源 ( OpenSearch 索引或 API),但以身分識別為基礎的政策拒絕您存取,則您將被拒絕存取。如果以身分為基礎的政策授與存取權,但以資源為基礎的政策未指定您是否有存取權,此時您便可以存取。請參閱下表的相交政策,以了解網域子資源的完整結果摘要。

以資源為基礎的政策允許 以資源為基礎的政策拒絕 以資源為基礎的政策不允許也不拒絕
Allowed in identity-based policy

允許

Deny Allow
Denied in identity-based policy Deny Deny Deny
Neither allowed nor denied in identity-based policy Allow Deny Deny

政策元素參考

OpenSearch 服務支援 IAM 政策元素參考中的大多數政策元素,但不包括NotPrincipal. 下表顯示最常見的元素。

JSON 政策元素 Summary
Version

目前版本的政策語言是 2012-10-17。所有存取政策應該指定這個值。

Effect

此元素指定公告內容是否允許或拒絕對指定動作的存取。有效值為 AllowDeny

Principal

此元素指定允許 AWS 帳戶 或拒絕存取資源的或 IAM 角色或使用者,並且可以採用多種形式:

  • AWS 帳戶"Principal":{"AWS": ["123456789012"]}"Principal":{"AWS": ["arn:aws:iam::123456789012:root"]}

  • IAM 使用者"Principal":{"AWS": ["arn:aws:iam::123456789012:user/test-user"]}

  • IAM 角色"Principal":{"AWS": ["arn:aws:iam::123456789012:role/test-role"]}

重要

指定 * 萬用字元可匿名存取網域,但我們不建議這麼做,除非新增 IP 型條件、使用 VPC 支援,或啟用精細存取控制。此外,請仔細檢查下列原則,以確認它們未授予廣泛存取權限:

  • 附加至關聯 AWS 主體 (例如 IAM 角色) 的身分識別型政策

  • 附加至關聯 AWS 資源 (例如 AWS Key Management Service KMS 金鑰) 的以資源為基礎的政策

Action

OpenSearch 服務使用 OpenSearch HTTP 方法的ESHttp*動作。其餘的動作套用至組態 API。

某些特定 es: 動作支援資源層級的許可。例如,您可以許可使用者刪除一個特定網域,而不是許可使用者刪除任何網域。其他動作只適用於服務本身。例如,es:ListDomainNames 在單一網域的內容細節中不具任何意義,因此需要萬用字元。

如需所有可用動作的清單,以及它們是套用至網域子資源 (test-domain/*)、網域組態 (test-domain) 還是僅套用至服務 (*),請參閱服務授權參考中的 Amazon OpenSearch 服務的動作、資源和條件金鑰

以資源為基礎的政策不同於資源層級的許可。以資源為基礎的政策是附加到網域的完整 JSON 政策。資源層級許可則可讓您將動作限制到特定網域或子資源。在實務層面,您可以將資源層級許可當成選用之資源或身分為基礎的政策的一部分。

由於 es:CreateDomain 的資源層級許可不是直覺式的 - 畢竟為何要許可使用者建立一個已經存在的網域?- 使用萬用字元可為您的網域強制執行簡單的命名機制,例如 "Resource": "arn:aws:es:us-west-1:987654321098:domain/my-team-name-*"

當然,您有權利納入一些動作來搭配較無限制性的資源元素,如下所示:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "es:ESHttpGet", "es:DescribeDomain" ], "Resource": "*" } ] }

若要進一步了解有關配對動作和資源的詳細資訊,請參閱此表格中的 Resource 元素。

Condition

OpenSearch 服務支援 IAM 使用者指南AWS 全域條件內容金鑰中所述的大部分條件。值得注意的例外包括aws:PrincipalTag密鑰,該 OpenSearch 服務不支持。

當設定以 IP 為基礎的政策時,您可指定 IP 地址或 CIDR 區塊當做條件,如下所示:

"Condition": { "IpAddress": { "aws:SourceIp": [ "192.0.2.0/32" ] } }

如中所述身分型政策aws:ResourceTagaws:RequestTag、和aws:TagKeys條件金鑰適用於設定 API 以及 OpenSearch API。

Resource

OpenSearch 服務以三種基本方式使用Resource元素:

  • 對於適用於 OpenSearch 服務本身的操作es:ListDomainNames,例如或允許完全訪問權限,請使用以下語法:

    "Resource": "*"
  • 對於涉及網域組態的動作像是 es:DescribeDomain,您可以使用以下語法:

    "Resource": "arn:aws:es:region:aws-account-id:domain/domain-name"
  • 對於適用於網域子資源的動作像是 es:ESHttpGet,您可以使用以下語法:

    "Resource": "arn:aws:es:region:aws-account-id:domain/domain-name/*"

    您不必使用萬用字元。 OpenSearch 服務可讓您為每個 OpenSearch 索引或 API 定義不同的存取原則。例如,您可以限制使用者的 test-index 索引許可:

    "Resource": "arn:aws:es:region:aws-account-id:domain/domain-name/test-index"

    而不是完整存取 test-index,因為您可能會希望限制政策為只有搜尋 API:

    "Resource": "arn:aws:es:region:aws-account-id:domain/domain-name/test-index/_search"

    您甚至可以控制存取個別文件:

    "Resource": "arn:aws:es:region:aws-account-id:domain/domain-name/test-index/test-type/1"

    基本上,如果將子資源 OpenSearch 表示為 URI,則可以使用存取原則控制對其的存取。如需更進一步控制使用者能夠存取的資源,請參閱 Amazon OpenSearch 服務中的精細訪問控制

如需有關哪些動作支援資源層級許可的詳細資訊,請參閱此表格中的 Action 元素。

進階選項和 API 考量

OpenSearch 服務有幾個高級選項,其中一個具有訪問控制的含義:rest.action.multi.allow_explicit_index。它的預設設定為 true,可讓使用者在特定情況下繞過子資源許可。

例如,請考量以下以資源為基礎的政策:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::123456789012:user/test-user" ] }, "Action": [ "es:ESHttp*" ], "Resource": [ "arn:aws:es:us-west-1:987654321098:domain/test-domain/test-index/*", "arn:aws:es:us-west-1:987654321098:domain/test-domain/_bulk" ] }, { "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::123456789012:user/test-user" ] }, "Action": [ "es:ESHttpGet" ], "Resource": "arn:aws:es:us-west-1:987654321098:domain/test-domain/restricted-index/*" } ] }

此原則會授test-user與 OpenSearch 大量 API 的test-index完整存取權限。它也允許 GET 請求 restricted-index

以下索引請求因為許可錯誤而失敗:

PUT https://search-test-domain.us-west-1.es.amazonaws.com/restricted-index/movie/1 { "title": "Your Name", "director": "Makoto Shinkai", "year": "2016" }

與索引 API 不同的是,大量 API 可讓您在單一呼叫中建立、更新和刪除許多文件。您通常會在請求本文中指定這些操作,而不是在請求 URL。由於 OpenSearch 服務使用 URL 來控制對網域子資源的存取,因此實際上,test-user可以使用批量 API 進行變更restricted-index。即使使用者缺少索引的 POST 許可,以下請求仍會成功

POST https://search-test-domain.us-west-1.es.amazonaws.com/_bulk { "index" : { "_index": "restricted-index", "_type" : "movie", "_id" : "1" } } { "title": "Your Name", "director": "Makoto Shinkai", "year": "2016" }

在這種情況下,存取政策無法滿足其目的。為了防止使用者繞過這些類型的限制,您可以變更 rest.action.multi.allow_explicit_index 為 false。如果此值為 false,所有對大量、 mget、msearch API (其在請求本文中指定索引名稱) 的呼叫,便會停止運作。換言之,呼叫 _bulk 不再運作,但呼叫 test-index/_bulk 則正常運作。第二個端點包含索引名稱,因此您不需要在請求本文中指定一個。

OpenSearch 儀表板在很大程度上依賴 mget 和 msearch,因此在此更改後不太可能正常工作。若要進行部分補救,您可以保留 rest.action.multi.allow_explicit_index 為 true,並且拒絕特定使用者存取一或多個 API。

如需變更此設定的詳細資訊,請參閱進階叢集設定

同樣地,以下以資源為基礎的政策包含兩個細微問題:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:user/test-user" }, "Action": "es:ESHttp*", "Resource": "arn:aws:es:us-west-1:987654321098:domain/test-domain/*" }, { "Effect": "Deny", "Principal": { "AWS": "arn:aws:iam::123456789012:user/test-user" }, "Action": "es:ESHttp*", "Resource": "arn:aws:es:us-west-1:987654321098:domain/test-domain/restricted-index/*" } ] }
  • 儘管明確拒絕,test-user 仍然可以呼叫如 GET https://search-test-domain.us-west-1.es.amazonaws.com/_all/_searchGET https://search-test-domain.us-west-1.es.amazonaws.com/*/_search 以存取 restricted-index 中的文件。

  • 由於 Resource 元素參考 restricted-index/*test-user 未獲許可來直接存取索引的文件。不過,使用者有權刪除整個索引。為防止存取和刪除,政策必須指定 restricted-index*

不是廣泛允許和專注於拒絕,最安全的方法是遵循最小特權原則,只授與任務所需的許可。如需控制個別索引或 OpenSearch作業存取權的詳細資訊,請參閱〈〉Amazon OpenSearch 服務中的精細訪問控制

重要

指定 * 萬用字元可讓您以匿名方式存取您的網域。不建議您使用萬用字元。此外,請仔細檢查下列原則,以確認它們未授與廣泛存取權:

  • 附加至關聯 AWS 主體 (例如 IAM 角色) 的身分識別型政策

  • 附加至關聯 AWS 資源 (例如 AWS Key Management Service KMS 金鑰) 的以資源為基礎的政策

設定存取政策

  • 如需在 OpenSearch Service 中建立或修改以資源為基礎的原則和 IP 原則的指示,請參閱。設定存取政策

  • 如需有關在 IAM 中建立或修改以身分為基礎的政策之說明,請參閱 IAM 使用者指南中的建立 IAM 政策

其他範例政策

雖然本章包含許多範例原則,但 AWS 存取控制是一個複雜的主題,最能透過範例瞭解。如需詳細資訊,請參閱 IAM 使用者指南中的 IAM 以身分為基礎的政策範例