本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
亚马逊的身份和访问管理OpenSearch服务
亚马逊OpenSearch服务提供了多种控制域名访问权限的方法。本主题介绍了各种策略类型,其彼此交互的方式,以及如何创建您自己的自定义策略。
重要
VPC 支持引入了一些额外的注意事项OpenSearch服务访问控制。有关更多信息,请参阅关于 VPC 域的访问策略:
策略的类型
OpenSearch服务支持三种类型的访问策略:
基于资源的策略
您可以在创建域时添加基于资源的策略(通常称为域访问策略)。这些策略指定主体可以对域的子资源执行哪些操作(跨集群搜索除外)。子资源包括OpenSearch索引和 API。Principal 元素指定账户、用户或允许访问的角色。Resource 元素指定这些委托人可以访问哪些子资源。
例如,以下基于资源的策略将授予 test-user
针对 test-domain
上的子资源的完全访问权限 (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
将无法添加或修改文档。
接下来,您可以决定为高级用户配置角色。此策略提供对索引中所有 URI 的 HTTP GET 和 PUT 方法的 power-user-role
访问权限:
{ "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服务域,您可以使用基于身份的策略将基于身份的策略附加到用户或角色Amazon Identity and Access Management(IAM) 服务。与基于资源的策略一样,基于身份的策略指定谁可以访问服务,他们可以执行哪些操作,以及他们可以对哪些资源执行这些操作(如果适用)。
虽然不一定,但基于身份的策略往往更通用。它们通常仅控制用户可执行的配置 API 操作。制定这些策略后,您可以使用基于资源的策略(或精细的访问控制) 在OpenSearch为用户提供访问权限的服务OpenSearch索引和 API。
注意
具有 Amazon 托管的 AmazonOpenSearchServiceReadOnlyAccess
策略的用户无法查看控制台上的集群运行状况。允许他们查看集群运行状况(和其他OpenSearch数据),添加es:ESHttpGet
对访问策略执行操作并将其附加到其帐户或角色。
由于基于身份的策略附加到用户或角色 (委托人),JSON 不会指定委托人。以下策略授予对以 Describe
和 List
开头的操作的访问权限。这种操作组合提供对域配置的只读访问权限,但不提供对域本身中存储的数据的访问权限:
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "es:Describe*", "es:List*" ], "Effect": "Allow", "Resource": "*" } ] }
管理员可能拥有对以下内容的完全访问权限OpenSearch服务和所有数据存储在所有域上:
{ "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" ] } } }] }
您也可以使用标签来控制对的访问权限OpenSearchAPI。基于标签的策略OpenSearchAPI 仅适用于 HTTP 方法。例如,以下策略允许附属的主体向 GET 和 PUT 请求发送OpenSearch如果域名有,则为 APIenvironment:production
标签:
{ "Version": "2012-10-17", "Statement": [{ "Action": [ "es:ESHttpGet", "es:ESHttpPut" ], "Effect": "Allow", "Resource": "*", "Condition": { "ForAnyValue:StringEquals": { "aws:ResourceTag/environment": [ "production" ] } } }] }
为了更精细地控制OpenSearchAPI,可以考虑使用精细的访问控制。
注意
在您添加一个或多个之后OpenSearch任何基于标签的策略的 API,您都必须执行单个策略标签操作(例如添加、删除或修改标签),以使更改在域上生效。您必须使用服务软件 R20211203 或更高版本才能包括OpenSearch基于标签的策略中的 API 操作。
OpenSearch服务支持RequestTag
和TagKeys
配置 API 的全局条件密钥,而不是OpenSearchAPI。这些条件仅适用于在请求中包含标签的 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服务域,它允许你使用像这样的客户端卷曲
注意
如果您为您的域启用了 VPC 访问,则无法配置基于 IP 的策略。但您可以使用安全组来控制哪些 IP 地址可以访问该域。有关更多信息,请参阅关于 VPC 域的访问策略:
以下策略向源自指定 IP 范围的所有 HTTP 请求授予对 test-domain
的访问权限:
{ "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必须对服务配置 API 进行签名。如果您的策略指定 IAM 角色或用户,则向OpenSearch还必须使用 API 进行签名Amazon签名版本 4. 签名方法因 API 而异:
-
要给... 打电话OpenSearch服务配置 API,我们建议您使用其中一个Amazon软件开发工具包
。与创建和签署您自己的请求相比,开发工具包可大大简化流程,从而为您节省大量时间。配置 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 代码示例,请参阅使用Amazon与亚马逊互动的 SDKOpenSearch服务。
-
要调用 OpenSearch API,您必须签署您自己的请求。有关各种语言的示例代码,请参阅。OpenSearch API 采用以下格式:
domain-id
.region
.es.amazonaws.com例如,以下请求将在
movies
索引中搜索 thor:GET https://
my-domain
.us-east-1
.es.amazonaws.com/movies/_search?q=thor
注意
对于用签名版本 4 签署的 HTTP POST 请求,服务会忽略在 URL 中传入的参数。
当策略发生冲突时
当策略不一致或没有明确提到某个用户时,复杂性将提高。IAM 用户指南中的了解 IAM 的工作方式提供了策略评估逻辑的简明摘要:
-
默认情况下,所有请求都将被拒绝。
-
显式允许将取代此默认设置。
-
显式拒绝将覆盖任何允许。
例如,如果基于资源的策略授予您访问域子资源的权限(OpenSearch索引或 API),但基于身份的策略拒绝您访问,您被拒绝访问。如果某个基于身份的策略授予访问权限,基于资源的策略不指定您是否应具有访问权限,则您将被允许访问。请参阅以下交叉策略表,了解域子资源结果的完整摘要。
在基于资源的策略中允许 | 在基于资源的策略中拒绝 | 在基于资源的策略中既不允许也不拒绝 | |
---|---|---|---|
Allowed in identity-based policy |
Allow(允许) |
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 策略元素 | 摘要 |
---|---|
Version |
当前版本的策略语言为 |
Effect |
此元素指定该语句是允许还是拒绝对特定操作的访问。有效值为 |
Principal |
此元素指定允许或拒绝访问资源的 Amazon Web Services 账户 或 IAM 角色或用户,并可采用多种形式:
指定 |
Action
|
OpenSearch服务用途 某些 有关所有可用操作的列表以及它们是否适用于域子资源 ( 虽然 当然,您完全可以在限制性较低的资源元素旁包括如下操作:
要了解有关配对操作和资源的更多信息,请参阅此表中的 |
Condition |
OpenSearch服务支持中描述的大多数条件Amazon全局条件上下文密钥在里面IAM 用户指南。值得注意的例外包括 配置基于 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
授予对 test-index
和 OpenSearch 批量 API 的完全访问权限。它还允许对 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操作,请参见亚马逊的精细访问控制OpenSearch服务。
配置访问策略
-
有关创建或修改基于资源和 IP 的策略的说明,请参阅OpenSearch服务,请参阅配置访问策略。
-
有关在 IAM 中创建或修改基于身份的策略的说明,请参阅《IAM 用户指南》中的创建 IAM policy。
其他示例策略
虽然本章包含许多示例策略,但 Amazon 访问控制是一个复杂的主题,最好是通过示例理解。有关更多信息,请参阅 IAM 用户指南中 IAM 基于身份的策略示例。