本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
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:ESHttpPut
或 es: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 不指定委託人。下列政策授與動作存取權,該動作的開頭是 Describe
和 List
。這組動作提供的唯讀存取權限用於網域組態,而非儲存在網域本身的資料:
{ "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 的RequestTag
和TagKeys
全域條件金鑰,而不是 OpenSearch API。這些條件僅適用於在請求中包含標籤的 API 呼叫,例如 CreateDomain
、AddTags
以及 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 網域的未簽署要求,這可讓您使用 curl
注意
如果為網域啟用 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例如,以下請求將搜尋 thor 的
movies
索引: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 |
目前版本的政策語言是 |
Effect |
此元素指定公告內容是否允許或拒絕對指定動作的存取。有效值為 |
Principal |
此元素指定允許 AWS 帳戶 或拒絕存取資源的或 IAM 角色或使用者,並且可以採用多種形式:
|
Action
|
OpenSearch 服務使用 OpenSearch HTTP 方法的 某些特定 如需所有可用動作的清單,以及它們是套用至網域子資源 ( 由於 當然,您有權利納入一些動作來搭配較無限制性的資源元素,如下所示:
若要進一步了解有關配對動作和資源的詳細資訊,請參閱此表格中的 |
Condition |
OpenSearch 服務支援 IAM 使用者指南中AWS 全域條件內容金鑰中所述的大部分條件。值得注意的例外包括 當設定以 IP 為基礎的政策時,您可指定 IP 地址或 CIDR 區塊當做條件,如下所示:
如中所述身分型政策, |
Resource |
OpenSearch 服務以三種基本方式使用
如需有關哪些動作支援資源層級許可的詳細資訊,請參閱此表格中的 |
進階選項和 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/_search
和GET 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 金鑰) 的以資源為基礎的政策
設定存取政策
其他範例政策
雖然本章包含許多範例原則,但 AWS 存取控制是一個複雜的主題,最能透過範例瞭解。如需詳細資訊,請參閱 IAM 使用者指南中的 IAM 以身分為基礎的政策範例。