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-ревью)_
|
- [Мелкий хардненинг контейнеров](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 _(ансибл-ревью)_
|
||||||
|
|||||||
@@ -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.
|
# Общие настройки всех сайтов: 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"
|
||||||
|
|||||||
Reference in New Issue
Block a user