Amazon弹性搜索集群的访问策略



我最近开始使用新的Amazon Elasticsearch服务,我似乎无法找出我需要的访问策略,以便我只能从我的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调用,我得到以下错误:

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

有人知道我必须改变访问策略,以使其工作吗?

您可以将访问锁定为仅使用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。

根据AWS文档和您(和我)刚刚测试的,您不能将对AWS ES域的访问限制为角色/帐户/用户/…然后把它卷起来!

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

基本上有两种解决方案:

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

如果您想保持访问策略不变(这比限制IP更灵活),对请求签名可能是最好的解决方案,但它似乎有点复杂。到目前为止我还没有试过,我找不到任何医生来帮助我。

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

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

对我来说效果很好。

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

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

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

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

在这种情况下,您可以从错误消息本身获得完整的用户名。就我而言:"攻击: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]/*"
        }
      ]
    }

角色ARN需要修改。它将看起来像"arn:aws:iam::[ACCOUNT_ID]:role/service-role/my_es_role"

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

相关内容

  • 没有找到相关文章

最新更新