Сервер сайта

Защита сервера сайта

Как закрыть прямой вход на сервер сайта

Зачем закрывать прямой вход

Origin-сервер - это сервер, на котором реально работает сайт. GUJ-нода принимает публичный трафик, фильтрует его и проксирует разрешенные запросы на origin.

Если origin открыт для всего интернета, атакующий может обойти GUJ и обратиться к сайту напрямую. Тогда WAF, anti-DDoS, bot-фильтры и rate limit на GUJ-ноде не помогут.

Правильная схема: посетители ходят на GUJ-ноду, а origin принимает HTTP/HTTPS только от IP GUJ-нод и разрешенных инфраструктурных IP.

Что делает lockdown-origin-host.sh

  • Создает отдельный файл правил /etc/nftables.d/guj-origin.nft
  • Создает отдельную nftables table inet guj_origin
  • Закрывает входящие подключения по умолчанию
  • Открывает web-порты origin, обычно 80 и 443, только для IP из allowlist
  • Скачивает web allowlist из панели GUJ, если ручной список не задан
  • Отдельно спрашивает, ограничивать ли SSH по IP allowlist
  • Пытается добавить текущий SSH IP автоматически, чтобы не отрезать доступ
  • Делает backup старых GUJ-правил перед применением
  • При отключении удаляет только правила GUJ, не трогая чужие firewall-правила сервера

Где запускать

Запускайте этот скрипт только на origin-сервере сайта. Не запускайте его на GUJ-ноде.

Если сайт и GUJ-нода установлены на разных серверах, lockdown-origin-host.sh запускается на сервере сайта, а harden-node-host.sh - на сервере GUJ-ноды.

Перед запуском

  • Убедитесь, что у вас есть SSH-доступ к серверу и права root/sudo
  • Убедитесь, что домен уже может работать через GUJ-ноду
  • Если SSH должен быть закрыт по allowlist, заранее подготовьте IP, с которых администраторы будут подключаться к серверу
  • Если origin слушает не только 80/443, заранее определите список web-портов, например 80, 443, 8080
  • Если используется не основная панель https://guj.ru, передайте URL панели через GUJ_PANEL_URL

Обычный запуск с меню

Выполните на origin-сервере:

curl -fsSL https://files.guj.ru/node/lockdown-origin-host.sh | sudo sh

Если команда запущена в интерактивной SSH-сессии, откроется меню:

ПунктЧто делает
1 - Включить/переустановить полную защиту originСкачивает web allowlist из панели, генерирует правила и применяет firewall
2 - Отключить полную защиту GUJ для originУдаляет только guj_origin table и файл guj-origin.nft
3 - Показать текущий статусПоказывает файл правил, активную nftables table, web allowlist и состояние SSH allowlist
4 - Обновить web allowlist из панелиЗаново получает список IP GUJ-нод и применяет правила с обновленным списком
5 - Включить ограничение SSH по allowlistОткрывает SSH только для текущего SSH IP, IP из панели и дополнительных IP
6 - Отключить ограничение SSHОставляет SSH-порт открытым для всех, остальные GUJ-правила сохраняются
7 - Добавить IP/CIDR в SSH allowlistДобавляет новые адреса и переустанавливает правила
8 - Удалить IP/CIDR из SSH allowlistУдаляет адреса и переустанавливает правила
0 - ВыходВыходит без изменений

Включение полной защиты

Выберите пункт 1 в меню. Скрипт выполнит такие действия:

  1. Получит список разрешенных IP из /api/v1/infrastructure/origin-web-allowlist.txt
  2. Откроет web-порты origin только для этих IP
  3. Спросит, закрывать ли SSH по allowlist
  4. Если вы ответите Да, добавит текущий SSH IP и предложит добавить дополнительные IP/CIDR
  5. Проверит конфигурацию командой nft -c
  6. Сделает backup старых GUJ-правил
  7. Применит новые правила

Для SSH рекомендуемый ответ - Да. Если текущий SSH IP не удалось определить и allowlist пустой, скрипт остановится, чтобы не отрезать доступ.

