Безопасность панели
Панель доступна из интернета на порту 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, прежде чем что-либо запускать. Перед каждым обновлением делается резервная копия, а если новая версия не запустится, обновление откатится само. См. обновление.