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

Собственный аудит по OWASP ASVS

Серверная часть GameAP проверена по стандарту OWASP ASVS (Application Security Verification Standard) — открытому списку конкретных требований к безопасности, выполнение которых можно проверить: от хранения паролей до работы с загруженными файлами.

Требования по одному разбирали AI-агенты, а каждый их вывод затем проверялся вручную. Для каждого требования указано, выполнено оно, выполнено частично или не выполнено, со ссылками на код и тесты. Оба отчёта опубликованы, в том числе с требованиями, которые пока не выполнены.

Как защищена панель

Вход и пароли

  • Пароли хранятся только в виде медленного необратимого хеша (bcrypt) и никогда — в читаемом виде.
  • Пароль должен быть не короче 12 символов, а около 46 000 распространённых паролей не принимаются.
  • После 5 неверных попыток для одной учётной записи или 20 с одного IP-адреса вход приостанавливается на 15 минут.
  • Форма входа отвечает одинаково и за одинаковое время, есть такая учётная запись или нет.
  • К форме можно подключить капчу: reCAPTCHA или Cloudflare Turnstile.

Двухфакторная аутентификация

  • Коды из приложения-аутентификатора и 10 одноразовых резервных кодов.
  • Обязательна для администраторов: после 30-дневной отсрочки администратор, у которого она не включена, может только её настроить.
  • Секретный ключ хранится в базе в зашифрованном виде, а резервные коды — только в виде хешей.
  • Использованный код повторно не принимается, на один вход даётся 5 попыток. Чтобы отключить двухфакторную аутентификацию, нужны и пароль, и код.

Сессии и API-токены

  • Токены сессий зашифрованы и защищены от подделки. Они действуют 24 часа, а с «Запомнить меня» — 7 дней.
  • При выходе токен отзывается на сервере. После смены пароля сессии и API-токены, выданные до неё, перестают работать.
  • У API-токенов ограниченные права. Токен показывается один раз, хранится в виде хеша и может быть отозван в любой момент.
  • Долгоживущие токены не принимаются в ссылках: для скачивания файлов и консоли в реальном времени используются одноразовые токены, которые действуют не дольше 10 секунд.
  • Запросы авторизуются через заголовок, а не cookie — это защищает от подделки межсайтовых запросов (CSRF).

Права доступа

  • Отдельные права на каждое действие с сервером: запуск, остановка, консоль, файлы, RCON и другие.
  • Всё, что явно не разрешено, запрещено, а права проверяются на сервере при каждом запросе.
  • Пользователь видит только назначенные ему серверы. Для остальных панель отвечает так, будто сервера не существует.
  • Функции администрирования доступны только администраторам. API-токен получает к ним доступ, только если ему явно выдали права администратора.

HTTPS и защита в браузере

  • Встроенный клиент Let's Encrypt сам получает HTTPS-сертификаты и продлевает их.
  • Только TLS 1.2 и новее, с современными шифрами, которые обеспечивают прямую секретность.
  • Строгая политика безопасности контента (CSP) блокирует внедрённые на страницу скрипты и сильно усложняет межсайтовый скриптинг (XSS).
  • Панель нельзя встроить в чужой сайт, адреса её страниц не утекают через заголовок Referer, а при работе по HTTPS включается HSTS. Ответы с данными учётных записей не кешируются.

Файловый менеджер

  • Доступ к файлам — отдельное право для каждого сервера, и он ограничен папкой этого сервера.
  • Пути с ../ и похожими уловками отклоняются. На самой машине GameAP Daemon дополнительно не выпускает файловые операции за пределы своего рабочего каталога.
  • При распаковке архивов блокируются файлы и ссылки, которые оказались бы за пределами целевой папки, а общий размер и количество файлов ограничены.
  • Файлы открываются в браузере в изолированном режиме или скачиваются, поэтому загруженный HTML- или SVG-файл не может выполнить скрипты в панели.

Игровые серверы и консоль

  • Значения из настроек сервера подставляются в команду запуска отдельными аргументами, поэтому через них нельзя внедрить лишние команды.
  • Каждый игровой сервер может работать от отдельного системного пользователя или в собственном контейнере Docker или Podman с ограничением памяти и процессора.
  • Менять команду запуска, папку и системного пользователя сервера могут только администраторы.
  • Просмотр консоли и отправка команд — разные права, и они проверяются для каждого сообщения. Пароль RCON скрывается в выводе консоли.

