Подтвердить что ты не робот

Служба AWS Elasticsearch IAM Политика доступа на основе ролей

Я изо всех сил пытался выяснить, как общаться с сервисом Amazon ES из моих экземпляров EC2.

В документации четко указано, что служба Amazon ES поддерживает политики доступа на основе пользователя и роли IAM. http://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-createupdatedomains.html#es-createdomain-configure-access-policies

Однако, когда у меня есть эта политика доступа для моего домена ES:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789:role/my-ec2-role"
      },
      "Action": "es:*",
      "Resource": "arn:aws:es:us-west-2:123456789:domain/myDomain/*"
    }
  ]
}

Я не могу войти в экземпляр ec2 и запустить завиток, чтобы попасть в свой кластер elasticsearch.

Попытка сделать простой завиток API-интерфейса _search:

curl "http://search-myDomain.es.amazonaws.com/_search"

Выдает ответ об ошибке проверки подлинности:

{"Message":"User: anonymous is not authorized to perform: es:ESHttpGet on resource: arn:aws:es:us-west-2:123456789:domain/myDomain/_search"}

Просто, чтобы быть более безопасным, я ставлю политику AmazonESFullAccess на мою роль IAM, но не работает.

Я должен что-то упустить, потому что возможность программного взаимодействия с Elasticsearch из экземпляров ec2, использующих роль IAM, необходима для получения чего-либо, достигнутого с помощью службы Amazon ES.

Я также вижу это противоречивое утверждение в документах.

Пример политики на основе IAM. Вы создаете политики доступа на основе IAM посредством используя консоль AWS IAM, а не консоль Amazon ES. Для информация о создании политик доступа на основе IAM, см. IAM документация.

Эта ссылка на документацию IAM находится на домашней странице IAM и содержит ровно нулевую информацию о том, как это сделать. Кто-нибудь получил решение для меня?

4b9b3361

Ответ 1

При использовании службы IAM с AWS вы должны подписать свои запросы. curl не поддерживает подписанные запросы (который состоит из хэширования запроса и добавления параметра в заголовок запроса). Вы можете использовать один из своих SDK с встроенным алгоритмом подписи и затем отправить этот запрос.

См: http://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/what-is-amazon-elasticsearch-service.html#signing-requests

Здесь вы можете найти SDK для популярных языков: http://aws.amazon.com/tools/

Ответ 2

Во-первых, вы сказали, что не можете войти в экземпляр EC2 для завивки экземпляра ES? Вы не можете войти? Или вы не можете скручивать его из EC2?

У меня есть экземпляр Elasticsearch (Service), открытый для мира (с ним ничего нет), и я умею скручивать его просто отлично, не подписываясь. Я изменил политику доступа, чтобы проверить, но, к сожалению, навсегда нужно вернуться после ее изменения...

Моя политика выглядит так:

{   "Version": "2012-10-17",   "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "es:*",
      "Resource": "arn:aws:es:us-east-1:843348267853:domain/myDomain/*"
    },
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "es:*",
      "Resource": "arn:aws:es:us-east-1:843348267853:domain/myDomain"
    }   
   ] 
}

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

Кроме того, я думаю, что у вас есть проблема с "Принципалом" в вашей политике доступа. У вас есть роль EC2. Я понимаю, почему вы это делаете, но я думаю, что Принципал требует ПОЛЬЗОВАТЕЛЯ, а не роли.

См. ниже:

http://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-createupdatedomains.html#es-createdomain-configure-access-policies

Основной

Указывает учетную запись AWS или пользователя IAM, которому разрешен или запрещен доступ к ресурсу. Указание шаблона (*) позволяет анонимный доступ к домена, который не рекомендуется. Если вы включите анонимный доступа, мы настоятельно рекомендуем вам добавить условие на основе IP для ограничить, какие IP-адреса могут отправлять запросы в Amazon ES домен.

РЕДАКТИРОВАТЬ 1

Чтобы быть понятным, вы добавили политику AmazonESFullAccess в my-ec2-role? Если вы собираетесь использовать политики доступа IAM, я не думаю, что вы можете применить к ним политику, основанную на ресурсах (это то, что вы делаете).

http://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_compare-resource-policies.html

Для некоторых служб AWS вы можете предоставить доступ к кросс-аккаунту Ресурсы. Чтобы сделать это, вы присоединяете политику непосредственно к ресурсу которые вы хотите использовать, вместо использования роли в качестве прокси. ресурс, который вы хотите предоставить, должен поддерживать политики на основе ресурсов. В отличие от пользовательской политики, политика на основе ресурсов указывает, кто (в форма списка идентификационных номеров учетных записей AWS) могут получить доступ к этому ресурс.

Возможно, попробуйте полностью удалить политику доступа?

Ответ 3

Недавно я столкнулся с этой проблемой, и основная проблема заключается в том, что ни один из SDK Amazon не поддерживает вызовы Elasticsearch, такие как search, put и т.д.

Единственным обходным решением на данный момент является выполнение запросов непосредственно к конечной точке с использованием подписанных запросов: http://docs.aws.amazon.com/general/latest/gr/sigv4-signed-request-examples.html

Пример здесь для вызова EC2, но он может быть изменен, чтобы вместо этого обращаться к Elasticsearch. Просто измените значение "service" на "es". Оттуда вы должны заполнить значения для

  • конечная точка (которая является полным URL вашего кластера, включая операцию без параметров запроса)
  • хост (часть между https://и вашим каноническим URI, например /_status
  • канонический uri, который является URI после первого/включительного (например,/_status), но без строки запроса
  • параметры запроса (все после? включительно)

Обратите внимание, что мне удалось довести эту работу до сих пор с использованием учетных данных AWS, поскольку предполагается, что вы передаете ключ доступа и секретный ключ различным вызовам подписи (access_key и secret_key в примере). Он должен выполняться с использованием ролей IAM, но сначала вам нужно позвонить в службу маркеров безопасности, чтобы получить временные учетные данные, которые можно использовать для подписи запроса. Пока вы это сделаете, не забудьте изменить политику доступа в кластере Elasticsearch, чтобы разрешить учетные записи пользователей (пользователь/

Ответ 4

Почему вы не создаете прокси с эластичным ip и не позволяете прокси-серверу получить доступ к вашим ES? В принципе существует три формы, которые вы можете ограничить доступ в ES:

  • Разрешить всем
  • Белый список IP
  • Подписание ключа доступа и секретного ключа, предоставленного AWS.

Я использую две формы: в моих php-приложениях я предпочитаю использовать прокси-сервер за соединением с ES и в моем приложении nodejs. Я предпочитаю подписывать свои запросы с помощью модуля http-aws-es node. Полезно создать прокси-среду, потому что мои пользователи должны получить доступ к интерфейсу kibana, чтобы увидеть некоторые отчеты, и это возможно, потому что они настроили прокси-сервер в своих браузерах =)

Я должен рекомендовать вам закрыть доступ к вашим ES-индексам, потому что их довольно легко удалить, curl -XDELETE https://your_es_address/index может сделать это, но вы можете сказать: "Как другие пользователи получат мой ES-адрес?" и я отвечу вам: "Безопасность, основанная на тусклости, не является реальной безопасностью"

Моя политика доступа к безопасности в основном похожа на нее:

http://pastebin.com/EUKT1ekX