В настоящее время я работаю над архитектурой веб-сайта с высокой посещаемостью и высокой доступностью.
Мы используем AWS.
В настоящее время у нас есть:
Route 53 -> ELB -> Несколько экземпляров EC2 -> RDS Multi AZ.
Каждый экземпляр EC2 запускает Varnish + Nginx и PHP FCGI. Сессии и некоторые другие общие данные хранятся через ElastiCache.
Мы планируем запускать Varnish и Nginx на каждом экземпляре EC2, потому что это позволяет уменьшить количество точек сбоя и просто запускать дополнительные экземпляры при увеличении нагрузки.
Однако мы должны добавить к этому iptables (fail2ban). Конечно, мы получаем IP ELB вместо реального IP клиента ...
Мы подумали о следующих решениях:
1) Добавьте экземпляр EC2 между Route 53 и ELB, запустите iptables / firewalls (и, возможно, varnish?) И перенаправьте все в ELB.
2) Замените ELB кастомным EC2 с HAProxy + iptables.
3) Используйте mod_security и создайте некоторые пользовательские вещи для динамического черного списка IP-адресов
4) Придерживайтесь текущей архитектуры и удалите iptables из нашего списка дел.
Что было бы хорошим подходом?
Спасибо
Конечно, мы получаем IP ELB вместо реального IP клиента ...
Вы захотите использовать заголовок x-forwarded-for, который даст вам IP-адрес клиента.
Заголовок запроса X-Forwarded-For помогает определить IP-адрес клиента при использовании балансировщика нагрузки HTTP / HTTPS.
Вот еще кое-что, что может вас заинтересовать ...
AWS предоставляет две отличные функции безопасности, которые работают в той же области, что и iptables:
Группы безопасности (подумайте о замене iptables) дают вам возможность разрешать / запрещать трафик на основе IP-адреса и порта. Есть и другие возможности, связанные с предоставлением другого ресурса AWS вместо IP-адреса.
Сетевые списки ACL дают вам дополнительный контроль над вашей сетью. Вы можете разрешить / запретить трафик на основе IP-адреса и порта внутри и между подсетями в вашем VPC.
Если вы хотите добавить дополнительные меры безопасности к своим EC2 (например, fail2ban) и используете несколько EC2 за балансировщиком нагрузки, вам необходимо спроектировать свои EC2 так, чтобы на них не было никаких уникальных данных ( нет смысла добавлять правило EC2 # 1, если его нет на EC2 # 2).
Существуют методы, позволяющие поддерживать синхронизацию EC2 друг с другом, такие как хранение данных на S3, получение управления конфигурацией от мастера или получение содержимого из одного репо. Использование образов Golden вместе со сценариями начальной загрузки (которые извлекают данные из S3).
1) Добавьте экземпляр EC2 между Route 53 и ELB, запустите iptables / firewalls (и, возможно, varnish?) И перенаправьте все в ELB.
Добавление экземпляра EC2 перед вашим ELB снизит вашу способность к масштабированию. Вы также создаете единую точку отказа, поэтому вы, вероятно, не захотите этого делать.
2) Замените ELB кастомным EC2 с HAProxy + iptables.
Вы могли бы сделать это, но это достигается за счет управления этим самостоятельно. Вы несете ответственность за программное обеспечение, безопасность, обновления, доступность и т. Д. Вы хотите избежать этого, если это возможно (т.е. делайте это только в том случае, если вы не можете решить проблему с помощью ELB).
3) Используйте mod_security и создайте некоторые пользовательские вещи для динамического черного списка IP-адресов
Это вариант, но вы можете захотеть управлять безопасностью на уровне ОС / сети, а не (только) на уровне программного обеспечения / приложения.
4) Придерживайтесь текущей архитектуры и удалите iptables из нашего списка задач.
Конечно, это вариант, но приемлем ли это для бизнеса / проекта?