SSH на origin

SSH управляется отдельно от web-портов. Вы можете оставить SSH открытым, но безопаснее включить allowlist.

При включенном SSH allowlist скрипт разрешает SSH:

  • с текущего SSH IP, если он определен
  • с IP из /api/v1/infrastructure/ssh-allowlist.txt
  • с IP, которые вы введете вручную

Добавить IP в SSH allowlist через меню можно пунктом 7. Удалить IP - пунктом 8.

Если после удаления список станет пустым, скрипт оставит SSH открытым, чтобы не закрыть доступ к серверу.

Неинтерактивные команды

Для автоматизации используйте GUJ_ORIGIN_ACTION. Эти команды можно запускать повторно.

КомандаНазначение
GUJ_ORIGIN_ACTION=applyВключить или переустановить полную защиту
GUJ_ORIGIN_ACTION=disableОтключить GUJ-защиту origin
GUJ_ORIGIN_ACTION=statusПоказать текущий статус
GUJ_ORIGIN_ACTION=update-web-allowlistОбновить web allowlist из панели и применить правила
GUJ_ORIGIN_ACTION=ssh-onВключить SSH allowlist
GUJ_ORIGIN_ACTION=ssh-offОтключить SSH allowlist и оставить SSH открытым
GUJ_ORIGIN_ACTION=add-ssh-ipДобавить IP/CIDR в SSH allowlist
GUJ_ORIGIN_ACTION=remove-ssh-ipУдалить IP/CIDR из SSH allowlist

Пример добавления SSH IP:

curl -fsSL https://files.guj.ru/node/lockdown-origin-host.sh | sudo env \
  GUJ_ORIGIN_ACTION=add-ssh-ip \
  GUJ_ORIGIN_SSH_ADD_IPS="198.51.100.10, 203.0.113.0/24" \
  sh

Пример удаления SSH IP:

curl -fsSL https://files.guj.ru/node/lockdown-origin-host.sh | sudo env \
  GUJ_ORIGIN_ACTION=remove-ssh-ip \
  GUJ_ORIGIN_SSH_REMOVE_IPS="198.51.100.10" \
  sh

Ручной web allowlist

Если панель временно недоступна или нужно задать список вручную, передайте IP через GUJ_ORIGIN_ALLOWED_WEB_IPS:

curl -fsSL https://files.guj.ru/node/lockdown-origin-host.sh | sudo env \
  GUJ_ORIGIN_ALLOWED_WEB_IPS="203.0.113.10, 203.0.113.11" \
  GUJ_ORIGIN_TCP_PORTS="80, 443" \
  sh

Если origin использует нестандартный web-порт, добавьте его в GUJ_ORIGIN_TCP_PORTS, например 80, 443, 8080.

Отключение защиты

Пункт меню 2 или GUJ_ORIGIN_ACTION=disable удаляет только то, что создал скрипт:

  • файл /etc/nftables.d/guj-origin.nft
  • nftables table inet guj_origin

Чужие таблицы nftables, правила хостинга, Docker и системные firewall-правила не удаляются.

Проверка после настройки

  • Проверьте статус через пункт меню 3 или GUJ_ORIGIN_ACTION=status
  • Откройте сайт через защищенный домен и убедитесь, что он работает
  • Попробуйте обратиться к origin напрямую с внешнего IP - подключение к web-портам должно быть закрыто
  • Проверьте, что SSH доступен с вашего IP
Не запускайте на GUJ-ноде

Этот скрипт предназначен только для сервера сайта. Сама GUJ-нода защищается скриптом harden-node-host.sh.

Если IP ноды изменился

Сначала обновите web allowlist и правила firewall на origin, затем переводите домен на новую ноду.

curl -fsSL https://files.guj.ru/node/lockdown-origin-host.sh | sudo env \
  GUJ_ORIGIN_ACTION=update-web-allowlist \
  sh

Помогла ли эта статья?

Ваш ответ поможет сделать документацию понятнее