Files
selfpost/docs/security.md
T
mix 8ce050ef7f release: 0.1.0: Phases 0-11: panel, Postfix/DKIM, milter, backup, Docker image
Initial feature-complete implementation of the v1.0 specification (phases 0-11 of `docs/implementation-plan.md`).
Added:
  - Panel (Go, single static binary) with SQLite persistence, one-time
  - Domain management with per-domain DKIM (RSA-2048, generated in pure Go) and
  - Application (sender identity) management: SASL credentials via `sasldb2`,
  - Full Postfix relay config generated from env at container start: SMTPS 465,
  - Journal milter (pure Go, `go-milter`) recording every send to `send_log`;
  … (6 more in CHANGELOG)

Full detail: CHANGELOG.md (0.1.0).
2026-09-22 15:24:51 +03:00

3.5 KiB
Raw Blame History

Безопасность: принятые риски

Что здесь. Обязательные требования к безопасности — ТЗ 7.6; соответствие им проверено полным аудитом на v1.0 и здесь не пересказывается. Hardening сверх обязательного 7.6 (security-заголовки, проверка origin, cookie __Host- с обнаружением дублей — Фаза 14) тоже закрыт, история — в CHANGELOG.md и git log. Этот документ держит третью категорию: то, что закрыто сознательно не было, чтобы решение не потерялось и не переоткрывалось заново.

Здесь, а не в implementation-plan.md, потому что план — только про несделанную работу, а принятый риск — не работа, а решение: у него нет состояния «в очереди», есть условие, при котором к нему возвращаются.

Принятые риски

  • POST без Sec-Fetch-Site и без Origin пропускается. Клиент, не посылающий ни одного из двух — по-настоящему старый браузер или webview с замороженным движком, — остаётся уязвим к CSRF с любого сайта. Принято сознательно: панель однопользовательская, админ выбирает браузер сам, а строгий режим не «защитил бы» такой клиент, а просто сломал бы в нём панель. Ужесточение — одна строка в originAllowed (internal/web/security.go): вернуть false вместо true в ветке «нет обоих заголовков».
  • CSRF-токены, привязанные к сессии, не делаются. Проверка origin закрывает соседний поддомен, но зависит от поведения браузера; токен — нет. Цена — скрытое поле примерно в двух десятках форм. Триггером вернуться к вопросу считать появление требования «устойчиво независимо от браузера». От XSS внутри самой панели не спас бы и токен: код, исполняющийся в origin панели, отправит запрос сам — против этого работают автоэкранирование html/template (7.6.7) и CSP, поэтому шаблоны не должны содержать inline-скриптов и inline-стилей.

Как этот список пополняется

Предрелизная проверка на уязвимости (пункт D.5 плана, модель Fable) закрывает каждую находку одним из двух способов: правка до тега — либо запись сюда, с обоснованием и условием возврата, как у двух пунктов выше. Третьего варианта («посмотрели и ладно») нет.