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

nac*_*son 24 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/*"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

我无法登录ec2实例并运行curl来访问我的elasticsearch集群.

尝试对_search API进行简单的卷曲:

curl "http://search-myDomain.es.amazonaws.com/_search"
Run Code Online (Sandbox Code Playgroud)

生成身份验证错误响应:

{"Message":"User: anonymous is not authorized to perform: es:ESHttpGet on resource: arn:aws:es:us-west-2:123456789:domain/myDomain/_search"}
Run Code Online (Sandbox Code Playgroud)

为了更安全,我把AmazonESFullAccess政策放在我的IAM角色上,仍然无效.

我必须遗漏一些东西,因为能够以编程方式从使用IAM角色的ec2实例与Elasticsearch进行交互,这对于使用Amazon ES服务完成任何事情至关重要.

我也在文档中看到了这个矛盾的陈述.

基于IAM的策略示例您可以使用AWS IAM控制台而不是Amazon ES控制台创建基于IAM的访问策略.有关创建基于IAM的访问策略的信息,请参阅IAM文档.

IAM文档的链接是IAM的主页,其中包含有关如何执行此操作的零信息.有人为我找到了解决方案吗?

bur*_*050 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/


Bro*_*oks 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"
    }   
   ] 
}
Run Code Online (Sandbox Code Playgroud)

我意识到这不是你想要的,但是从这个开始(对世界开放),从外部卷曲并测试它.然后限制它,这样你就可以隔离问题了.

另外,我认为您的访问策略中存在"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号列表的形式)可以访问该资源.

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