caddyproxy: HSTS для всех сайтов и мелкий хардненинг

- сниппет access_log переименован в common, туда добавлен заголовок
  Strict-Transport-Security на год; без includeSubDomains — под
  vakhrushev.me есть имена не с этого сервера
- у edge-контейнера убрана capability NET_ADMIN, reverse-proxy её не требует
- убран leftover-листенер :29999 у status.vakhrushev.me
- задача caddy-hardening-nits удалена из беклога
This commit is contained in:
av
2026-08-22 19:14:34 +03:00
parent 16f0712a31
commit 70372ee028
4 changed files with 35 additions and 49 deletions
-1
View File
@@ -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-ревью)_ - [Мелкий хардненинг контейнеров](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-ревью)_ - [Унифицировать 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 _(ансибл-ревью)_ - [Причесать роль `owner` под конвенции](ansible-owner-role-cleanup.md) — `assert` вместо `fail`+`when`, `loop` вместо `with_*`, добавить `meta`/README _(ансибл-ревью)_
-19
View File
@@ -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.
+34 -26
View File
@@ -31,10 +31,12 @@ http://:2020 {
# ------------------------------------------------------------------- # -------------------------------------------------------------------
# Общие настройки всех сайтов: access-лог и HSTS. # Общие настройки всех сайтов: access-лог и HSTS.
# Mode 644 lets read-only consumers (goaccess and ad-hoc host-side tail) #
# read the file; lumberjack would otherwise default to 0600. # Лог общий для всех сайтов, его разбирает GoAccess. Mode 644 нужен, чтобы
(access_log) { # файл читали потребители на хосте (goaccess и ad-hoc tail): lumberjack иначе
log { # ставит 0600.
(common) {
log {
output file /var/log/caddy/access.log { output file /var/log/caddy/access.log {
mode 644 mode 644
roll_size 100mib roll_size 100mib
@@ -44,6 +46,12 @@ http://:2020 {
format json format json
} }
# HSTS: браузер, однажды увидевший заголовок, целый год ходит на это имя только
# по https, минуя редирект с http, — закрывает downgrade и SSL-strip.
# Без includeSubDomains: политика по каждому имени своя, а под vakhrushev.me
# есть поддомены не с этого сервера (например photo.vakhrushev.me).
header Strict-Transport-Security "max-age=31536000"
}
# ------------------------------------------------------------------- # -------------------------------------------------------------------
# Applications # Applications
@@ -52,7 +60,7 @@ http://:2020 {
vakhrushev.me { vakhrushev.me {
tls anwinged@ya.ru tls anwinged@ya.ru
import common import common
# Matrix federation delegation: tells other servers/clients that the # Matrix federation delegation: tells other servers/clients that the
# homeserver for vakhrushev.me lives at matrix.vakhrushev.me. # homeserver for vakhrushev.me lives at matrix.vakhrushev.me.
# https://spec.matrix.org/latest/server-server-api/#server-discovery # https://spec.matrix.org/latest/server-server-api/#server-discovery
@@ -80,7 +88,7 @@ vakhrushev.me {
start.vakhrushev.me { start.vakhrushev.me {
tls anwinged@ya.ru tls anwinged@ya.ru
import common import common
forward_auth authelia_app:9091 { forward_auth authelia_app:9091 {
uri /api/authz/forward-auth uri /api/authz/forward-auth
copy_headers Remote-User Remote-Groups Remote-Email Remote-Name copy_headers Remote-User Remote-Groups Remote-Email Remote-Name
@@ -94,7 +102,7 @@ start.vakhrushev.me {
matrix.vakhrushev.me { matrix.vakhrushev.me {
tls anwinged@ya.ru tls anwinged@ya.ru
import common import common
reverse_proxy { reverse_proxy {
to tuwunel_app:6167 to tuwunel_app:6167
} }
@@ -103,14 +111,14 @@ matrix.vakhrushev.me {
auth.vakhrushev.me { auth.vakhrushev.me {
tls anwinged@ya.ru tls anwinged@ya.ru
import common import common
reverse_proxy authelia_app:9091 reverse_proxy authelia_app:9091
} }
status.vakhrushev.me { status.vakhrushev.me {
tls anwinged@ya.ru tls anwinged@ya.ru
import common import common
forward_auth authelia_app:9091 { forward_auth authelia_app:9091 {
uri /api/authz/forward-auth uri /api/authz/forward-auth
copy_headers Remote-User Remote-Groups Remote-Email Remote-Name copy_headers Remote-User Remote-Groups Remote-Email Remote-Name
@@ -122,7 +130,7 @@ status.vakhrushev.me, :29999 {
git.vakhrushev.me { git.vakhrushev.me {
tls anwinged@ya.ru tls anwinged@ya.ru
import common import common
reverse_proxy { reverse_proxy {
to gitea_app:3000 to gitea_app:3000
} }
@@ -131,7 +139,7 @@ git.vakhrushev.me {
outline.vakhrushev.me { outline.vakhrushev.me {
tls anwinged@ya.ru tls anwinged@ya.ru
import common import common
reverse_proxy { reverse_proxy {
to outline_app:3000 to outline_app:3000
} }
@@ -140,7 +148,7 @@ outline.vakhrushev.me {
gramps.vakhrushev.me { gramps.vakhrushev.me {
tls anwinged@ya.ru tls anwinged@ya.ru
import common import common
reverse_proxy { reverse_proxy {
to gramps_app:5000 to gramps_app:5000
} }
@@ -149,7 +157,7 @@ gramps.vakhrushev.me {
miniflux.vakhrushev.me { miniflux.vakhrushev.me {
tls anwinged@ya.ru tls anwinged@ya.ru
import common import common
# /metrics наружу не отдаём. METRICS_ALLOWED_NETWORKS тут не помогает: за # /metrics наружу не отдаём. METRICS_ALLOWED_NETWORKS тут не помогает: за
# прокси Miniflux видит приватный IP контейнера Caddy, а не адрес клиента. # прокси Miniflux видит приватный IP контейнера Caddy, а не адрес клиента.
# Netdata скрейпит miniflux_app:8080/metrics напрямую по докер-сети, мимо Caddy. # Netdata скрейпит miniflux_app:8080/metrics напрямую по докер-сети, мимо Caddy.
@@ -167,7 +175,7 @@ miniflux.vakhrushev.me {
wakapi.vakhrushev.me { wakapi.vakhrushev.me {
tls anwinged@ya.ru tls anwinged@ya.ru
import common import common
reverse_proxy { reverse_proxy {
to wakapi_app:3000 to wakapi_app:3000
} }
@@ -176,7 +184,7 @@ wakapi.vakhrushev.me {
wanderer.vakhrushev.me { wanderer.vakhrushev.me {
tls anwinged@ya.ru tls anwinged@ya.ru
import common import common
reverse_proxy { reverse_proxy {
to wanderer_web:3000 to wanderer_web:3000
} }
@@ -185,7 +193,7 @@ wanderer.vakhrushev.me {
memos.vakhrushev.me { memos.vakhrushev.me {
tls anwinged@ya.ru tls anwinged@ya.ru
import common import common
reverse_proxy { reverse_proxy {
to memos_app:5230 to memos_app:5230
} }
@@ -196,7 +204,7 @@ memos.vakhrushev.me {
tududi.vakhrushev.me { tududi.vakhrushev.me {
tls anwinged@ya.ru tls anwinged@ya.ru
import common import common
reverse_proxy { reverse_proxy {
to tududi_app:3002 to tududi_app:3002
} }
@@ -205,7 +213,7 @@ tududi.vakhrushev.me {
remembos.vakhrushev.me { remembos.vakhrushev.me {
tls anwinged@ya.ru tls anwinged@ya.ru
import common import common
forward_auth authelia_app:9091 { forward_auth authelia_app:9091 {
uri /api/authz/forward-auth uri /api/authz/forward-auth
copy_headers Remote-User Remote-Groups Remote-Email Remote-Name copy_headers Remote-User Remote-Groups Remote-Email Remote-Name
@@ -219,7 +227,7 @@ remembos.vakhrushev.me {
calibre.vakhrushev.me { calibre.vakhrushev.me {
tls anwinged@ya.ru tls anwinged@ya.ru
import common import common
reverse_proxy { reverse_proxy {
to calibre_web_app:8083 to calibre_web_app:8083
} }
@@ -228,7 +236,7 @@ calibre.vakhrushev.me {
wanderbase.vakhrushev.me { wanderbase.vakhrushev.me {
tls anwinged@ya.ru tls anwinged@ya.ru
import common import common
forward_auth authelia_app:9091 { forward_auth authelia_app:9091 {
uri /api/authz/forward-auth uri /api/authz/forward-auth
copy_headers Remote-User Remote-Groups Remote-Email Remote-Name copy_headers Remote-User Remote-Groups Remote-Email Remote-Name
@@ -242,7 +250,7 @@ wanderbase.vakhrushev.me {
rssbridge.vakhrushev.me { rssbridge.vakhrushev.me {
tls anwinged@ya.ru tls anwinged@ya.ru
import common import common
forward_auth authelia_app:9091 { forward_auth authelia_app:9091 {
uri /api/authz/forward-auth uri /api/authz/forward-auth
copy_headers Remote-User Remote-Groups Remote-Email Remote-Name copy_headers Remote-User Remote-Groups Remote-Email Remote-Name
@@ -256,7 +264,7 @@ rssbridge.vakhrushev.me {
dozzle.vakhrushev.me { dozzle.vakhrushev.me {
tls anwinged@ya.ru tls anwinged@ya.ru
import common import common
forward_auth authelia_app:9091 { forward_auth authelia_app:9091 {
uri /api/authz/forward-auth uri /api/authz/forward-auth
copy_headers Remote-User Remote-Groups Remote-Email Remote-Name Remote-Filter copy_headers Remote-User Remote-Groups Remote-Email Remote-Name Remote-Filter
@@ -276,7 +284,7 @@ dozzle.vakhrushev.me {
{{ goatcounter_sites | join(', ') }} { {{ goatcounter_sites | join(', ') }} {
tls anwinged@ya.ru tls anwinged@ya.ru
import common import common
reverse_proxy { reverse_proxy {
to goatcounter_app:8080 to goatcounter_app:8080
} }
@@ -285,7 +293,7 @@ dozzle.vakhrushev.me {
goaccess.vakhrushev.me { goaccess.vakhrushev.me {
tls anwinged@ya.ru tls anwinged@ya.ru
import common import common
forward_auth authelia_app:9091 { forward_auth authelia_app:9091 {
uri /api/authz/forward-auth uri /api/authz/forward-auth
copy_headers Remote-User Remote-Groups Remote-Email Remote-Name copy_headers Remote-User Remote-Groups Remote-Email Remote-Name
@@ -305,7 +313,7 @@ goaccess.vakhrushev.me {
bifrost.vakhrushev.me { bifrost.vakhrushev.me {
tls anwinged@ya.ru tls anwinged@ya.ru
import common import common
forward_auth authelia_app:9091 { forward_auth authelia_app:9091 {
uri /api/authz/forward-auth uri /api/authz/forward-auth
copy_headers Remote-User Remote-Groups Remote-Email Remote-Name copy_headers Remote-User Remote-Groups Remote-Email Remote-Name
@@ -7,8 +7,6 @@ services:
- "80:80" - "80:80"
- "443:443" - "443:443"
- "443:443/udp" - "443:443/udp"
cap_add:
- NET_ADMIN
volumes: volumes:
- "{{ caddy_file_dir }}:/etc/caddy" - "{{ caddy_file_dir }}:/etc/caddy"
- "{{ data_dir }}:/data" - "{{ data_dir }}:/data"