Защита SWAG
SWAG — reverse proxy, который позволяет публиковать self-hosted приложения в интернет, но это несет риски. Часть рисков можно снизить, если тонко настроить SWAG и модель доступа:- Ограничить доступ к части приложений из интернета, оставив другие публичными.
- Настроить защиту от brute-force через Crowdsec/Fail2Ban.
- Настроить geoblock (whitelist/blacklist стран) через DBIP/Maxmind.
- Исключить приложения из результатов поисковых систем.
- Настроить SSO через Authelia/Authentik.
- Мониторить SWAG через dashboard.
- Открывать приложения через WireGuard вместо прямой публикации.
Требования
- Рабочий экземпляр SWAG.
Внутренние приложения
Публикуйте только те приложения, которые действительно нужно открыть наружу. Остальные держите внутренними и используйте WireGuard для доступа.Требования
- Split DNS — source IP запросов должен быть локальным, иначе allow/deny фильтры могут работать некорректно.
nginx/internal.conf:
Защита от brute-force
Crowdsec и Fail2Ban помогают предотвращать brute-force атаки: они анализируют логи приложений и банят IP, где многократно проваливаются попытки входа. В SWAG Fail2Ban уже включен с базовыми правилами. Вы можете тонко настроить его под свои приложения, либо отключить и использовать Crowdsec.Crowdsec
Crowdsec — бесплатный open-source collaborative IPS. По сути это fail2ban, но с обменом банами между участниками для проактивной блокировки вредоносных хостов. Настройка для SWAG описана в этом посте.Fail2Ban
Fail2Ban — система предотвращения вторжений для защиты внешних приложений от brute-force. Если атакующий несколько раз ошибается при входе, он блокируется для доступа ко всем вашим приложениям. Fail2Ban анализирует логи, считает неудачные попытки за короткий интервал и банит IP.Ниже пример настройки Nextcloud в Fail2Ban. Для остальных приложений настройка аналогичная.
Смонтируйте логи приложения в контейнер SWAG, добавив volume с логами в compose:nextcloud.local в fail2ban/filter.d:
nextcloud.local на docker host:
fail2ban/jail.local:
logpath может отличаться для приложений с несколькими логами по дате:
Geoblock
Geoblock заметно снижает поверхность атаки SWAG, ограничивая доступ по странам. Следуйте инструкциям одного из модов: DBIP не требует аккаунта, но Maxmind в ряде случаев может быть точнее.Этот блок был удален автором, но я оставил его для личного использования.
$geo-whitelist, $geo-blacklist, $lan-ip.
Пример разрешения одной страны:
location.
Важно: при whitelist-фильтре также проверяйте LAN IP источника. Для blacklist-фильтра это не обязательно.
Поисковая выдача
Можно запретить появление приложений в поиске и индексацию web-crawler’ами. Не все поисковики и crawler-боты соблюдают этот тег, но он заметно снижает количество индексации. Добавьте вssl.conf, чтобы включить для всех приложений:
SSO
SSO дает дополнительный уровень защиты и помогает защититься от login bypass уязвимостей в приложениях. Учтите, что API endpoints обычно не должны быть под SSO, иначе они могут перестать корректно работать.Мониторинг
Используйте инструменты мониторинга, например SWAG Dashboard, чтобы отслеживать трафик через SWAG и находить подозрительную активность:- Много обращений из стран, не относящихся к вашим пользователям.
- Много запросов к одной странице или статическому файлу.
- Referer-источники, которые не должны ссылаться на ваш домен.
- Большое число ответов со статусами не из диапазона 2xx.
VPN
Самая эффективная защита — не публиковать приложения напрямую, а получать доступ к ним через WireGuard.Требования
- Рабочий экземпляр WireGuard.
- Split DNS — source IP запросов должен быть локальным, чтобы SWAG работал без внешней публикации.
- DNS Validation — позволяет получить SSL-сертификат без port forwarding.