it-swarm.com.ru

Правильная политика доступа для кластера Amazon Elasticsearch

Недавно я начал использовать новую службу 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]: домен/[ES_DOMAIN] /«}

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

88
hartfordfive

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

55
Pete

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

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

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

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

36
Olivier

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

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

Это отлично сработало для меня. 

5
Philippe Oger

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

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

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

0
Selvakumar Ponnusamy