GrantForge

    Архитектура и безопасность

    Проектирование безопасности

    Проектирование сессий, CSRF, паролей и блокировок, двухэтапной проверки и повторной проверки, зашифрованного хранения, токенов и аудита.

    Сессии консоли

    • Сессии хранятся в базе данных (Spring Session JDBC); в браузере хранится только cookie GRANTFORGE_SESSION: HttpOnly, SameSite=Lax и Secure для HTTPS (либо принудительно через grantforge.security.cookie-secure).
    • Идентификатор сессии и CSRF-токен меняются при входе, при завершении двухэтапной проверки и при завершении федеративного входа — это предотвращает фиксацию сессии.
    • Изменяющие состояние запросы обязаны нести заголовок X-XSRF-TOKEN, значение которого берётся из cookie XSRF-TOKEN.
    • Администраторы могут просматривать и завершать любые сессии; отключение, блокировка или сброс пароля немедленно завершает все сессии этой учётной записи; смена пароля завершает сессии на других устройствах.

    Пароли

    • Новые пароли хешируются с помощью Argon2id; хеши BCrypt и импортированные из 1.x по-прежнему проверяются и при следующем входе обновляются до текущего алгоритма.
    • Политика: длина, классы символов, история и срок действия настраиваются, а пароль не может содержать имя пользователя.
    • Учётная запись блокируется после настроенного числа подряд неудачных попыток; для неизвестного имени пользователя также выполняется одно сравнение хеша, поэтому время ответа не выдаёт, какие имена существуют; отключённые учётные записи и отключённые тенанты сообщаются только после успешной проверки пароля.

    Двухэтапная проверка и повторная проверка

    • TOTP (RFC 6238, SHA-1, 6 цифр, 30 секунд, с допуском одного временного шага до и после); код для одного и того же временного шага можно использовать только один раз; 10 одноразовых резервных кодов хранятся в виде хешей SHA-256.
    • Для учётных записей с включённой двухэтапной проверкой после проверки пароля сессия остаётся в состоянии «pending» в течение 5 минут, и вход не завершается, пока не выполнен второй шаг.
    • Чувствительные конечные точки помечены аннотацией @RequireStepUp: учётные записи с включённой двухэтапной проверкой должны выполнить повторную проверку в настраиваемом временном окне, иначе вызов возвращает GF-SECURITY-006, а консоль перед повторной попыткой показывает диалог подтверждения.

    Зашифрованное хранение

    Пароли привязки источников идентификации, секреты клиентов, ключи аутентификаторов, конфиденциальная конфигурация сервисов данных и закрытые ключи подписи сервера авторизации хранятся в зашифрованном виде с помощью AES-GCM. Ключ задаётся в grantforge.security.encryption-key; если он не настроен, генерируется автоматически и сохраняется в базе данных (пригодно только для пробного использования). Токены агентов и секреты OAuth-клиентов хранятся только в виде хешей.

    Токены

    • Сервер авторизации хранит хеши токенов, а не сами токены.
    • Refresh-токены меняются при каждом использовании; повторное использование старого токена отзывает всю авторизацию.
    • Отключённая или заблокированная учётная запись, учётная запись, требующая смены пароля, отключённый клиент и отключённый тенант блокируют обновление токенов; Open API повторно проверяет токен при каждом вызове.
    • Снимки политик подписываются Ed25519, и агенты проверяют подпись перед их использованием.

    Укрепление конечных точек

    • Каждая конечная точка обязана объявить свой режим доступа, иначе сервер не запустится; конечные точки, требующие прав, проверяются по последнему снимку при каждом вызове.
    • Отклонённые вызовы записываются в журнал аудита (не блокируя запрос).
    • Локальная учётная запись с именем, совпадающим с учётной записью во внешнем источнике идентификации, никогда не связывается автоматически — это предотвращает захват учётной записи.
    • При экспорте CSV ячейки, начинающиеся с =, +, - или @, получают префикс, что предотвращает внедрение формул.

    Аудит

    Все административные операции, изменения выдач, события входа и отклонённые вызовы записываются в журнал аудита; изменения, связанные с правами, и их записи аудита фиксируются в одной транзакции, поэтому отменённая транзакция не оставляет после себя записи аудита.

    Редактировать эту страницу на GitHub