Безопасность — та часть Auth Fly, в которой мы не хотим никого удивлять. Ниже — весь чек-лист, разбитый по стадиям, с честно записанными сильными местами рядом с тем, что ещё предстоит сделать.
Что уже сильно
- SAML ACS берётся из конфига SP, никогда — из AuthnRequest. Закрывает подмену ACS.
- OIDC
redirect_uriвалидируется точным сравнением по allowlist на каждого клиента. - Authorization code — одноразовые, ограничены TTL, сравниваются через
hmac.Equal. - Сессионные cookie подписаны HMAC-SHA256,
HttpOnly,Secure. Cache-Control: no-storeна token endpoint.- Hosted-UI отдаёт статику локально; зависимостей от CDN нет.
html/templateи templ автоматически экранируют поля, рисуемые от пользователя.- URL возврата после логаута валидируются по allowlist origin.
Стадия 1 — критическое (неделя 1)
- Проверять
issиaudв Hanko-JWT после проверки подписи. - Фиксировать
algJWT наRS256в верификаторе; никогда не доверять значению из заголовка. - Перестать принимать bearer-токены из query-параметра
?token=. - Отказывать в старте, когда
session_key— placeholder или короче 32 байт. - Конфигурировать
http.Serverс явными ReadTimeout, WriteTimeout и IdleTimeout. - Создавать файл приватного ключа IdP с режимом
0600. - Запускать контейнер не от root.
Стадия 2 — усиление протоколов (недели 2–3)
- PKCE: хранить
code_challenge+ метод, проверятьcode_verifier, анонсировать в Discovery. - Добавить
at_hashв id_token, чтобы привязать его к access token. - Проверять
issв access token до того, как принимать его в работу. - Валидировать
IssueInstantи (когда есть)Destinationв SAML AuthnRequest. - Опционально проверять подписанные AuthnRequest для SP, которые это включают.
- Запустить горутину очистки code-store; ограничить рост памяти.
- Валидировать запрашиваемые OIDC-scopes; отклонять всё, что вне поддерживаемого набора.
Стадия 3 — web-безопасность (недели 3–4)
- Middleware security headers: CSP, X-Frame-Options DENY, X-Content-Type-Options, Referrer-Policy, HSTS.
- CSRF-токены на каждом POST-запросе админки.
- Rate limiting на
/token,/authorize,/sso,/console/users. http.MaxBytesReaderна POST-эндпоинтах.- Graceful shutdown через
signal.NotifyContext+server.Shutdown.
Стадия 4 — enterprise (недели 4–6)
- Ротация ключей с multi-key JWKS и валидатором предыдущего ключа.
- Перевод генерации новых ключей на RSA-4096.
- SAML Single Logout (SLO) для подключённых SP.
- Структурированные аудит-логи: кто, когда, что, откуда и с каким результатом.
- Опциональное серверное хранилище сессий (Redis или SQLite) для принудительного логаута.
- OIDC: refresh-токены,
prompt,max_age. - Админка: CSRF, настраиваемая верификация email, scoped API keys.
- Health- и readiness-эндпоинты для оркестрации.
Как следить
Каждый пункт ведётся публично на GitHub в github.com/authfly. Сообщения об уязвимостях — через приватные security advisories в той же организации. Без приватной дорожной карты и без скрытых severity-оценок.