Правильная политика доступа для 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-адреса экземпляра, но я не уверен)