适用于Amazon Elastic Search Cluster的访问策略

我最近开始使用新的Amazon Elasticsearch服务,我似乎无法弄清楚我需要的访问策略,因此我只能从具有分配给它们的特定IAMangular色的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]/*" } ] } 

但正如我所说,这是行不通的。 我login到EC2实例(具有my_es_roleangular色),并尝试在“https://*.es.amazonaws.com”端点上运行简单的curl调用,出现以下错误:

{“Message”:“User:anonymous is not authorized to perform es esHttpGet on resource:arn:aws:es:us-east-1:[ACCOUNT_ID]:domain / [ES_DOMAIN] /”}

有没有人知道我必须改变访问策略才能正常工作?

您可以将访问权限locking为仅限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策略的实例configuration文件。 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 } } 

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

根据AWS文档以及您(和我)刚刚testing的结果,您不能将对AWS ES域的访问限制为angular色/帐户/用户/ …,只需简单地将其卷起来即可!

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

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

  • 改变您的访问策略并将其限制为IP,我认为您不能使用私有IP,因为您的ES群集似乎不属于您的VPC(默认或不是)。 请使用公共IP
  • 签署您的请求: http : //docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-managedomains.html#es-managedomains-signing-service-requests

如果你想保持原有的访问策略(这比限制IP更灵活),那么签署你的请求可能是最好的解决scheme,但似乎有点复杂。 我还没有尝试到目前为止,我找不到任何文件来帮助。

晚会有点迟,但是我可以通过在我的请求中添加签名来处理完全相同的问题。

如果你使用Python(和我一样),你可以使用下面的库来使它特别容易实现: https : //github.com/DavidMuller/aws-requests-auth

它对我来说是完美的。

您可以使用基于资源的策略或基于身份的策略,而不是基于IP的策略,就像硬编码IP地址一样。

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

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

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