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