26

我一直在努力弄清楚如何从我的 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 来访问我的 elasticsearch 集群。

尝试做一个简单的 _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 的策略示例 您可以使用 AWS IAM 控制台而不是 Amazon ES 控制台创建基于 IAM 的访问策略。有关创建基于 IAM 的访问策略的信息,请参阅 IAM 文档。

指向 IAM 文档的链接是 IAM 的主页,并且包含有关如何执行此操作的完全零信息。有人为我提供解决方案吗?

4

5 回答 5

15

将 IAM 服务与 AWS 一起使用时,您必须签署您的请求。curl 不支持签名请求(包括对请求进行哈希处理并将参数添加到请求的标头)。您可以使用其中一个内置签名算法的 SDK,然后提交该请求。

请参阅: http ://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/what-is-amazon-elasticsearch-service.html#signing-requests

您可以在此处找到流行语言的 SDK:http: //aws.amazon.com/tools/

于 2015-11-09T22:51:20.773 回答
8

首先,你说不能登录EC2实例来curl 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"
    }   
   ] 
}

我意识到这并不完全是您想要的,但是从这个(向世界开放)开始,从 AWS 外部进行 curl 并对其进行测试。然后限制它,这样你就可以隔离问题。

另外,我认为您的访问策略中的“委托人”有问题。您拥有自己的 EC2 角色。我理解你为什么这样做,但我认为校长需要一个用户,而不是一个角色。

见下文:

http://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-createupdatedomains.html#es-createdomain-configure-access-policies

主要的

指定允许或拒绝访问资源的 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 号列表的形式)可以访问该资源。

可能尝试完全删除访问策略?

于 2015-11-10T07:08:48.583 回答
2

为什么不创建具有弹性 ip 的代理并允许您的代理访问您的 ES?基本上存在三种形式,您可以在 ES 中限制访问:

  • 允许所有人
  • 白 IP 名单
  • 签署 AWS 提供的访问密钥和秘密密钥。

我使用两种形式,在我的 php 应用程序中,我更喜欢在连接到 ES 后使用代理,在我的 nodejs 应用程序中,我更喜欢使用 http-aws-es 节点模块对我的请求进行签名。创建代理环境很有用,因为我的用户需要访问 kibana 界面才能查看一些报告,这可能是因为他们已经在浏览器中配置了代理 =)

我必须建议您关闭对 ES 索引的访问,因为删除它们非常容易, curl -XDELETE https://your_es_address/index 任何人都可以这样做,但您可以说:“其他用户将如何获得我的 ES 地址?” 我会回答你:“基于昏暗的安全不是真正的安全”

我的安全访问策略基本上是这样的:

http://pastebin.com/EUKT1ekX

于 2016-04-12T10:45:48.997 回答
1

我最近遇到了这个问题,根本问题是 Amazon SDK 尚不支持调用 Elasticsearch 操作,如搜索、放置等。

目前唯一的解决方法是使用签名请求直接针对端点执行请求:http: //docs.aws.amazon.com/general/latest/gr/sigv4-signed-request-examples.html

此处的示例用于调用 EC2,但可以修改为调用 Elasticsearch。只需将“service”值修改为“es”即可。从那里,您必须填写值

  • 端点(这是您的集群的完整 URL,包括不带请求参数的操作)
  • 主机(https:// 和您的规范 URI 之间的部分,例如 /_status
  • 规范 uri,它是第一个 / 包含后的 URI(如 /_status)但没有查询字符串
  • 请求参数(包括 ? 之后的所有内容)

请注意,到目前为止,我只设法使用 AWS 凭证来完成这项工作,因为假设您将访问密钥和秘密密钥传递给各种签名调用(示例中的 access_key 和 secret_key)。使用 IAM 角色应该是可行的,但您必须首先调用安全令牌服务以获取可用于签署请求的临时凭证。在您这样做之前,请务必在 Elasticsearch 集群上编辑您的访问策略以允许用户凭据(用户/

于 2015-11-30T19:27:56.493 回答
0

您需要签署您的请求,不幸的是,官方的弹性搜索库不再支持它。检查这个 Github 问题(https://github.com/elastic/elasticsearch-js/issues/1182#issuecomment-630641702

他们希望实施自己的云解决方案

于 2020-10-29T22:34:02.690 回答