适用于Amazon Elastic Search Cluster

时间:2015-10-06 19:23:03

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

我最近开始使用新的Amazon Elasticsearch Service,我似乎无法弄清楚我需要的访问策略,因此我只能从我的EC2实例访问具有特定IAM角色的服务。

以下是我目前为ES域分配的访问策略示例:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn:aws:iam::[ACCOUNT_ID]:role/my_es_role",
        ]
      },
      "Action": "es:*",
      "Resource": "arn:aws:es:us-east-1:[ACCOUNT_ID]:domain/[ES_DOMAIN]/*"
    }
  ]
}

但正如我所说,这不起作用。我登录EC2实例(附加了my_es_role角色)并尝试在“https://*.es.amazonaws.com”终点上运行一个简单的curl调用,我得到以下内容错误:

  

{“消息”:“用户:匿名无权执行:es:ESHttpGet on resource:arn:aws:es:us-east-1:[ACCOUNT_ID]:domain / [ES_DOMAIN] /”}

有没有人知道我必须在访问政策中更改什么才能使其正常工作?

7 个答案:

答案 0 :(得分:57)

您可以将访问权限锁定到仅限IAM,但您如何在浏览器中查看Kibana?您可以setup a proxysee Gist和/或NPM module)或启用IAM和基于IP的访问以查看结果。

我能够通过以下访问策略获得IAM访问IP限制访问权限。请注意,顺序很重要:在IAM语句之前,我无法使用基于IP的语句。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::xxxxxxxxxxxx:root"
      },
      "Action": "es:*",
      "Resource": "arn:aws:es:us-west-2:xxxxxxxxxxxx:domain/my-elasticsearch-domain/*"
    },
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": "es:*",
      "Resource": "arn:aws:es:us-west-2:xxxxxxxxxxxx:domain/my-elasticsearch-domain/*",
      "Condition": {
        "IpAddress": {
          "aws:SourceIp": [
            "192.168.1.0",
            "192.168.1.1"
          ]
        }
      }
    }
  ]
}

我的EC2实例有一个实例配置文件 arn:aws:iam::aws:policy/AmazonESFullAccess 政策。 Logstash应使用logstash-output-amazon-es output plugin对请求进行签名。在我的EC2实例上运行的Logstash包括如下输出部分:

output {
    amazon_es {
        hosts => ["ELASTICSEARCH_HOST"]
        region => "AWS_REGION"
    }
    # If you need to do some testing & debugging, uncomment this line:
    # stdout { codec => rubydebug }
}

我可以从访问策略中的两个IP(192.168.1.0和192.168.1.1)访问Kibana。

答案 1 :(得分:36)

根据AWS文档和您(和我)刚刚测试过,您无法将对AWS ES域的访问权限限制为角色/帐户/用户/ ...而只是简单地使用它!

  

标准客户端(例如curl)无法执行基于身份的访问策略所需的请求签名。您必须使用允许匿名访问的基于IP地址的访问策略才能成功执行此步骤的说明。   (http://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-gsg-search.html

所以你基本上有两个解决方案:

如果您希望按原样保留访问策略(比限制IP更灵活),则签署您的请求可能是最佳解决方案,但它似乎有点复杂。到目前为止我还没有尝试过,我找不到任何帮助的文档。

答案 2 :(得分:5)

派对有点晚了,但我能够通过在我的请求中添加签名来处理完全相同的问题。

如果您使用Python(就像我一样),您可以使用以下库使其特别容易实现: https://github.com/DavidMuller/aws-requests-auth

它对我来说很完美。

答案 3 :(得分:0)

您可以使用基于资源的策略或基于身份的策略,而不是基于IP的策略,这类似于对IP地址进行硬编码。

但您需要使用签名版本4来签署请求

对于Java实现,请参阅http://mytechbites.blogspot.in/2017/04/secure-amazon-elastic-search-service.html

答案 4 :(得分:0)

您只需在弹性搜索策略中输入完整的用户名即可。

在这种情况下,您可以从错误消息本身获取完整的用户名。 就我而言: “ arn:aws:sts :: [ACCOUNT_ID]:假定角色/ [LAMBDA_POLICY_NAME] / [LAMBDA_NAME]”

    {
        "Version": "2012-10-17",
        "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "AWS": [
              "arn:aws:sts::xxxxxxxxxxxx:assumed-role/[lambda-role]/[full-lambda-name]"
            ]
          },
          "Action": "es:*",
          "Resource": "arn:aws:es:[region]:xxxxxxxxxxxxx:domain/[elasticsearch-domain-name]/*"
        }
      ]

    }

答案 5 :(得分:0)

角色ARN需要更改。它看起来像是“ arn:aws:iam :: [ACCOUNT_ID]:role / service-role / my_es_role”

答案 6 :(得分:-2)

我也试图这样做,我使用Allow access to the domain from specific IP(s)选项和我的EC2实例的弹性IP一起工作(也可以使用实例的私有IP工作,但我不太确定)