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


99

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

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

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


14
Остерегайтесь, изменения политики доступа ElasticSearch вступают в силу довольно долго, в отличие от других изменений IAM, которые происходят почти мгновенно. Легко просто нажать «Применить» и переключить вкладку, не замечая «Обработка ...»
Сирил Дюшон-Дорис

Ответы:


63

Вы можете заблокировать доступ только для IAM, но как вы будете просматривать 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 . 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).


Привет, вам нужно использовать плагин, только если вы используете политику на основе IAM. Вы можете использовать стандартный плагин elasticsearch в Logstash, если ваша политика доступа основана на IP-адресах. В этом случае вам также не нужен профиль экземпляра. Кроме того, служба ES недоступна в VPC. Для подключения необходимо использовать общедоступные IP-адреса. Не уверен, что ваши ссылки на адреса 192.168 являются заменой чего-то еще, но могут ввести в заблуждение.
Гаррет МакДэйд

В aws:SourceIpмоем примере используются IP-адреса вашей персональной рабочей станции, поэтому вы можете использовать Kibana. Доступ с ограничением IAM позволяет одному или нескольким экземплярам EC2 писать в Elasticsearch, не беспокоясь о том, какие IP-адреса принадлежат конкретному экземпляру или блоку CIDR.
Пит

1
Стоит отметить, что ограничение диапазона частных IP-адресов CIDR вашего VPC, похоже, не работает. ES не работает в VPC или что-то в этом роде.
Свентечье 06

Спасибо, что предоставили образец политики в своем ответе; Я не мог избавиться от ужасной ошибки «Пользователь: анонимный» в Kibana, пока я не переключился aws:SourceIpсо скалярного значения на массив, как в приведенном вами примере. (Я - обозначение CIDR, если это кому-то поможет.) Весь процесс настройки политик для AWS ES был бы менее утомительным, если бы каждое отдельное изменение политики не переводило кластер в таинственное состояние «обработки» на 20 минут, поскольку политика тщательно начертана на каменных скрижалях, или что бы они там ни делали.
Роберт Калхун

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.
Анант Гупта

7
я имею дело с той же проблемой. и я заметил, что обработка изменений с помощью aws elasticsearch занимает очень много времени.
nemo

Задайте политику доступа с двумя операторами: один для доступа к IAM для записи журналов, другой с доступом с ограничением по IP для просмотра KIbana. Подробности смотрите в моем ответе
Пит

2
Мне было интересно, означает ли "loooong" минуты, часы или дни. Похоже, минут 10-15. Вы можете увидеть это при проверке статуса вашего ES (зеленый «активен», если обновление завершено, иначе, что-то вроде оранжевого «готовится».
Balmipour 02

У меня была такая же проблема, и после поиска я нашел эту удобную библиотеку .
gmajivu

6

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

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

У меня это сработало отлично.


1

Вам просто нужно полное имя пользователя в эластичной политике поиска.

В этом случае вы можете получить свое полное имя пользователя из самого сообщения об ошибке. В моем случае: "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]/*"
        }
      ]

    }

0

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

Но вам нужно использовать подпись версии 4, чтобы подписать запрос

Для реализации Java см. Http://mytechbites.blogspot.in/2017/04/secure-amazon-elastic-search-service.html


0

Необходимо изменить роль ARN. это будет выглядеть как "arn: aws: iam :: [ACCOUNT_ID]: role / service-role / my_es_role"


-2

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.