diff --git a/docs/backlog/README.md b/docs/backlog/README.md index ddc03d7..df302f5 100644 --- a/docs/backlog/README.md +++ b/docs/backlog/README.md @@ -40,7 +40,6 @@ _(sec-ревью)_ — три независимых security-ревью на м ## Низкий -- [Мелкий хардненинг Caddy](caddy-hardening-nits.md) — HSTS-заголовок, убрать лишний `NET_ADMIN`, убрать leftover-листенер `:29999` _(sec-ревью)_ - [Мелкий хардненинг контейнеров](container-hardening-nits.md) — `no-new-privileges`, non-root `user:`, homepage off `:latest`, соглашение о `127.0.0.1:` портах _(sec-ревью)_ - [Унифицировать ACL техпанелей Authelia](authelia-acl-unify.md) — rssbridge (SSRF) и dashboard за `one_factor` без subject; свести к `group:admins` + `two_factor` _(sec-ревью)_ - [Причесать роль `owner` под конвенции](ansible-owner-role-cleanup.md) — `assert` вместо `fail`+`when`, `loop` вместо `with_*`, добавить `meta`/README _(ансибл-ревью)_ diff --git a/docs/backlog/caddy-hardening-nits.md b/docs/backlog/caddy-hardening-nits.md deleted file mode 100644 index 80b475b..0000000 --- a/docs/backlog/caddy-hardening-nits.md +++ /dev/null @@ -1,19 +0,0 @@ -# Мелкий хардненинг Caddy - -**Приоритет:** низкий - -- **HSTS**: заголовок `Strict-Transport-Security` не выставляется нигде в - `files/caddyproxy/Caddyfile.template`. Одна строка `header - Strict-Transport-Security "max-age=31536000"` в общем сниппете (рядом с - `access_log`) закрывает downgrade/SSL-strip для всех поддоменов разом. -- **Лишний `NET_ADMIN`** (`files/caddyproxy/docker-compose.template.yml`) — - reverse-proxy эта capability не нужна (требуется лишь для тюнинга UDP-буферов - HTTP/3, работает и без неё с warning). Убрать у edge-контейнера, торчащего в - интернет. -- **Leftover-листенер `:29999`** в `Caddyfile.template` (site `status.vakhrushev.me, - :29999`) — наследие прямого доступа к netdata; убрать, оставив только доменный - site-блок. - -Из sec-ревью (fable, 2026-07-13). - -Связано: files/caddyproxy/Caddyfile.template, files/caddyproxy/docker-compose.template.yml. diff --git a/files/caddyproxy/Caddyfile.template b/files/caddyproxy/Caddyfile.template index fa0a638..27dad7c 100644 --- a/files/caddyproxy/Caddyfile.template +++ b/files/caddyproxy/Caddyfile.template @@ -31,10 +31,12 @@ http://:2020 { # Snippets # ------------------------------------------------------------------- -# Shared access log for all sites; consumed by GoAccess. -# Mode 644 lets read-only consumers (goaccess and ad-hoc host-side tail) -# read the file; lumberjack would otherwise default to 0600. -(access_log) { +# Общие настройки всех сайтов: access-лог и HSTS. +# +# Лог общий для всех сайтов, его разбирает GoAccess. Mode 644 нужен, чтобы +# файл читали потребители на хосте (goaccess и ad-hoc tail): lumberjack иначе +# ставит 0600. +(common) { log { output file /var/log/caddy/access.log { mode 644 @@ -44,6 +46,12 @@ http://:2020 { } format json } + + # HSTS: браузер, однажды увидевший заголовок, целый год ходит на это имя только + # по https, минуя редирект с http, — закрывает downgrade и SSL-strip. + # Без includeSubDomains: политика по каждому имени своя, а под vakhrushev.me + # есть поддомены не с этого сервера (например photo.vakhrushev.me). + header Strict-Transport-Security "max-age=31536000" } # ------------------------------------------------------------------- @@ -52,7 +60,7 @@ http://:2020 { vakhrushev.me { tls anwinged@ya.ru - import access_log + import common # Matrix federation delegation: tells other servers/clients that the # homeserver for vakhrushev.me lives at matrix.vakhrushev.me. @@ -80,7 +88,7 @@ vakhrushev.me { # сервис, не путать с кастомной домашней страничкой homepage_app на apex выше. start.vakhrushev.me { tls anwinged@ya.ru - import access_log + import common forward_auth authelia_app:9091 { uri /api/authz/forward-auth @@ -94,7 +102,7 @@ start.vakhrushev.me { matrix.vakhrushev.me { tls anwinged@ya.ru - import access_log + import common reverse_proxy { to tuwunel_app:6167 @@ -103,14 +111,14 @@ matrix.vakhrushev.me { auth.vakhrushev.me { tls anwinged@ya.ru - import access_log - + import common + reverse_proxy authelia_app:9091 } -status.vakhrushev.me, :29999 { +status.vakhrushev.me { tls anwinged@ya.ru - import access_log + import common forward_auth authelia_app:9091 { uri /api/authz/forward-auth @@ -122,7 +130,7 @@ status.vakhrushev.me, :29999 { git.vakhrushev.me { tls anwinged@ya.ru - import access_log + import common reverse_proxy { to gitea_app:3000 @@ -131,7 +139,7 @@ git.vakhrushev.me { outline.vakhrushev.me { tls anwinged@ya.ru - import access_log + import common reverse_proxy { to outline_app:3000 @@ -140,7 +148,7 @@ outline.vakhrushev.me { gramps.vakhrushev.me { tls anwinged@ya.ru - import access_log + import common reverse_proxy { to gramps_app:5000 @@ -149,7 +157,7 @@ gramps.vakhrushev.me { miniflux.vakhrushev.me { tls anwinged@ya.ru - import access_log + import common # /metrics наружу не отдаём. METRICS_ALLOWED_NETWORKS тут не помогает: за # прокси Miniflux видит приватный IP контейнера Caddy, а не адрес клиента. @@ -167,7 +175,7 @@ miniflux.vakhrushev.me { wakapi.vakhrushev.me { tls anwinged@ya.ru - import access_log + import common reverse_proxy { to wakapi_app:3000 @@ -176,7 +184,7 @@ wakapi.vakhrushev.me { wanderer.vakhrushev.me { tls anwinged@ya.ru - import access_log + import common reverse_proxy { to wanderer_web:3000 @@ -185,7 +193,7 @@ wanderer.vakhrushev.me { memos.vakhrushev.me { tls anwinged@ya.ru - import access_log + import common reverse_proxy { to memos_app:5230 @@ -196,7 +204,7 @@ memos.vakhrushev.me { # forward_auth — иначе двойная аутентификация. tududi.vakhrushev.me { tls anwinged@ya.ru - import access_log + import common reverse_proxy { to tududi_app:3002 @@ -205,7 +213,7 @@ tududi.vakhrushev.me { remembos.vakhrushev.me { tls anwinged@ya.ru - import access_log + import common forward_auth authelia_app:9091 { uri /api/authz/forward-auth @@ -219,7 +227,7 @@ remembos.vakhrushev.me { calibre.vakhrushev.me { tls anwinged@ya.ru - import access_log + import common reverse_proxy { to calibre_web_app:8083 @@ -228,7 +236,7 @@ calibre.vakhrushev.me { wanderbase.vakhrushev.me { tls anwinged@ya.ru - import access_log + import common forward_auth authelia_app:9091 { uri /api/authz/forward-auth @@ -242,7 +250,7 @@ wanderbase.vakhrushev.me { rssbridge.vakhrushev.me { tls anwinged@ya.ru - import access_log + import common forward_auth authelia_app:9091 { uri /api/authz/forward-auth @@ -256,7 +264,7 @@ rssbridge.vakhrushev.me { dozzle.vakhrushev.me { tls anwinged@ya.ru - import access_log + import common forward_auth authelia_app:9091 { uri /api/authz/forward-auth @@ -276,7 +284,7 @@ dozzle.vakhrushev.me { # дёргает трекер с сайта. Дашборд закрыт собственным логином goatcounter. {{ goatcounter_sites | join(', ') }} { tls anwinged@ya.ru - import access_log + import common reverse_proxy { to goatcounter_app:8080 @@ -285,7 +293,7 @@ dozzle.vakhrushev.me { goaccess.vakhrushev.me { tls anwinged@ya.ru - import access_log + import common forward_auth authelia_app:9091 { uri /api/authz/forward-auth @@ -305,7 +313,7 @@ goaccess.vakhrushev.me { # Authelia (2FA). Сам API tududi дёргает не через Caddy, а по web_proxy_network. bifrost.vakhrushev.me { tls anwinged@ya.ru - import access_log + import common forward_auth authelia_app:9091 { uri /api/authz/forward-auth diff --git a/files/caddyproxy/docker-compose.template.yml b/files/caddyproxy/docker-compose.template.yml index 3ab9023..8c7e330 100644 --- a/files/caddyproxy/docker-compose.template.yml +++ b/files/caddyproxy/docker-compose.template.yml @@ -7,8 +7,6 @@ services: - "80:80" - "443:443" - "443:443/udp" - cap_add: - - NET_ADMIN volumes: - "{{ caddy_file_dir }}:/etc/caddy" - "{{ data_dir }}:/data"