Безопасность панели

Панель доступна из интернета на порту 1500, поэтому её собственная страница входа защищена в несколько слоёв.

Кто может войти

Обычно в панель входят с именем и паролем, заданными при установке; они хранятся в .env как PANEL_USER и PANEL_PASSWORD. Сменить оба значения можно в Настройки > Доступ к панели.

Если включён ROOT_LOGIN, войти может и root со своим паролем от сервера. По умолчанию этот параметр выключен. Root-терминал открывается только в сеансе, начатом под root.

Вход других пользователей сервера с их паролем ОС, при котором каждый видит только свои сайты, запланирован на версию 2.2 (см. пользователи и план развития).

Как проверяется пароль root

Панель работает от непривилегированного пользователя wardpane и не может читать /etc/shadow. Небольшой root-помощник проверяет пароль root через unix_chkpwd, тот же инструмент, которым пользуется PAM (он понимает yescrypt). systemd запускает помощника при первом подключении к его сокету, который могут открыть только root и пользователь панели. Пароль нигде не записывается и не попадает в журналы.

Кроме ограничений панели, у помощника есть свои. Он проверяет один пароль за раз и отвечает не раньше чем через секунду. После 5 неверных паролей за минуту он на минуту перестаёт проверять, а при каждом повторе пауза удваивается, вплоть до часа. Это состояние переживает перезапуски, так что даже взломанная панель не сможет подбирать пароли быстрее.

Ограничения против подбора паролей

  • 5 неудачных попыток (LOGIN_MAX_ATTEMPTS) блокируют адрес на 15 минут (LOGIN_BLOCK_MINUTES). Для IPv6 блокируется вся сеть /64, так как у одного абонента обычно целая /64.
  • 50 неудач из одной сети IPv6 /48 блокируют всю /48.
  • 50 неудач со всех адресов за минуту закрывают вход на 5 минут для всех адресов, с которых раньше не входили. Одна сеть добавляет к этому счёту не больше 5 неудач в минуту. Если атака вскоре повторяется, блокировка удваивается, вплоть до 60 минут.
  • Адреса, с которых успешно входили за последние 30 дней (до 50 адресов), не затрагиваются общей блокировкой и блокировкой /48.
  • Для root-паролей есть отдельный счётчик: после 10 неверных root-паролей за час вход под root принимается только с адресов, с которых входили раньше, даже если задан белый список.

Чтобы снять сразу все блокировки входа:

sudo node /opt/wardpane/bin/unlock-login.js

Белый список IP

Если задан PANEL_ALLOW_IPS (адреса и сети через запятую, пробел или с новой строки), другим адресам панель не отвечает вообще, даже страницей входа. Если переменная задана, но корректных записей в ней нет, панель принимает подключения только с самого сервера. Попасть в неё тогда можно через SSH-туннель:

ssh -L 1500:127.0.0.1:1500 root@your-server
# затем откройте https://127.0.0.1:1500

Сессии

Сессия длится не дольше SESSION_HOURS (12 часов) с момента входа, а без активности заканчивается раньше, через SESSION_IDLE_MINUTES (2 часа). Фоновое обновление открытой страницы активностью не считается. Если сессия закончится посреди редактирования сайта, несохранённые правки не пропадут, и после входа форма откроется снова. Ответы API отправляются с Cache-Control: no-store.

Root-помощники

Панель никогда не работает от root. Когда нужны права root (создание пользователей Linux, папок сайтов, пулов php-fpm, демонов PM2, юнитов systemd), панель записывает нужное состояние в файл, а root-помощник, запущенный systemd, применяет его. Помощник заново проверяет каждое значение и доверяет панели не больше, чем любому другому источнику. Если настройки сайта эту проверку не проходят, сайт продолжает работать с прежней конфигурацией, а панель показывает ошибку.

Сайты в песочнице

Каждый PHP-сайт работает в своём php-fpm, а каждое приложение Node.js в своём дереве процессов PM2, от отдельного пользователя Linux в песочнице systemd. В песочнице система доступна только для чтения, другие сайты и папки панели не видны, дополнительные привилегии получить нельзя, память и процессор ограничены. См. PHP и Node.js.

Контрольные суммы релизов и безопасные обновления

Архивы релизов публикуются вместе с контрольной суммой SHA-256. Установщик скачивает архив по HTTPS и сверяет SHA-256, прежде чем что-либо запускать. Перед каждым обновлением делается резервная копия, а если новая версия не запустится, обновление откатится само. См. обновление.