Вопрос или проблема
У меня есть приложение, которое подключено к HAProxy, который, в свою очередь, подключен к кластеру из 3 SQL серверов. Я открыл брандмауэр UFW на сервере HAProxy, чтобы разрешить трафик с частного IP адреса сервера приложения на порт 80
sudo ufw allow from 10.0.0.0/24 to any port 80 comment 'http backend'
и с частного IP адреса серверов БД на порт 3306.
sudo ufw allow from 10.0.0.0/24 to any port 3306 comment 'mysql'
Все в порядке.
Я добавляю плавающий IP перед HAProxy, а также второй сервер HAProxy, чтобы обеспечить резервирование для балансировщиков нагрузки. Поскольку плавающий IP – это публичный IP адрес, единственный способ, которым сервер приложения может успешно общаться с серверами БД, заключается в том, чтобы разрешить трафик с публичного IP адреса сервера приложения на порт 3306.
sudo ufw allow from <Public IP> to any port 3306 comment 'mysql'
Без открытия публичного IP сервер приложения не может общаться с сервером БД.
Новое сетевое условие требует от меня открытого порта для публичного IP адреса (сервера БД), что немного беспокоит меня, потому что я не предпочитаю открывать публичный IP адрес, если это не необходимо, и мне кажется, что это менее безопасная конфигурация по сравнению с предыдущей, открывающая потенциальное окно для атаки.
Вопрос для опытного сетевого администратора здесь: есть ли более безопасный способ разрешить общение между серверами приложения и БД? Или я слишком переживаю?
Спасибо.
Ответ или решение
Конфигурация UFW для балансировщиков нагрузки с плавающим IP
Ваша ситуация с HAProxy и кластером SQL-серверов требует особого внимания к безопасности при настройке брандмауэра UFW. Давайте рассмотрим, как можно обеспечить безопасную конфигурацию для вашего окружения, подключая плавающий IP и второй сервер HAProxy для резервирования, не открывая лишние порты.
-
Понимание текущей конфигурации: Ваша текущая настройка UFW позволяет передавать трафик от приложения на HAProxy и от HAProxy к SQL-серверам через внутренние IP-адреса. Это создание безопасного канала для обмена данными. Задача усложняется с внедрением плавающего IP, который является публичным и может повысить риск атаки.
-
Проблема безопасности: Вы правильно отметили, что открытие порта 3306 для публичного IP-адреса вашего приложения создает потенциальную уязвимость. Однако существует несколько альтернативных подходов, которые вы можете рассмотреть для обеспечения безопасной связи между вашим приложением и SQL-серверами.
-
Использование VPN: Значительно повысить безопасность соединения можно с помощью Virtual Private Network (VPN). Настройка VPN позволит вашему приложению безопасно соединяться с внутренней сетью, исключая необходимость в открытии публичных портов. Установив VPN-соединение, приложение будет обращаться к SQL-серверам так, как если бы они находились в одной локальной сети.
-
Настройка SSH-туннелирования: Если VPN не является вариантом, рассмотрите возможность настройки SSH-туннелирования. Это потребует от вас подключения к серверу через SSH и перенаправления локального порта на порт 3306 вашего SQL-сервера. Пример команды:
ssh -L 3306:localhost:3306 user@<Private IP of DB Server>
Таким образом, ваше локальное обращение к порту 3306 будет безопасно перенаправляться на SQL-сервер.
-
Сетевые политики и ограничения: Если вы обязаны использовать публичный IP-адрес, рекомендуется ограничить доступ к 3306 не только по IP-адресу приложения, но и добавить дополнительные меры безопасности. Например, вы можете использовать приложения, такие как Fail2Ban, чтобы заблокировать IP-адреса, которые совершают много неудачных попыток входа.
-
Конфигурация UFW для наиболее безопасного доступа: Для того чтобы выставить наиболее безопасные правила в UFW, вы можете сделать следующее:
- Закройте все ненужные порты
- Позволяйте доступ только от конкретных IP-адресов
- Проверяйте логи на предмет подозрительной активности
Вот пример конфигурации:
sudo ufw allow from 10.0.0.0/24 to any port 80 comment 'http backend'
sudo ufw allow from 10.0.0.0/24 to any port 3306 comment 'mysql'
sudo ufw allow from <Public IP> to any port 3306 comment 'mysql from app server'
sudo ufw deny from any to any port 3306 comment 'block all other mysql traffic'
- Оценка угроз и аудит: Регулярно оценивайте угрозы, проводите аудит безопасности. Существует множество инструментов, которые могут помочь в этой задаче — от встроенных средств мониторинга до сторонних приложений, предоставляющих отчеты и рекомендации по улучшению безопасности.
В заключение, ваша бдительность в отношении безопасности в сетевых конфигурациях является необходимым условием. Рассматривая варианты VPN, SSH-туннелирования и ужесточения сетевых политик, вы можете не только сохранить доступность, но и значительно увеличить уровень безопасности вашего приложения и базы данных.