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:
@@ -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 _(ансибл-ревью)_
|
||||
|
||||
@@ -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.
|
||||
@@ -31,10 +31,12 @@ http://:2020 {
|
||||
# -------------------------------------------------------------------
|
||||
|
||||
# Общие настройки всех сайтов: access-лог и HSTS.
|
||||
# Mode 644 lets read-only consumers (goaccess and ad-hoc host-side tail)
|
||||
# read the file; lumberjack would otherwise default to 0600.
|
||||
(access_log) {
|
||||
log {
|
||||
#
|
||||
# Лог общий для всех сайтов, его разбирает GoAccess. Mode 644 нужен, чтобы
|
||||
# файл читали потребители на хосте (goaccess и ad-hoc tail): lumberjack иначе
|
||||
# ставит 0600.
|
||||
(common) {
|
||||
log {
|
||||
output file /var/log/caddy/access.log {
|
||||
mode 644
|
||||
roll_size 100mib
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
# -------------------------------------------------------------------
|
||||
# Applications
|
||||
@@ -52,7 +60,7 @@ http://:2020 {
|
||||
vakhrushev.me {
|
||||
tls anwinged@ya.ru
|
||||
import common
|
||||
|
||||
|
||||
# Matrix federation delegation: tells other servers/clients that the
|
||||
# homeserver for vakhrushev.me lives at matrix.vakhrushev.me.
|
||||
# https://spec.matrix.org/latest/server-server-api/#server-discovery
|
||||
@@ -80,7 +88,7 @@ vakhrushev.me {
|
||||
start.vakhrushev.me {
|
||||
tls anwinged@ya.ru
|
||||
import common
|
||||
|
||||
|
||||
forward_auth authelia_app:9091 {
|
||||
uri /api/authz/forward-auth
|
||||
copy_headers Remote-User Remote-Groups Remote-Email Remote-Name
|
||||
@@ -94,7 +102,7 @@ start.vakhrushev.me {
|
||||
matrix.vakhrushev.me {
|
||||
tls anwinged@ya.ru
|
||||
import common
|
||||
|
||||
|
||||
reverse_proxy {
|
||||
to tuwunel_app:6167
|
||||
}
|
||||
@@ -103,14 +111,14 @@ matrix.vakhrushev.me {
|
||||
auth.vakhrushev.me {
|
||||
tls anwinged@ya.ru
|
||||
import common
|
||||
|
||||
|
||||
reverse_proxy authelia_app:9091
|
||||
}
|
||||
|
||||
status.vakhrushev.me {
|
||||
tls anwinged@ya.ru
|
||||
tls anwinged@ya.ru
|
||||
import common
|
||||
|
||||
|
||||
forward_auth authelia_app:9091 {
|
||||
uri /api/authz/forward-auth
|
||||
copy_headers Remote-User Remote-Groups Remote-Email Remote-Name
|
||||
@@ -122,7 +130,7 @@ status.vakhrushev.me, :29999 {
|
||||
git.vakhrushev.me {
|
||||
tls anwinged@ya.ru
|
||||
import common
|
||||
|
||||
|
||||
reverse_proxy {
|
||||
to gitea_app:3000
|
||||
}
|
||||
@@ -131,7 +139,7 @@ git.vakhrushev.me {
|
||||
outline.vakhrushev.me {
|
||||
tls anwinged@ya.ru
|
||||
import common
|
||||
|
||||
|
||||
reverse_proxy {
|
||||
to outline_app:3000
|
||||
}
|
||||
@@ -140,7 +148,7 @@ outline.vakhrushev.me {
|
||||
gramps.vakhrushev.me {
|
||||
tls anwinged@ya.ru
|
||||
import common
|
||||
|
||||
|
||||
reverse_proxy {
|
||||
to gramps_app:5000
|
||||
}
|
||||
@@ -149,7 +157,7 @@ gramps.vakhrushev.me {
|
||||
miniflux.vakhrushev.me {
|
||||
tls anwinged@ya.ru
|
||||
import common
|
||||
|
||||
|
||||
# /metrics наружу не отдаём. METRICS_ALLOWED_NETWORKS тут не помогает: за
|
||||
# прокси Miniflux видит приватный IP контейнера Caddy, а не адрес клиента.
|
||||
# Netdata скрейпит miniflux_app:8080/metrics напрямую по докер-сети, мимо Caddy.
|
||||
@@ -167,7 +175,7 @@ miniflux.vakhrushev.me {
|
||||
wakapi.vakhrushev.me {
|
||||
tls anwinged@ya.ru
|
||||
import common
|
||||
|
||||
|
||||
reverse_proxy {
|
||||
to wakapi_app:3000
|
||||
}
|
||||
@@ -176,7 +184,7 @@ wakapi.vakhrushev.me {
|
||||
wanderer.vakhrushev.me {
|
||||
tls anwinged@ya.ru
|
||||
import common
|
||||
|
||||
|
||||
reverse_proxy {
|
||||
to wanderer_web:3000
|
||||
}
|
||||
@@ -185,7 +193,7 @@ wanderer.vakhrushev.me {
|
||||
memos.vakhrushev.me {
|
||||
tls anwinged@ya.ru
|
||||
import common
|
||||
|
||||
|
||||
reverse_proxy {
|
||||
to memos_app:5230
|
||||
}
|
||||
@@ -196,7 +204,7 @@ memos.vakhrushev.me {
|
||||
tududi.vakhrushev.me {
|
||||
tls anwinged@ya.ru
|
||||
import common
|
||||
|
||||
|
||||
reverse_proxy {
|
||||
to tududi_app:3002
|
||||
}
|
||||
@@ -205,7 +213,7 @@ tududi.vakhrushev.me {
|
||||
remembos.vakhrushev.me {
|
||||
tls anwinged@ya.ru
|
||||
import common
|
||||
|
||||
|
||||
forward_auth authelia_app:9091 {
|
||||
uri /api/authz/forward-auth
|
||||
copy_headers Remote-User Remote-Groups Remote-Email Remote-Name
|
||||
@@ -219,7 +227,7 @@ remembos.vakhrushev.me {
|
||||
calibre.vakhrushev.me {
|
||||
tls anwinged@ya.ru
|
||||
import common
|
||||
|
||||
|
||||
reverse_proxy {
|
||||
to calibre_web_app:8083
|
||||
}
|
||||
@@ -228,7 +236,7 @@ calibre.vakhrushev.me {
|
||||
wanderbase.vakhrushev.me {
|
||||
tls anwinged@ya.ru
|
||||
import common
|
||||
|
||||
|
||||
forward_auth authelia_app:9091 {
|
||||
uri /api/authz/forward-auth
|
||||
copy_headers Remote-User Remote-Groups Remote-Email Remote-Name
|
||||
@@ -242,7 +250,7 @@ wanderbase.vakhrushev.me {
|
||||
rssbridge.vakhrushev.me {
|
||||
tls anwinged@ya.ru
|
||||
import common
|
||||
|
||||
|
||||
forward_auth authelia_app:9091 {
|
||||
uri /api/authz/forward-auth
|
||||
copy_headers Remote-User Remote-Groups Remote-Email Remote-Name
|
||||
@@ -256,7 +264,7 @@ rssbridge.vakhrushev.me {
|
||||
dozzle.vakhrushev.me {
|
||||
tls anwinged@ya.ru
|
||||
import common
|
||||
|
||||
|
||||
forward_auth authelia_app:9091 {
|
||||
uri /api/authz/forward-auth
|
||||
copy_headers Remote-User Remote-Groups Remote-Email Remote-Name Remote-Filter
|
||||
@@ -276,7 +284,7 @@ dozzle.vakhrushev.me {
|
||||
{{ goatcounter_sites | join(', ') }} {
|
||||
tls anwinged@ya.ru
|
||||
import common
|
||||
|
||||
|
||||
reverse_proxy {
|
||||
to goatcounter_app:8080
|
||||
}
|
||||
@@ -285,7 +293,7 @@ dozzle.vakhrushev.me {
|
||||
goaccess.vakhrushev.me {
|
||||
tls anwinged@ya.ru
|
||||
import common
|
||||
|
||||
|
||||
forward_auth authelia_app:9091 {
|
||||
uri /api/authz/forward-auth
|
||||
copy_headers Remote-User Remote-Groups Remote-Email Remote-Name
|
||||
@@ -305,7 +313,7 @@ goaccess.vakhrushev.me {
|
||||
bifrost.vakhrushev.me {
|
||||
tls anwinged@ya.ru
|
||||
import common
|
||||
|
||||
|
||||
forward_auth authelia_app:9091 {
|
||||
uri /api/authz/forward-auth
|
||||
copy_headers Remote-User Remote-Groups Remote-Email Remote-Name
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user