Доработка безопасности силами кадди,

правка конфигов
This commit is contained in:
2025-08-27 15:33:28 +03:00
parent 043e66c435
commit 68d46fd18b
4 changed files with 112 additions and 24 deletions
+77 -14
View File
@@ -1,34 +1,97 @@
{ {
email dead@cxap.space email dead@cxap.space
dns cloudflare {$CF_API_TOKEN} dns cloudflare {$CF_API_TOKEN}
order authorize before reverse_proxy
order authenticate before respond
order authorize before respond
servers { servers {
trusted_proxies static private_ranges trusted_proxies static private_ranges
} }
certificates {
automate auth.realy.nothing.help
automate *.realy.nothing.help
}
} }
# Портал аутентификации security {
auth.realy.nothing.help { # Локальное хранилище пользователей
route { local identity store localdb {
authp { realm local
backends {
local_backend {
method local
path /data/users.json path /data/users.json
} }
}
# Портал аутентификации (используем в site-блоке ниже)
authentication portal authportal {
# криптополитика и тайминги
crypto default token lifetime {$AUTH_TOKEN_LIFETIME:-12h}
enable identity store localdb
# единый cookie для всех поддоменов realy.nothing.help
cookie domain realy.nothing.help
cookie lifetime {$AUTH_COOKIE_LIFETIME:-12h}
cookie idle_timeout {$AUTH_IDLE_TIMEOUT:-30m}
cookie samesite lax
ui { ui {
title "Account"
# можно добавить ярлыки на часто используемые сервисы
links { links {
"Portainer" "https://port.realy.nothing.help" "Portainer" "https://port.realy.nothing.help"
} "WhoAmI" "/whoami"
}
}
} }
} }
# Сниппет для защиты сервисов # Всем локальным пользователям — роль admin + требование MFA
(auth_portal_forwarder) { transform user {
match origin local
action add role admin
# require mfa
}
# И базовая роль "user" всем аутентифицированным
transform user {
action add role user
}
}
# Политика для API: либо admin-роль, либо API-ключи портала
authorization policy apikey_or_admin {
set auth url https://auth.realy.nothing.help
allow roles admin
with api key auth portal authportal realm local
# Явные ACL с логами
acl rule { comment "Accept" match role admin allow stop log info }
acl rule { comment "Deny" match any deny log warn }
}
}
auth.realy.nothing.help {
# сам портал на отдельном хосте
route {
authenticate with authportal
}
# Базовые security-заголовки
header {
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
X-Content-Type-Options "nosniff"
X-Frame-Options "DENY"
Referrer-Policy "no-referrer"
}
}
# Обычная «пользовательская» защита: просто требует валидную сессию,
# редиректит на портал, прокидывает клеймы в заголовки.
(auth_forward) {
authorize { authorize {
set auth url https://auth.realy.nothing.help set auth url https://auth.realy.nothing.help
inject headers with claims
} }
} }
# Защита API: только admin или по API-ключу (policy объявлена выше)
(authorize_apikey_or_admin) {
authorize with apikey_or_admin
}
+22 -1
View File
@@ -26,6 +26,15 @@
caddy hash-password --plaintext 'секрет' caddy hash-password --plaintext 'секрет'
``` ```
Или на python:
```bash
pip install bcrypt
```
```bash
python -c "import bcrypt,sys; print(bcrypt.hashpw(sys.argv[1].encode(), bcrypt.gensalt(rounds=12)).decode())" 'секрет'
```
После изменения файла нужно перезапустить контейнер `caddy`. После изменения файла нужно перезапустить контейнер `caddy`.
## Защита контейнеров ## Защита контейнеров
@@ -33,8 +42,20 @@ caddy hash-password --plaintext 'секрет'
Чтобы ограничить доступ к какому-либо сервису, добавьте к контейнеру метку: Чтобы ограничить доступ к какому-либо сервису, добавьте к контейнеру метку:
``` ```
caddy.import: auth_portal_forwarder caddy.import: auth_forward
``` ```
и обычные метки для виртуального хоста и `reverse_proxy`. Пример для Portainer уже есть в `docker-compose.yml`. и обычные метки для виртуального хоста и `reverse_proxy`. Пример для Portainer уже есть в `docker-compose.yml`.
После авторизации пользователь возвращается к запрошенному сервису. После авторизации пользователь возвращается к запрошенному сервису.
### Открытие пути для API
Чтобы открыть некий путь без авторизации, добавить лейблы:
```
caddy.handle_path: /api/*
caddy.handle_path.0_reverse_proxy: "{{upstreams 9000}}"
```
и не прописывать им `caddy.import: auth_forward`.
И наоборот, аналогично можно закрыть авторизацией только нужный путь.
+3 -1
View File
@@ -33,8 +33,10 @@ services:
networks: [proxy] networks: [proxy]
labels: labels:
caddy: port.realy.nothing.help caddy: port.realy.nothing.help
caddy.handle_path: /api/*
caddy.handle_path.0_reverse_proxy: "{{upstreams 9000}}"
caddy.encode: zstd gzip caddy.encode: zstd gzip
caddy.import: auth_portal_forwarder caddy.import: auth_forward
caddy.reverse_proxy: "{{upstreams 9000}}" caddy.reverse_proxy: "{{upstreams 9000}}"
volumes: volumes:
+4 -2
View File
@@ -3,8 +3,10 @@
{ {
"username": "deadcxap", "username": "deadcxap",
"email": "dead@cxap.space", "email": "dead@cxap.space",
"password": "$2a$10$5x5iG8uDD/A.zxTCr14iUuLS1d8FgEiH8oi1de6pF2Nl/iZNDBEvG", "password": "$2b$12$s5SZcTu0THrdIHmdqTIuS.Hb89nokYfwF5xSDPSJPZsKoYnFkv61i",
"roles": ["admin"] "roles": [
"admin"
]
} }
] ]
} }