正确的Amazon Elastic Search Cluster访问策略


99

我最近开始使用新的Amazon Elasticsearch Service,但似乎无法弄清楚我需要的访问策略,这样我只能从分配了特定IAM角色的EC2实例中访问服务。

这是我当前为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:ESHttp获取资源:arn:aws:es:us-east-1:[ACCOUNT_ID]:domain / [ES_DOMAIN] /”}

有人知道我必须更改访问策略才能使其正常工作吗?


14
请注意,ElasticSearch访问策略更改要花很长时间才能应用,这与几乎是即时的其他IAM更改不同。只需单击“应用”并切换选项卡而无需注意“正在处理...”,这很容易
Cyril Duchon-Doris

Answers:


63

您可以将访问锁定为仅IAM,但是如何在浏览器中查看Kibana?您可以设置代理请参阅Gist和/或NPM模块),或同时启用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输出插件对请求进行签名。在我的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。


嗨,您仅在使用基于IAM的策略时才需要使用插件。如果您的访问策略基于IP地址,则可以在Logstash中使用标准的Elasticsearch插件。在这种情况下,您也不需要实例配置文件。此外,ES服务在VPC中不可用。您必须使用公共IP地址进行连接。不知道您对192.168地址的引用是否替代了其他内容,但可能会误导您。
Garreth McDaid

aws:SourceIp“在我的例子旨在为您的个人工作站的IP,所以你可以使用Kibana。通过IAM限制的访问,一个或多个EC2实例可以写入Elasticsearch,而不必担心哪些IP属于特定实例或CIDR块。
皮特

1
值得注意的是,限制VPC 的专用 IP CIDR范围似乎不起作用。ES无法在VPC之内运行。
sventechie '16

感谢您在回答中提供示例政策;在我aws:SourceIp从标量值切换为数组之前,直到您所给出的示例,我一直无法克服可怕的“用户:匿名”错误。(如果有帮助,我会使用CIDR表示法。)如果每项策略更改都没有在20分钟内使集群进入神秘的“处理”状态,那么为AWS ES设置策略的整个过程就不会那么沮丧。该政策会仔细铭刻在石碑上,或他们正在做什么。
罗伯特·卡尔洪

38

根据AWS文档,正如您(和我)刚刚测试的那样,您不能将对AWS ES域的访问限制为角色/帐户/用户/ ...,而只需对其进行cURL!

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

因此,您基本上有两种解决方案:

如果您希望保持访问策略不变(比限制IP更为灵活),则对请求进行签名可能是最好的解决方案,但这似乎更为复杂。到目前为止,我还没有尝试过,也找不到任何文档可以提供帮助。


3
我使用了笔记本电脑的公共IP地址,并尝试使用curl / browser访问端点,但是仍然出现User:anonymous错误。
Anant Gupta

7
我正在处理同样的问题。而且我注意到用aws elasticsearch处理更改需要很长时间。
nemo

使用两个语句设置访问策略:一个用于IAM访问以写入日志,另一个用于IP限制访问以查看KIbana。 详情请参阅我的答案
皮特

2
我想知道“ loooong”是指分钟,几小时还是几天。看起来像是10到15分钟。您可以看到在检查ES的状态时(如果更新完成,则为绿色“活动”,否则为橙色“正在准备”。)
Balmipour

我遇到了同样的问题,搜索后发现了这个方便的
gmajivu


1

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

在这种情况下,您可以从错误消息本身获取完整的用户名。就我而言:“ arn:aws:sts :: [ACCOUNT_ID]:assumed-role / [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]/*"
        }
      ]

    }


0

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


-2

我也在尝试执行此操作,并且使用Allow access to the domain from specific IP(s)EC2实例的弹性IP 的选项使它起作用(也可以使用实例的私有IP起作用,但我不太确定)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.