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