Правильная политика доступа для Amazon Elastic Search Cluster

Недавно я начал использовать новую службу 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) и пытается запустить простой вызов curl на конечной точке https://*.es.amazonaws.com, я получаю следующую ошибку:

{ "Сообщение": "Пользователь: анонимный не имеет права выполнять: es: ESHttpGet на ресурсе: arn: aws: es: us-east-1: [ACCOUNT_ID]: domain/[ES_DOMAIN]/" }

Кто-нибудь знает, что мне нужно изменить в политике доступа, чтобы это работало?

Ответ 1

Вы можете заблокировать доступ до IAM-only, но как вы будете просматривать Kibana в своем браузере? Вы можете установить прокси-сервер (посмотреть Gist и/или NPM-модуль) или включить как IAM, так и IP-доступ для просмотра результатов.

Мне удалось получить доступ к IAM-доступу с ограничением IP-адресов с помощью следующей политики доступа. Обратите внимание, что порядок важен: я не мог заставить его работать с оператором, основанным на IP, перед оператором IAM.

{
  "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. Logstash, работающий на моем экземпляре EC2, включает в себя раздел вывода следующим образом:

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

Я могу получить доступ к Kibana из двух IP-адресов в политике доступа (192.168.1.0 и 192.168.1.1).

Ответ 2

Согласно документу AWS и как только вы (и я) просто протестировали, вы не можете ограничить доступ к домену AWS ES роли/учетной записи/пользователю/... и просто cURL it!

Стандартные клиенты, такие как завиток, не могут выполнять подпись запроса, которая требуется для политик доступа на основе удостоверений. Вы должны использовать политику доступа на основе IP-адресов, которая позволяет анонимному доступу успешно выполнять инструкции для этого шага. (http://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-gsg-search.html)

Итак, у вас есть в основном два решения:

Подписание вашего запроса, вероятно, является лучшим решением, если вы хотите сохранить свою политику доступа как есть (что более гибко, чем ограничение IP), но, похоже, это немного сложнее. Я до сих пор не пробовал, и я не могу найти какой-либо документ.

Ответ 3

Немного поздно для вечеринки, но я смог разобраться с одной и той же проблемой, добавив подпись к моим запросам.

Если вы используете Python (как и я), вы можете использовать следующую библиотеку, чтобы сделать ее особенно простой в реализации: https://github.com/DavidMuller/aws-requests-auth

Он отлично работал у меня.

Ответ 4

Вы можете использовать политику на основе ресурсов или политику, основанную на идентификаторе, а не политику на основе IP, которая похожа на жесткое кодирование IP-адреса.

Но вам нужно использовать подпись подписи 4 для подписи запроса

Для реализации Java обратитесь http://mytechbites.blogspot.in/2017/04/secure-amazon-elastic-search-service.html

Ответ 5

Я также пытаюсь это сделать, и я работал с помощью опции Allow access to the domain from specific IP(s) с Elastic IP моего экземпляра EC2 (также может работать с использованием частного IP-адреса экземпляра, но я не уверен)