Files
aurum/Caddyfile
ZProger 14948aff1d security: TLS, проверка Host, шифрованное запоминание входа и аудит-лог
- TLS через подключаемый overlay docker-compose.tls.yml + Caddyfile:
  Caddy сам получает и продлевает сертификат Let's Encrypt, HSTS
  добавляется на уровне прокси — намеренно там, а не в nginx.conf,
  иначе установки без TLS заперли бы сами себя;
- проверка заголовка Host против DNS rebinding: AURUM_ALLOWED_HOSTS,
  по умолчанию localhost и 127.0.0.1, чужой Host получает 421 с
  подсказкой, какую переменную поправить;
- «запомнить меня на 7 дней» вернулось в безопасном виде: пароль
  шифруется AES-GCM ключом с extractable: false в IndexedDB, вместо
  прежнего base64 в localStorage, который разворачивался обратно в
  пароль одним atob. Требует secure context, поэтому по обычному HTTP
  к LAN-адресу чекбокс не показывается, а не притворяется рабочим;
- аудит-лог необратимых операций (восстановление бэкапа, массовое
  создание транзакций, удаление счёта) в лог контейнера. Не в БД
  сознательно: таблица аудита исчезла бы ровно в том событии, которое
  должна объяснять;
- README: раздел про TLS и таблица двух переменных, решающих, кто
  может достучаться до инстанса.
2026-09-10 21:34:40 +03:00

24 lines
1.0 KiB
Caddyfile

# Used only by the TLS overlay (docker-compose.tls.yml). The hostname comes
# from AURUM_DOMAIN in .env — Caddy requests a Let's Encrypt certificate for
# it on first start and renews it on its own from then on.
#
# For a local trial without a public domain, set AURUM_DOMAIN=localhost and
# uncomment "tls internal" below: Caddy then issues its own certificate from
# a local CA. The browser won't trust it until you install that CA, so this
# is for checking the plumbing, not for daily use.
{$AURUM_DOMAIN} {
# tls internal
encode zstd gzip
# Aurum's own nginx already sets CSP, nosniff, Referrer-Policy and the
# rest — they pass through untouched. HSTS is added here instead of
# there on purpose: it tells browsers to refuse plain HTTP to this host
# for a year, which is only safe to promise once TLS actually terminates
# in front of the app. Setting it in nginx.conf would apply it to
# plain-HTTP installs too, and lock them out of their own instance.
header Strict-Transport-Security "max-age=31536000; includeSubDomains"
reverse_proxy web:80
}