mirror of
https://github.com/deadcxap/init_scripts.git
synced 2026-07-02 05:43:40 +03:00
Merge pull request #20 from deadcxap/codex/update-docker-compose-for-caddy-security-module
use caddy-security for admin bootstrap auth
This commit is contained in:
+21
-11
@@ -1,24 +1,34 @@
|
|||||||
{
|
{
|
||||||
email dead@cxap.space
|
email dead@cxap.space
|
||||||
dns cloudflare {$CF_API_TOKEN}
|
dns cloudflare {$CF_API_TOKEN}
|
||||||
|
order authorize before reverse_proxy
|
||||||
servers {
|
servers {
|
||||||
trusted_proxies static private_ranges
|
trusted_proxies static private_ranges
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# общий сниппет авторизации
|
# Портал аутентификации
|
||||||
(tinyauth_forwarder) {
|
auth.realy.nothing.help {
|
||||||
forward_auth tinyauth:3000 {
|
route {
|
||||||
uri /api/auth/caddy
|
authp {
|
||||||
copy_headers Remote-User Remote-Name Remote-Email Remote-Groups
|
backends {
|
||||||
|
local_backend {
|
||||||
|
method local
|
||||||
|
path /data/users.json
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ui {
|
||||||
|
links {
|
||||||
|
"Portainer" "https://port.realy.nothing.help"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# при желании — отдельный сниппет для API
|
# Сниппет для защиты сервисов
|
||||||
(tinyauth_api_forwarder) {
|
(auth_portal_forwarder) {
|
||||||
forward_auth tinyauth:3000 {
|
authorize {
|
||||||
uri /api/auth/caddy
|
set auth url https://auth.realy.nothing.help
|
||||||
header_up Authorization {http.request.header.X-Api-Key}
|
|
||||||
header_up Accept application/json
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,12 +2,6 @@
|
|||||||
# для зоны nothing.help — не используйте глобальный API‑ключ!)
|
# для зоны nothing.help — не используйте глобальный API‑ключ!)
|
||||||
CF_API_TOKEN=jRq98TKXi2rYYtG42x9w1M8EOElt5V5BOkA4TBoY
|
CF_API_TOKEN=jRq98TKXi2rYYtG42x9w1M8EOElt5V5BOkA4TBoY
|
||||||
|
|
||||||
# Секрет для cookie (ровно 32 латинских буквы/цифры)
|
# Пользователи для авторизации описываются в файле users.json
|
||||||
# openssl rand -base64 32 | tr -dc 'a-zA-Z0-9' | head -c 32
|
# рядом с docker-compose.yml. Хэши паролей можно получить
|
||||||
TINYAUTH_SECRET=TtbYjkb1ZfzyXG7D6Q3FR6Ri8Pw2K98i
|
# командой `caddy hash-password --plaintext "пароль"`.
|
||||||
|
|
||||||
# Пользователи Tinyauth (формат для docker/compose!)
|
|
||||||
# Пример с одним юзером admin:
|
|
||||||
# admin:$2a$10$yVb0... (bcrypt)
|
|
||||||
# Если несколько — через запятую.
|
|
||||||
TINYAUTH_USERS='deadcxap:$$2a$$10$$5x5iG8uDD/A.zxTCr14iUuLS1d8FgEiH8oi1de6pF2Nl/iZNDBEvG'
|
|
||||||
|
|||||||
@@ -0,0 +1,40 @@
|
|||||||
|
# Bootstrap
|
||||||
|
|
||||||
|
Роль поднимает Portainer и настраивает аутентификацию через модуль [caddy-security](https://github.com/greenpau/caddy-security).
|
||||||
|
Портал авторизации доступен на `auth.realy.nothing.help`, а настройки пользователей находятся в файле `users.json`.
|
||||||
|
|
||||||
|
## Пользователи
|
||||||
|
|
||||||
|
Файл `users.json` содержит массив пользователей. Пример:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"users": [
|
||||||
|
{
|
||||||
|
"username": "deadcxap",
|
||||||
|
"email": "dead@cxap.space",
|
||||||
|
"password": "$2a$10$5x5iG8uDD/A.zxTCr14iUuLS1d8FgEiH8oi1de6pF2Nl/iZNDBEvG",
|
||||||
|
"roles": ["admin"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Хэш пароля можно получить командой:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
caddy hash-password --plaintext 'секрет'
|
||||||
|
```
|
||||||
|
|
||||||
|
После изменения файла нужно перезапустить контейнер `caddy`.
|
||||||
|
|
||||||
|
## Защита контейнеров
|
||||||
|
|
||||||
|
Чтобы ограничить доступ к какому-либо сервису, добавьте к контейнеру метку:
|
||||||
|
|
||||||
|
```
|
||||||
|
caddy.import: auth_portal_forwarder
|
||||||
|
```
|
||||||
|
|
||||||
|
и обычные метки для виртуального хоста и `reverse_proxy`. Пример для Portainer уже есть в `docker-compose.yml`.
|
||||||
|
После авторизации пользователь возвращается к запрошенному сервису.
|
||||||
@@ -16,29 +16,10 @@ services:
|
|||||||
- /var/run/docker.sock:/var/run/docker.sock:ro
|
- /var/run/docker.sock:/var/run/docker.sock:ro
|
||||||
- caddy_data:/data
|
- caddy_data:/data
|
||||||
- ./Caddyfile:/etc/caddy/Caddyfile:ro
|
- ./Caddyfile:/etc/caddy/Caddyfile:ro
|
||||||
|
- ./users.json:/data/users.json:ro
|
||||||
networks: [proxy]
|
networks: [proxy]
|
||||||
command: ["caddy","docker-proxy","--caddyfile-path=/etc/caddy/Caddyfile","--docker-sockets","unix:///var/run/docker.sock"]
|
command: ["caddy","docker-proxy","--caddyfile-path=/etc/caddy/Caddyfile","--docker-sockets","unix:///var/run/docker.sock"]
|
||||||
|
|
||||||
tinyauth:
|
|
||||||
image: ghcr.io/steveiliop56/tinyauth:v3
|
|
||||||
container_name: tinyauth
|
|
||||||
restart: unless-stopped
|
|
||||||
environment:
|
|
||||||
- LOG_LEVEL=2
|
|
||||||
- APP_URL=https://auth.realy.nothing.help
|
|
||||||
- SECRET=${TINYAUTH_SECRET}
|
|
||||||
- USERS=${TINYAUTH_USERS}
|
|
||||||
- COOKIE_SECURE=true
|
|
||||||
- DISABLE_CONTINUE=true
|
|
||||||
- APP_TITLE="Оставь надежду, всяк сюда входящий..."
|
|
||||||
- FORGOT_PASSWORD_MESSAGE="Штош, сочувствую, но нчием помочь не могу."
|
|
||||||
expose: ["3000"]
|
|
||||||
networks: [proxy]
|
|
||||||
labels:
|
|
||||||
caddy: auth.realy.nothing.help
|
|
||||||
caddy.encode: zstd gzip
|
|
||||||
caddy.reverse_proxy: "{{upstreams 3000}}"
|
|
||||||
|
|
||||||
portainer:
|
portainer:
|
||||||
image: portainer/portainer-ce:latest
|
image: portainer/portainer-ce:latest
|
||||||
container_name: portainer
|
container_name: portainer
|
||||||
@@ -53,7 +34,7 @@ services:
|
|||||||
labels:
|
labels:
|
||||||
caddy: port.realy.nothing.help
|
caddy: port.realy.nothing.help
|
||||||
caddy.encode: zstd gzip
|
caddy.encode: zstd gzip
|
||||||
caddy.import: tinyauth_forwarder
|
caddy.import: auth_portal_forwarder
|
||||||
caddy.reverse_proxy: "{{upstreams 9000}}"
|
caddy.reverse_proxy: "{{upstreams 9000}}"
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
|
|||||||
@@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"users": [
|
||||||
|
{
|
||||||
|
"username": "deadcxap",
|
||||||
|
"email": "dead@cxap.space",
|
||||||
|
"password": "$2a$10$5x5iG8uDD/A.zxTCr14iUuLS1d8FgEiH8oi1de6pF2Nl/iZNDBEvG",
|
||||||
|
"roles": ["admin"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user