К основному содержанию

Сервер сайта

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

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

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

Разрешите HTTP- и HTTPS-подключения к серверу сайта только с IP серверов GUJ и других доверенных сервисов.

Иначе к серверу можно обратиться напрямую и обойти проверки GUJ.

В названиях команд сервер сайта обозначен словом origin.

Что делает скрипт защиты сервера сайта

Скрипт называется lockdown-origin-host.sh. Он использует nftables — системный инструмент для управления сетевым доступом.

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

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

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

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

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

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

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

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

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

Если запустить команду по SSH без дополнительных параметров, откроется меню. Английское слово allowlist в названиях пунктов означает список разрешённых IP.

CIDR — это запись диапазона IP, например 203.0.113.0/24.

ПунктЧто делает
1 - Включить/переустановить полную защиту originСкачивает из панели список разрешенных IP, создает правила и применяет их
2 - Отключить полную защиту GUJ для originУдаляет только таблицу nftables guj_origin и файл guj-origin.nft
3 - Показать текущий статусПоказывает файл правил, активную таблицу nftables и списки разрешенных IP для веб-портов и SSH
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. Откроет веб-порты сервера сайта только для этих IP
  3. Спросит, разрешать ли SSH только для IP из списка
  4. Если вы ответите Да, добавит текущий SSH IP и предложит добавить дополнительные IP/CIDR
  5. Проверит конфигурацию командой nft -c
  6. Создаст резервную копию старых правил GUJ
  7. Применит новые правила

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

SSH на сервере сайта

Доступ по SSH настраивается отдельно от веб-портов. Можно оставить SSH открытым для всех, но безопаснее разрешить его только выбранным IP.

Если ограничение включено, скрипт разрешает SSH:

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

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

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

Команды для запуска без меню

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

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

Пример добавления 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

Ручной список разрешенных IP для веб-портов

Если панель временно недоступна или нужно задать список вручную, передайте 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

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

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

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

  • файл /etc/nftables.d/guj-origin.nft
  • таблицу nftables inet guj_origin

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

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

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

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

Если изменился IP сервера GUJ

Сначала обновите разрешённые IP на сервере сайта. Затем переводите домен на новый сервер GUJ.

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

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

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