TLS 1.3 · 1.2 min
HTTP → redirect
Сертификаты Let's Encrypt / корп. CA
client_max_body_size,
client_*_timeout,
limit_conn,
large_client_header_buffers. Раньше и грубее лимитов
③⑤: по сырому соединению, не по опознанному клиенту.
max-age=1y; includeSubDomains
CSP
default-src 'self'; object-src 'none'; base-uri 'self';
form-action 'self'
X-Content-Type-Options nosniff
X-Frame-Options DENY
Cross-Origin-Opener-Policy same-origin
Cross-Origin-Resource-Policy same-origin
Referrer-Policy strict-origin-when-cross-origin
Permissions-Policy
Cache-Control no-store на
чувствительных
Clear-Site-Data на logout
Токен-роуты no-referrer
Server · X-Powered-By off
true
Allow-Methods GET/POST/PUT/DELETE/PATCH
Allow-Headers
Authorization, Content-Type, X-Request-Id ·
X-CSRF-Token
v2
Expose-Headers Retry-After, X-RateLimit-Remaining, X-Request-Id
Preflight Max-Age 3600
API rate limiting per-user, по ролям · Redis
>
/refresh).brute:ip ·
brute:account
429 + Retry-After, а не держим запрос открытым: иначе
сами висящие соединения становятся вектором нагрузки.
argon2 verify
(constant-time): ответ занимает столько же, сколько для реального
аккаунта.
chat_id:
5 неудачных вводов сжигают попытку — за новым кодом в веб. Публичный
webhook бота — под
rate-limit
по IP/источнику; истёкший и неверный код неотличимы (единый
410 LINK_EXPIRED). Бот открыт всем, поэтому рубеж жёстче,
чем у закрытого воркспейсом Slack.
argon2id
медленный
memory 19 MB
iterations 2
parallelism 1
SHA-256
быстрый
AES-256-GCM
по ключу
smtp_settings.password_encsources.credential_encsources.webhook_secret_encai_providers.api_key_enctools.credential_encnotification_channels.url_encnotification_channels.secret_encmfa_secret v2secrets.token_urlsafe()
≥32B
Constant-time hmac.compare_digest()
Хэш токенов в БД SHA-256
Подпись JWT HMAC-SHA256
mfa_secret — AES-256-GCM (секрет нужен
обратимо: сервер считает по нему TOTP). Ключ из env/vault, key
rotation — несколько версий (key ID в данных).
Recovery codes не шифруются, а хэшируются (argon2id),
как пароли: одноразовые, сервер их только сверяет.
audit_log(actor, action, target, result, ip, ua) —
фиксирует намерение актора, а не diff строк (этим заняты
готовые row-версионеры). Application-дефолт: OWASP ASVS V7,
NIST SP 800-92.old→new только для неконфиденциального: роль, статус).
Лог неудаляемый и навсегда — PII, попавшее сюда, уже не вычистить.
result=failure не потерялся при откате основной
операции.
audit_retention_days, по
умолчанию «бесконечно». Сам джоб чистки и выгрузку в холодное
хранилище проектируем вместе с hash-chaining — удаление должно
дружить с неизменностью, а срок задаёт compliance (SOC 2 / ISO
27001).
pgaudit v2: SQL-операции
пишутся в самой БД, application-аудит этого не видит. Форензика для
compliance (SOC 2 / ISO 27001).