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

GUJ на своём сервере

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

Как закрыть лишние подключения к серверу GUJ

Что делает защита

Запустите harden-node-host.sh на сервере с GUJ, чтобы закрыть лишние входящие подключения.

Сервер GUJ принимает запросы посетителей по HTTP и HTTPS, поэтому порты 80 и 443 остаются открытыми. Доступ по SSH лучше разрешить только выбранным IP.

Nftables — это системный инструмент для управления сетевым доступом. Скрипт создаёт в нём отдельную таблицу inet guj_node и файл правил /etc/nftables.d/guj-node.nft.

Другие таблицы и правила сетевого доступа скрипт не меняет.

Что делает harden-node-host.sh

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

Когда запускать

Запускайте этот скрипт после установки GUJ на сервер. install.sh не меняет сетевые правила автоматически, чтобы случайно не закрыть SSH.

При запуске по SSH скрипт пытается определить текущий IP администратора и добавить его в список разрешенных.

Запустите скрипт, если в карточке сервера указано Не настроена или правила сетевого доступа меняли вручную.

Команда запуска

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

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

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

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

ПунктЧто делает
1 - Включить/переустановить полную защитуСоздаёт и применяет сетевые правила сервера GUJ
2 - Отключить полную защиту GUJУдаляет только таблицу nftables guj_node и файлы, созданные скриптом
3 - Показать текущий статусПоказывает файл правил, активную таблицу nftables и список разрешенных IP для SSH
4 - Включить ограничение SSH по allowlistОткрывает SSH только для разрешенных IP/CIDR
5 - Отключить ограничение SSHОставляет SSH открытым для всех, остальные GUJ-правила сохраняются
6 - Добавить IP/CIDR в SSH allowlistДобавляет адреса и переустанавливает правила
7 - Удалить IP/CIDR из SSH allowlistУдаляет адреса и переустанавливает правила
0 - ВыходВыходит без изменений

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

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

  1. Проверит наличие nftables
  2. Спросит, нужно ли разрешить SSH только выбранным IP
  3. Если ограничение включено, попробует определить текущий SSH IP
  4. Добавит текущий SSH IP, IP из панели и дополнительные IP, которые вы введете
  5. Сгенерирует правила, где 80/443 открыты всем, а остальные входящие подключения закрыты
  6. Проверит конфигурацию командой nft -c
  7. Создаст резервную копию старых правил GUJ
  8. Применит новые правила

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

Если SSH не на 22 порту

Укажите свой SSH-порт и IP, которым разрешен SSH:

curl -fsSL https://files.guj.ru/node/harden-node-host.sh | sudo env \
  GUJ_NODE_SSH_PORT=2222 \
  GUJ_NODE_SSH_ALLOWED_IPS="198.51.100.10" \
  sh

Список разрешенных IP для SSH

Доступ по SSH настраивается отдельно от веб-портов. Порты 80/443 остаются открытыми для сайтов, а SSH можно разрешить только выбранным IP.

Если ограничение включено, SSH будет доступен:

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

Добавить IP через меню можно пунктом 6, удалить — пунктом 7.

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

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

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

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

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

curl -fsSL https://files.guj.ru/node/harden-node-host.sh | sudo env \
  GUJ_NODE_ACTION=add-ssh-ip \
  GUJ_NODE_SSH_ADD_IPS="198.51.100.10" \
  sh

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

curl -fsSL https://files.guj.ru/node/harden-node-host.sh | sudo env \
  GUJ_NODE_ACTION=remove-ssh-ip \
  GUJ_NODE_SSH_REMOVE_IPS="198.51.100.10" \
  sh

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

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

  • файл /etc/nftables.d/guj-node.nft
  • таблицу nftables inet guj_node
  • файл sysctl-настроек /etc/sysctl.d/99-guj-node.conf
  • файл лимитов /etc/security/limits.d/99-guj-node.conf

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

Как понять, что все работает

Откройте карточку сервера в панели. Статус Настроена означает, что скрипт применил эти правила:

  • входящие подключения закрыты по умолчанию
  • порты 80 и 443 открыты для сайтов
  • SSH доступен только с разрешённых IP
  • лишние TCP-порты закрыты

Если защита Не настроена, в карточке будет причина: не найден файл правил, входящие подключения не закрыты по умолчанию, SSH открыт всем или открыт лишний порт.

После запуска скрипта подождите новый отчёт от сервера. Затем обновите карточку в панели.

Проверка с сервера

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

Не путайте с сервером сайта

Этот скрипт защищает сервер GUJ.

Если сайт находится на отдельном сервере, для него используется другая инструкция и скрипт lockdown-origin-host.sh.

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

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