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

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

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

5 ответов

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

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

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

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

  • измените свою политику доступа и ограничьте ее IP-адресами. Я думаю, что вы не можете использовать частный IP-адрес, поскольку ваш кластер ES, кажется, не принадлежит вашему VPC (по умолчанию или нет). Пожалуйста, используйте публичный IP
  • подпишите ваш запрос: http://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-managedomains.html

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

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

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

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

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

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

    }

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

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

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

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

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

Другие вопросы по тегам