Базовая аутентификация не работает для Traefik v2.1

моя проблема в том, что я не могу установить базовую аутентификацию для моего внешнего приложения через 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

Я не могу получить приглашение для входа в систему, поэтому мне интересно, не пропустил ли я для этого какую-то метку контейнера.

Заранее спасибо! Хоакин

Не могли бы вы найти решение, потому что я столкнулся с той же проблемой

Arnold Kyeza 23.12.2020 21:50

проверьте это stackoverflow.com/questions/47455229/…

A Paul 02.01.2021 09:53
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
2
10 678
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Я настраиваю это так:

  1. сгенерировать пароль с помощью apache2-utils, например.
htpasswd -nb admin secure_password
  1. настройка traefik.toml
[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"
  1. настройка 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"
  1. настройка сервиса traefik
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. может быть это баг?

Joaquin Diaz 04.01.2021 10:25

Мое внимание привлекает то, что в моей конфигурации simpleAuth установлен в разделе http.routers.api, чего я не вижу в вашей конфигурации yaml. Так может это промежуточное ПО не было подключено?

JanuszO 04.01.2021 13:13

Предлагаю вам также обновить traefik до версии 2.3 или выше и попробовать использовать пример из документации

JanuszO 04.01.2021 13:25

мм кадры без работы. Я реализовал динамический файл, как вы, но он не работает, промежуточное программное обеспечение установлено. Интересно, что ни один из них не работал с использованием метки в службе докеров. gist.github.com/joaquindiazs/2689ae69ebd284062aee175e9dfdd13‌​9

Joaquin Diaz 04.01.2021 13:52

во-первых, метки должны быть в кавычках, например ""

во-вторых, я думаю, что вам не хватает ярлыка во внешнем приложении. при использовании базовой аутентификации это занимает два шага и должно выглядеть так:

  - "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, как если бы он был в метке докера. Для тех, кто придет сюда в будущем, не скрывайте пароль во внешних файлах! Спасибо!

Hannon Queiroz 07.06.2021 11:53

Это происходило со мной так же, как @HannonQueiroz, я читал пароль из файла env, и я также избегал его. Кажется, что любой способ предоставления пароля лучше, чем встраивание его в этикетки!

Danielo515 06.03.2022 19:10

Относительно этой части документации.

Если вы используете сценарии Docker для настроек. Настройте следующим образом. Например:

    labels:
      - "traefik.http.middlewares.foo-add-prefix.addprefix.prefix=/foo"
      - "traefik.http.routers.router1.middlewares=foo-add-prefix@docker"

У меня была такая же проблема, и мне не хватало имени пространства имен @docker в имени промежуточного программного обеспечения.

Другие вопросы по теме