Telefon-Support: +49 2238 570070
docker,traefik,concepts

Basic Auth mit Træfik

3. April 2018 Leseszeit ~1 min

Ist traefik erst einmal wie in unserem Blog-Post beschrieben als Reverse Proxy aufgesetzt, dann bieten sich durch die dynamischen Konfigurationsmöglichkeit viele Optionen, so auch die schnelle Umsetzung von BasicAuth.

In unserem Besipiel steuern wir Traefik wieder über docker service-labels:

  labels:
      - "traefik.backend=restapi"
      - "traefik.frontend.rule=Host:api.intertech.de"
      - "traefik.enable=true"
      - "traefik.port=8080"
      - "traefik.docker.network=reverseproxy"
      - "traefik.frontend.auth.basic=testuser:$$apr1$$oQPKJJuG$$GLUGkFH1WkLN.D68SoXJQ."

Die in der Zeile - "traefik.frontend.auth.basic=..." verwendeten Zugangsdaten erzeugen wir am einfachsten auf der Kommandozeile:

[ff@docker01 ~]$ printf "testuser:$(openssl passwd -apr1 pass0815word)\n"
testuser:$apr1$z5asup9D$ZbeDP8zpnIm9ATNJuVGN50

Eine Besonderheit ist bei der Verwendung von docker-compose zu beachten: Das Zeichen $ wird in docker-compose zu Interpolation von Variabeln genutzt und muss deshalb mit einem Vorangestellten $ maskiert werden:

[ff@docker01 ~]$ printf "testuser:$(openssl passwd -apr1 pass0815word)\n" |sed 's/\$/\$\$/g'
testuser:$$apr1$$oQPKJJuG$$GLUGkFH1WkLN.D68SoXJQ.

Nachdem wir die label-Parameter in unserem docker-compose.yml mit dem zu schützenden Webservice entsprechend angepasst haben, können wir prüfen, ob alles wie gewünscht funtioniert:

[user@demo ~]$ curl -i http://docker01.cloud.intertech.de/
HTTP/1.1 401 Unauthorized
Content-Type: text/plain
Www-Authenticate: Basic realm="traefik"
Date: Tue, 03 Apr 2018 08:46:42 GMT
Content-Length: 17

401 Unauthorized
[user@demo ~]$ curl --user testuser:pass0815word -i https://docker01.cloud.intertech.de/
HTTP/1.1 200 OK
Content-Length: 401
Content-Type: text/plain; charset=utf-8
Date: Tue, 03 Apr 2018 09:36:57 GMT

Hostname: 87419ba09e2b
IP: 127.0.0.1
IP: 172.18.0.4
GET / HTTP/1.1
Host: docker01.cloud.intertech.de
User-Agent: curl/7.29.0
Accept: */*
Accept-Encoding: gzip
Authorization: Basic dGVzdHVzZXI6cGFzczA4MTV3b3Jk
X-Forwarded-For: 87.119.200.32
X-Forwarded-Host: docker01.cloud.intertech.de
X-Forwarded-Port: 80
X-Forwarded-Proto: http
X-Forwarded-Server: 38078126ebcc
X-Real-Ip: 87.119.200.32

Beispiel-Konfiguration mit docker-compose

docker-compose.yml:

version: '2'

services:
  proxy:
    image: traefik
    command: --logLevel=DEBUG
    networks:
      - reverseproxy
    ports:
      - "80:80"
      - "443:443"
      - "8080:8080"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - $PWD/conf/traefik.toml:/etc/traefik/traefik.toml
      - TraefikAcme:/etc/traefik/acme
  app:
    image: emilevauge/whoami
    networks:
      - reverseproxy
    labels:
      - "traefik.backend=restapi"
      - "traefik.frontend.rule=Host:docker01.cloud.intertech.de"
      - "traefik.enable=true"
      - "traefik.port=8080"
      - "traefik.docker.network=reverseproxy"
      - "traefik.frontend.auth.basic=testuser:$$apr1$$oQPKJJuG$$GLUGkFH1WkLN.D68SoXJQ."

networks:
  reverseproxy:
    driver: bridge
volumes:
  TraefikAcme: