我一直在努力弄清楚如何从我的EC2实例与Amazon ES服务进行通信。
文档明确指出,Amazon ES服务支持IAM用户&基于角色的访问策略。 http://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-createupdatedomains.html#es-createdomain-configure-access-policies
但是,当我的ES域具有此访问策略时:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789:role/my-ec2-role"
},
"Action": "es:*",
"Resource": "arn:aws:es:us-west-2:123456789:domain/myDomain/*"
}
]
}
我无法登录ec2实例并运行curl来访问我的弹性搜索群集。
尝试对_search API进行简单的卷曲:
curl "http://search-myDomain.es.amazonaws.com/_search"
生成身份验证错误响应:
{"Message":"User: anonymous is not authorized to perform: es:ESHttpGet on resource: arn:aws:es:us-west-2:123456789:domain/myDomain/_search"}
为了更安全,我将AmazonESFullAccess
政策放在我的IAM角色上,仍然无法运作。
我必须遗漏一些东西,因为能够以编程方式从使用IAM角色的ec2实例与Elasticsearch进行交互,这对于使用Amazon ES服务完成任何事情至关重要。
我也在文档中看到了这个矛盾的陈述。
基于IAM的策略示例您可以通过以下方式创建基于IAM的访问策略 使用AWS IAM控制台而不是Amazon ES控制台。对于 有关创建基于IAM的访问策略的信息,请参阅IAM 文档。
IAM文档的链接指向IAM的主页,其中包含有关如何执行此操作的零信息。有人为我找到了解决方案吗?
答案 0 :(得分:12)
在AWS中使用IAM服务时,您必须签署您的请求。 curl不支持已签名的请求(包括对请求进行散列并将参数添加到请求的标头中)。您可以使用其中内置了签名算法的SDK,然后提交该请求。
您可以在此处找到热门语言的SDK: http://aws.amazon.com/tools/
答案 1 :(得分:6)
首先,您说您无法登录EC2实例来卷曲ES实例?你不能登录?或者你不能从EC2卷曲它?
我的Elasticsearch(服务)实例向全世界开放(没有任何内容),并且能够很好地卷曲它,无需签名。我更改了访问策略以进行测试,但不幸的是,更改它后需要永远重新启动...
我的政策如下:
{ "Version": "2012-10-17", "Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": "*",
"Action": "es:*",
"Resource": "arn:aws:es:us-east-1:843348267853:domain/myDomain/*"
},
{
"Sid": "",
"Effect": "Allow",
"Principal": "*",
"Action": "es:*",
"Resource": "arn:aws:es:us-east-1:843348267853:domain/myDomain"
}
]
}
我意识到这不是你想要的,但是从这个开始(对世界开放),从外部卷曲并测试它。然后限制它,这样你就可以隔离问题。
另外,我认为您的访问政策中存在“Principal”问题。你有你的EC2角色。我明白你为什么这样做,但我认为校长需要一个用户,而不是一个角色。
见下文:
主要
指定允许或拒绝访问的AWS账户或IAM用户 到资源。指定通配符(*)可以进行匿名访问 域名,不推荐。如果您启用了匿名 访问权限,我们强烈建议您添加基于IP的条件 限制哪些IP地址可以向Amazon ES提交请求 域。
编辑1
要清楚,您已将AmazonESFullAccess策略添加到my-ec2-role?如果你打算使用IAM访问策略,我认为你不能附加一个基于资源的策略(这就是你正在做的事情)。
http://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_compare-resource-policies.html
对于某些AWS服务,您可以向您的帐户授予跨帐户访问权限 资源。为此,请将策略直接附加到资源 您想要共享,而不是使用角色作为代理。该 要共享的资源必须支持基于资源的策略。 与基于用户的策略不同,基于资源的策略指定了谁(在 AWS账户ID号列表的形式可以访问 资源。
可能会尝试完全删除访问策略吗?
答案 2 :(得分:2)
为什么您不使用弹性IP创建代理并允许您的代理访问您的ES? 基本上存在三种形式,您可以限制ES中的访问:
我使用两种形式,在我的php应用程序中,我更喜欢在连接到ES后使用代理,在我的nodejs应用程序中,我更喜欢使用http-aws-es节点模块来签署我的请求。 创建代理环境非常有用,因为我的用户需要访问kibana界面才能查看某些报告,因为他们已经在浏览器中配置了代理,所以可以这样做。)
我必须建议您关闭对ES索引的访问权限,因为它很容易删除它们,curl -XDELETE https://your_es_address/index任何人都可以这样做但你可以说:"如何其他用户将获得我的ES地址?"我会回答你:"基于朦胧的安全并不是真正的安全"
我的安全访问策略基本上就是这样:
答案 3 :(得分:1)
我最近遇到了这个问题,根本问题是没有任何Amazon SDK支持调用Elasticsearch操作,如search,put等。
目前唯一的解决方法是使用签名请求直接针对端点执行请求: http://docs.aws.amazon.com/general/latest/gr/sigv4-signed-request-examples.html
此处的示例用于调用EC2,但可以将其修改为调用Elasticsearch。只需将“服务”值修改为“es”即可。从那里,你必须填写
的值请注意,到目前为止,我只是设法使用AWS凭据,因为我们假设您将访问密钥和密钥传递给各种签名调用(示例中为access_key和secret_key)。使用IAM角色应该可行,但您必须首先调用安全令牌服务以获取可用于签署请求的临时凭据。在您这样做之前,请务必在Elasticsearch集群上编辑您的访问策略以允许用户信用(用户/
答案 4 :(得分:0)
您需要签署请求,很遗憾,官方的Elasticsearch库不再支持该请求。检查此Github问题(https://github.com/elastic/elasticsearch-js/issues/1182#issuecomment-630641702)
他们想实施自己的云解决方案