AWS Elasticsearch Service IAM基于角色的访问策略

时间:2015-10-19 00:49:25

标签: amazon-web-services elasticsearch amazon-elasticsearch

我一直在努力弄清楚如何从我的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的主页,其中包含有关如何执行此操作的零信息。有人为我找到了解决方案吗?

5 个答案:

答案 0 :(得分:12)

在AWS中使用IAM服务时,您必须签署您的请求。 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/

答案 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角色。我明白你为什么这样做,但我认为校长需要一个用户,而不是一个角色。

见下文:

  

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号列表的形式可以访问   资源。

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

答案 2 :(得分: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

答案 3 :(得分:1)

我最近遇到了这个问题,根本问题是没有任何Amazon SDK支持调用Elasticsearch操作,如search,put等。

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

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

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

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

答案 4 :(得分:0)

您需要签署请求,很遗憾,官方的Elasticsearch库不再支持该请求。检查此Github问题(https://github.com/elastic/elasticsearch-js/issues/1182#issuecomment-630641702

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