моя проблема в том, что я не могу установить базовую аутентификацию для моего внешнего приложения через traefik
Вот как я настроил свой траефик
traefik.yml
global:
checkNewVersion: true
sendAnonymousUsage: false
entryPoints:
https:
address: :443
http:
address: :80
traefik:
address: :8080
tls:
options:
foo:
minVersion: VersionTLS12
cipherSuites:
- "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"
- "TLS_RSA_WITH_AES_256_GCM_SHA384"
providers:
providersThrottleDuration: 2s
docker:
watch: true
endpoint: unix:///var/run/docker.sock
exposedByDefault: false
network: web
api:
insecure: true
dashboard: true
log:
level: INFO
certificatesResolvers:
default:
acme:
storage: /acme.json
httpChallenge:
entryPoint: http
докер-compose.yml
version: '3'
services:
traefik:
image: traefik:v2.0
restart: always
ports:
- "80:80"
- "443:443"
- "8080:8080"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
- "/srv/traefik/traefik.yml:/etc/traefik/traefik.yml"
- "/srv/traefik/acme.json:/acme.json"
networks:
- web
networks:
web:
external: true
И вот где у меня есть приложение для внешнего интерфейса, работающее как провайдер traefik, и где у меня есть моя основная метка аутентификации.
version: '3.7'
services:
frontend:
image: git.xxxx.com:7000/dockerregistry/registry/xxxx
restart: "always"
networks:
- web
volumes:
- "/srv/config/api.js:/var/www/htdocs/api.js"
- "/srv/efs/workspace:/var/www/htdocs/stock"
labels:
- traefik.enable=true
- traefik.http.routers.frontend-http.rule=Host(`test.xxxx.com`)
- traefik.http.routers.frontend-http.service=frontend
- traefik.http.routers.frontend-http.entrypoints=http
- traefik.http.routers.frontend.tls=true
- traefik.http.routers.frontend.tls.certresolver=default
- traefik.http.routers.frontend.entrypoints=http
- traefik.http.routers.frontend.rule=Host(`test.xxxx.com`)
- traefik.http.routers.frontend.service=frontend
- traefik.http.middlewares.frontend.basicAuth.users=test:$$2y$$05$$c45HvbP0Sq9EzcfaXiGNsuuWMfPhyoFZVYgiTylpMMLtJY2nP1P6m
- traefik.http.services.frontend.loadbalancer.server.port=8080
networks:
web:
external: true
Я не могу получить приглашение для входа в систему, поэтому мне интересно, не пропустил ли я для этого какую-то метку контейнера.
Заранее спасибо! Хоакин
проверьте это stackoverflow.com/questions/47455229/…
Я настраиваю это так:
htpasswd -nb admin secure_password
[entryPoints]
[entryPoints.web]
address = ":80"
[entryPoints.web.http.redirections.entryPoint]
to = "websecure"
scheme = "https"
[entryPoints.websecure]
address = ":443"
[api]
dashboard = true
[certificatesResolvers.lets-encrypt.acme]
email = "your_email@your_domain"
storage = "acme.json"
[certificatesResolvers.lets-encrypt.acme.tlsChallenge]
[providers.docker]
watch = true
network = "web"
[providers.file]
filename = "traefik_dynamic.toml"
[http.middlewares.simpleAuth.basicAuth]
users = [
"admin:$apr1$ruca84Hq$mbjdMZBAG.KWn7vfN/SNK/"
]
[http.routers.api]
rule = "Host(`monitor.your_domain`)"
entrypoints = ["websecure"]
middlewares = ["simpleAuth"]
service = "api@internal"
[http.routers.api.tls]
certResolver = "lets-encrypt"
services:
reverse-proxy:
image: traefik:v2.3
restart: always
command:
- --api.insecure=true
- --providers.docker
ports:
- "80:80"
- "443:443"
networks:
- web
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./traefik.toml:/traefik.toml
- ./traefik_dynamic.toml:/traefik_dynamic.toml
- ./acme.json:/acme.json
ни один из них не работал с динамической конфигурацией, такой как вы. Я сохранил формат yml для traefik. может быть это баг?
Мое внимание привлекает то, что в моей конфигурации simpleAuth установлен в разделе http.routers.api, чего я не вижу в вашей конфигурации yaml. Так может это промежуточное ПО не было подключено?
Предлагаю вам также обновить traefik до версии 2.3 или выше и попробовать использовать пример из документации
мм кадры без работы. Я реализовал динамический файл, как вы, но он не работает, промежуточное программное обеспечение установлено. Интересно, что ни один из них не работал с использованием метки в службе докеров. gist.github.com/joaquindiazs/2689ae69ebd284062aee175e9dfdd139
во-первых, метки должны быть в кавычках, например ""
во-вторых, я думаю, что вам не хватает ярлыка во внешнем приложении. при использовании базовой аутентификации это занимает два шага и должно выглядеть так:
- "traefik.http.routers.frontend.middlewares=frontend-auth"
- "traefik.http.middlewares.frontend-auth.basicauth.users=test:$$2y$$05$$c45HvbP0Sq9EzcfaXiGNsuuWMfPhyoFZVYgiTylpMMLtJY2nP1P6m"
В вашем файле Docker Compose не добавляйте метку «промежуточное ПО» для traefik
, вместо этого сделайте это, используя файл traefik.yml
, передав параметр providers.file
, где вы должны определить маршрутизаторы, службы, промежуточное ПО и т. д. В этом «файле поставщиков» вы должны установите middlewares
под http.routes.traefik
— это может показаться очень запутанным в начале, но это не так сложно, поверьте мне.
Давайте сделаем кейс YAML (вы можете преобразовать его в «TOML» здесь).
В этом примере предполагается, что у вас есть файл Docker Compose специально для Traefik — я не пытался использовать тот же файл Docker Compose с какими-либо другими службами (например, Wordpress, базами данных или чем-то еще), поскольку у меня уже есть другой путь для этих файлов.
docker-compose.yml
version: '3.1'
services:
reverse-proxy:
image: traefik:v2.4
[ ... ]
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
# Map the dynamic conf into the container
- ./traefik/config.yml:/etc/traefik/config.yml:ro
# Map the static conf into the container
- ./traefik/traefik.yml:/etc/traefik/traefik.yml:ro
# Note you don't use "traefik.http.routers.<service>.middlewares etc." here
[ ... ]
В этом случае я устанавливаю/получаю файлы конфигурации для Traefik в ./traefik
(относительно файла docker-compose.yml
).
./traefik/config.yml
http:
routers:
traefik:
middlewares: "basicauth"
[ ... ]
middlewares:
basicauth:
basicAuth:
removeHeader: true
users:
- <user>:<password>
# password should be generated using `htpasswd` (md5, sha1 or bcrypt)
[ ... ]
Здесь вы можете установить имя basicauth
по своему желанию (поскольку это имя промежуточного программного обеспечения, которое вы увидите на панели инструментов), поэтому вы можете сделать:
http:
routers:
traefik:
middlewares: "super-dashboard-auth"
[ ... ]
middlewares:
super-dashboard-auth:
basicAuth:
removeHeader: true
users:
- <user>:<password>
# password should be generated using `htpasswd` (md5, sha1 or bcrypt)
[ ... ]
Обратите внимание, что basicAuth
должен оставаться как есть. Кроме того, здесь вам не нужно использовать «метод двойного доллара» для его экранирования (как в подходе с меткой ), поэтому после создания пароля пользователя вы должны ввести его точно так же, как htpasswd
создал его.
# BAD
user:$$2y$$10$$nRLqyZT.64JI/CD/ym65UGDn8HaY0D6CBTxhe6JXf9u4wi5bEMdh.
# GOOD
user:$2y$10$nRLqyZT.64JI/CD/ym65UGDn8HaY0D6CBTxhe6JXf9u4wi5bEMdh.
Конечно, вы можете получить эти данные из файла .env
, а не жестко кодировать эти строки, в этом случае вам нужно передать переменную окружения из docker-compose.yml
с помощью environment
следующим образом:
services:
reverse-proxy:
image: traefik:v2.4
container_name: traefik
[ ... ]
environment:
TRAEFIK_DASHBOARD_USER: "${TRAEFIK_DASHBOARD_USER}"
TRAEFIK_DASHBOARD_PWD: "${TRAEFIK_DASHBOARD_PWD}"
# And any other env. var. you may need
[ ... ]
и используйте его вот так в вашем traefik/config.yml
файле:
[ ... ]
middlewares:
super-dashboard-auth:
basicAuth:
removeHeader: true
users:
- "{{env "TRAEFIK_DASHBOARD_USER"}}:{{env "TRAEFIK_DASHBOARD_PWD"}}"
[ ... ]
После этого включите предыдущий файл в providers.file.filename
./traefik/traefik.yml
[ ... ]
api:
dashboard: true
insecure: false
providers:
docker:
endpoint: "unix:///var/run/docker.sock"
[ ... ]
file:
filename: /etc/traefik/config.yml
watch: true
[ ... ]
А дальше просто docker-compose up -d
+1 за примеры #BAD и #GOOD basicAuth. Я потратил дни, пытаясь выяснить базовую аутентификацию. Оказывается, я избегал $ в своем .htpasswd, как если бы он был в метке докера. Для тех, кто придет сюда в будущем, не скрывайте пароль во внешних файлах! Спасибо!
Это происходило со мной так же, как @HannonQueiroz, я читал пароль из файла env, и я также избегал его. Кажется, что любой способ предоставления пароля лучше, чем встраивание его в этикетки!
Относительно этой части документации.
Если вы используете сценарии Docker для настроек. Настройте следующим образом. Например:
labels:
- "traefik.http.middlewares.foo-add-prefix.addprefix.prefix=/foo"
- "traefik.http.routers.router1.middlewares=foo-add-prefix@docker"
У меня была такая же проблема, и мне не хватало имени пространства имен @docker
в имени промежуточного программного обеспечения.
Не могли бы вы найти решение, потому что я столкнулся с той же проблемой