Использование Cloudfront для предоставления API REST API ElasticSearch только для чтения (GET/HEAD)
Я хочу, чтобы мои клиенты говорили напрямую с API ElasticSearch REST, что явно мешает им выполнять какие-либо изменения данных или конфигурации.
Я посмотрел на интерфейс ElasticSearch REST, и я заметил шаблон: HTTP GET-запросы довольно безопасны (безобидные запросы и статус кластера).
Итак, я думал, что могу использовать Cloudfront в качестве CDN/Proxy, который поддерживает только методы GET/HEAD (вы можете наложить такие ограничения в основной конфигурации).
Пока все хорошо, все настроено. Но все не работает, потому что мне нужно будет открыть мою группу безопасности EC2 для мира, чтобы быть доступным из Cloudfront! Я не хочу этого, действительно!
Когда я использую EC2 с RDS, я могу просто разрешить доступ к моей группе безопасности EC2 в группах безопасности RDS. Почему я не могу сделать это с помощью CloudFront? Или я могу?
Идеи?
изменить. Он не задокументирован, но ES принимает запрос фасетов, который включает тело (JSON) не только с POST, но и с GET. Это просто нарушает рекомендацию HTTP (как для RFC3616), не игнорируя тело для запроса GET (источник).
Это связано с тем, что, как указано, непосредственный интерфейс ES REST может привести к легким атакам DOS с использованием сложных запросов. Я все еще убежден, что, имея еще один прокси-сервер, все еще стоит того.
edit. Другим вариантом для меня было бы пропустить CloudFront и добавить уровень безопасности в качестве плагина ElasticSearch, как показано здесь
Ответы
Ответ 1
Я закончил кодирование своим собственным плагином. Удивительно, но вокруг ничего подобного не было.
Нет прокси, нет причала, нет Tomcat.
Просто оригинальный модуль ES rest и мой RestFilter. Использование минимального отражения для получения удаленного адреса запросов.
наслаждаться:
https://github.com/sscarduzio/elasticsearch-readonlyrest-plugin
Ответ 2
Обратите внимание, что даже запрос GET может быть вреден в Elasticsearch. Запрос, который просто занимает слишком много ресурсов для вычисления, приведет к снижению вашего кластера. Границы - хороший способ сделать это.
Я бы посоветовал написать простой REST API, который вы ставите перед ES, чтобы получить гораздо больше контроля над тем, что попадает в ваш поисковый кластер. Если это не вариант, вы можете подумать о запуске Nginx в своих ES-боксах, чтобы действовать как локальный обратный прокси-сервер, который даст вам тот же контроль (и намного больше), как это делает CloudFront. Тогда вам нужно будет только открыть Nginx для мира, а не ES.