Выделенные серверы и GameAP Daemon

  • GameAP Daemon не открывает на машине сетевые порты: он сам подключается к панели.
  • Соединение по умолчанию зашифровано TLS. После настройки демон доверяет только собственному центру сертификации панели.
  • Машина подключается одноразовым ключом, который по умолчанию действует один час.
  • Каждая машина получает собственный случайный ключ. Панель хранит только его хеш и нигде его не показывает. Можно также включить обязательную взаимную TLS-аутентификацию.

Плагины

  • Плагины работают в изолированной среде WebAssembly: у них нет прямого доступа к файлам, сети и переменным окружения — только к интерфейсам, которые предоставляет панель.
  • У каждого плагина ограничены память, время выполнения и частота запросов.
  • Устанавливать плагины могут только администраторы, а пакеты из каталога сверяются по хешу SHA-256.
  • HTTP-запросы плагинов по умолчанию идут только по HTTPS и не могут обратиться к локальным сетям и сервисам метаданных облачных провайдеров (защита от SSRF).

Журнал аудита и данные

  • Журнал аудита безопасности записывает входы и неудачные попытки, отказы в доступе, изменения пользователей, ролей и токенов, операции с файлами и управление плагинами.
  • В каждой записи есть пользователь, IP-адрес, время и идентификатор запроса.
  • Секреты двухфакторной аутентификации и плагинов хранятся в зашифрованном виде.
  • Все запросы к базе данных параметризованы, что защищает от SQL-инъекций.
  • При ошибках сервера клиент получает общее сообщение, а подробности попадают только в журнал сервера.

Безопасность при разработке

Тесты безопасности

Отдельный набор тестов, сгруппированный по OWASP API Security Top 10, проверяет, что пользователь не получит доступ к чужим серверам, не обойдёт вход и не повысит себе права. Он запускается при каждом изменении.

Статический анализ

Каждое изменение проходит через анализатор кода с правилами безопасности, а тесты запускаются на настоящих MySQL, PostgreSQL и Redis.

Тесты на случайных данных

Каждую неделю вход, проверки прав и обработку путей к файлам прогоняют на большом объёме случайных и некорректных данных (фаззинг).

Проверка зависимостей

Каждую неделю и при каждом изменении основной ветки зависимости сверяются с базой известных уязвимостей Go. Их версии зафиксированы контрольными суммами.

Мутационное тестирование

Каждую неделю в код входа и проверки прав намеренно вносятся небольшие ошибки, чтобы убедиться, что тесты их находят.

Открытый код

Код открыт на GitHub под лицензией MIT. К релизам прилагаются контрольные суммы SHA-256, а Docker-образ работает не от root.

Рекомендации администраторам

  1. 1

    Включите HTTPS

    gameapctl может получить сертификат Let's Encrypt, а дальше панель будет продлевать его сама. Заодно перенаправьте обычный HTTP на HTTPS.

    TLS_FORCE_HTTPS=true
  2. 2

    Включите двухфакторную аутентификацию сразу

    Администраторам даётся 30 дней на настройку, но ждать незачем. Попросите включить её и других пользователей.

  3. 3

    Добавьте капчу на форму входа

    Особенно если панель доступна из интернета.

    CAPTCHA_PROVIDER
  4. 4

    Требуйте сертификаты от демонов

    При взаимной TLS-аутентификации панель принимает подключения только от демонов с сертификатом, который она сама выдала.

    GRPC_REQUIRE_MTLS=true
  5. 5

    Не запускайте игровые серверы от root

    Выделите для игровых серверов отдельного системного пользователя или запускайте их в контейнерах Docker или Podman.

  6. 6

    Устанавливайте плагины только из надёжных источников

    И включите проверку разрешений, чтобы каждый плагин получал только тот доступ, который заявил.

    PLUGINS_PERMISSIONS_ENFORCE=true
  7. 7

    Задайте собственные секретные ключи

    gameapctl создаёт их при установке. При установке через Docker или вручную задайте длинные случайные значения сами.

    ENCRYPTION_KEYAUTH_SECRET
  8. 8

    Своевременно обновляйтесь

    Исправления безопасности выходят в обычных релизах. Подпишитесь на репозиторий GameAP на GitHub, чтобы получать уведомления об уязвимостях.

Как сообщить об уязвимости

Пожалуйста, не публикуйте сведения об уязвимостях открыто — сообщите о них приватно через GitHub или по почте. Авторов отчётов указывают в примечаниях к релизу и в описании уязвимости.

72 часа
на подтверждение получения отчёта
14 дней
на первичную оценку
14 дней
на исправление критической уязвимости
90 дней
до публичного раскрытия, по согласованию с автором отчёта