Eintrag

Traefik ForwardAuth Azure AD (OpenID Connect) mit Keycloak

Traefik ForwardAuth Azure AD (OpenID Connect) mit Keycloak

Vorwort

In diesem Beitrag findest du eine Step-by-Step Anleitung zur Installation von Keycloak und Konfiguration des Traefik ForwardAuth zu Azure AD (OpenID Connect) mittels Keycloak.

Voraussetzungen

Installation Keycloak via Docker-Compose

In den folgenden Schritten wird das Docker Compose Projekt erstellt.

1
2
3
4
5
mkdir keycloak
cd keycloak
mkdir app
mkdir database
touch docker-compose.yml
1
sudo nano docker-compose.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
version: '3'

services:
  postgres:
      image: postgres:13
      volumes:
        - ./database:/var/lib/postgresql/data
      environment:
        POSTGRES_DB: keycloak
        POSTGRES_USER: keycloak
        POSTGRES_PASSWORD: PASSWORD
      ports:
        - 5432:5432
  keycloak:
      image: quay.io/keycloak/keycloak:legacy
      environment:
        DB_VENDOR: POSTGRES
        DB_ADDR: 127.0.0.1:8641
        DB_DATABASE: keycloak
        DB_USER: keycloak
        DB_SCHEMA: public
        DB_PASSWORD: PASSWORD
        KEYCLOAK_USER: admin
        KEYCLOAK_PASSWORD: PASSWORD
        PROXY_ADDRESS_FORWARDING: "true"
        KEYCLOAK_FRONTEND_URL: "https://login.DOMAIN.de/auth"
        # Uncomment the line below if you want to specify JDBC parameters. The parameter below is just an example, and it shouldn't be used in production without knowledge. It is highly recommended that you read the PostgreSQL JDBC driver documentation in order to use it.
        #JDBC_PARAMS: "ssl=true"
      ports:
        - 8080:8080
        - 8443:8443
      depends_on:
        - postgres
1
sudo docker-compose up -d

Auf Keycloak kann nun via https://IP-ADRESSE:8643/auth/admin/master/console zugegriffen werden und sich mit den im Docker-Compose-File festgelegten Admin-Daten angemeldet werden.

Konfiguration Keycloak

In den folgenden Schritten ist Keycloak zur Anbindung des Azure AD vorzubereiten.

Zunächst sollte Keycloak allerdings via der vorhandenen Traefik Installation über HTTPS verfügbar sein. Hierzu muss der Router und Service in der Konfiguration angelegt werden.

1
sudo nano config.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#DOMAIN ist durch die eigene zu ersetzen.
#APP ist durch die gewünschte Subdomain zu ersetzten und im Service abzubilden.
#IP-Adresse ist durch das gewünschte Ziel zu ersetzen.

http:
 #region routers 
  routers:
    login:
      entryPoints:
        - "https"
      rule: "Host(`login.DOMAIN.de`)"
      middlewares:
        - default-headers
        - https-redirect
        - rate-limit
      tls:
        options: tls-options
      service: login 
    login_redirect:
      entryPoints:
        - "https"
      rule: "Host(`login.DOMAIN.de`) && Path(`/`, `/auth`)"
      middlewares:
        - default-headers
        - https-redirect
        - redirect-login
        - rate-limit
      tls:
        options: tls-options
      service: login
    APP:
      entryPoints:
        - "https"
      rule: "Host(`APP.DOMAIN.de`)"
      middlewares:
        - default-headers
        - https-redirect
        - rate-limit
        - keycloak #Aktivierung ForwardAuth
      tls:
        options: tls-options
      service: APP
  services:
    login:
      loadBalancer:
        servers:
          - url: "https://IP-ADRESSE_Keycloak:8643"
        passHostHeader: true
  middlewares:
    redirect-login:
      redirectRegex:
        regex: ".*"
        replacement: "https://login.DOMAIN.de/auth/realms/master/account/#/personal-info"
        permanent: true
    https-redirect:
      redirectScheme:
        scheme: https
        permanent: true    
    keycloak:
      forwardAuth:
        address: "http://IP-ADRESSE_ForwardAUTH:4181"
        trustForwardHeader: true
        authResponseHeaders:
          - "X-Forwarded-User"
          - "X-Forwarded-Proto"
          - "X-Forwarded-Uri"
          - "X-Forwarded-For"
          - "X-Forwarded-Method"
          - "X-Secret"
    rate-limit:
      ratelimit:
        average: 200
        burst: 100
    default-headers:
      headers:
        frameDeny: true
        sslRedirect: true
        browserXssFilter: true
        contentTypeNosniff: true
        forceSTSHeader: true
        stsIncludeSubdomains: true
        stsPreload: true
        stsSeconds: 15552000
        customFrameOptionsValue: SAMEORIGIN
        customRequestHeaders:
          X-Forwarded-Proto: https
tls:
  options:
    tls-options:
      minVersion: VersionTLS12
      sniStrict: true
      cipherSuites:
        - TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
        - TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
        - TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305
        - TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
        - TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305
        - TLS_AES_128_GCM_SHA256
        - TLS_AES_256_GCM_SHA384
        - TLS_CHACHA20_POLY1305_SHA256
      curvePreferences:
        - CurveP521
        - CurveP384
1
sudo docker restart traefik

Nun sollte Keycloak via https://login.DOMAIN.de/auth/admin/master/console erreichbar sein, sodass nun mit den folgenden Schritten ein Realm angelegt werden kann gegen welches später Authentifiziert werden kann.

20220322_000088.png

20220322_000089.png

20220322_000090.png

20220322_000091.png

20220322_000092.png

20220322_000093.png

20220322_000094.png

20220322_000095.png

20220322_000096.png

Anlage Azure AD Anwendung

Zunächst ist eine Azure AD Anwendung anzulegen, welche später als Endpunkt zur Authentifizierung genutzt werden wird.

20220322_000097.png

20220322_000098.png

Umleitungs-URI ist durch die eigene URL zu ersetzen.

Anlage Identity Provider Keycloak

Bevor allerdings nun Azure AD als Identity Provider genutzt werden kann, muss dieser in Keycloak konfiguriert werden.

20220322_000099.png

20220322_000100.png

20220322_000101.png

20220322_000102.png

20220322_000103.png

20220322_000108.png

Import from URL: OpenID Connect-Metadatendokument aus Azure AD Endpunkt der Anwendung

Client-ID: Anwendungs-ID (Client) aus Azure AD Anwendung

Client Secret: Wert aus Azure Zertifikate & Geheimnisse

20220322_000104.png

20220322_000105.png

20220322_000106.png

20220322_000107.png

Installation Traefik ForwardAuth Container via Docker-Compose

Das eine URL via Traefik gegen Keycloak authentifiziert werden kann benötigt es einen ForwardAuth OAUTH Docker Container, welcher wie folgt bereitgestellt werden kann.

1
sudo nano docker-compose.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
version: '3'

  traefik-auth:
    container_name: traefik-auth
    image: mesosphere/traefik-forward-auth
    environment:
      - CLIENT_ID=traefik-auth
      - CLIENT_SECRET=CLIENTSECRET_KEYCLOAK_CLIENT #Mit Clientsecret aus Keycloak zu ersetzen
      - PROVIDER_URI=https://login.DOMAIN.de/auth/realms/master #DOMAIN mit der eigenen zu ersetzen
      - SECRET=GENERATEDSECRET #Ein beliebiges Secret
      - LOG_LEVEL=debug
      - URL_PATH=/_oauth
      - LIFETIME=43200
      - INSECURE_COOKIE=false
      - COOKIE_DOMAIN=DOMAIN.de #DOMAIN mit der eigenen zu ersetzen
      - COOKIE_NAME=_auth_DOMAIN #DOMAIN mit der eigenen zu ersetzen
      - CSRF_COOKIE_NAME=_auth_DOMAIN_csrf #DOMAIN mit der eigenen zu ersetzen
      - CLAIMS_SESSION_NAME=_auth_DOMAIN_claims #DOMAIN mit der eigenen zu ersetzen
      - USER_COOKIE_NAME=_auth_DOMAIN_name #DOMAIN mit der eigenen zu ersetzen
    networks:
      - proxy
    ports:
      - 4181:4181
    labels:
      - "traefik.http.middlewares.traefik-forward-auth.forwardauth.address=http://127.0.0.1:4181"
      - "traefik.http.middlewares.traefik-forward-auth.forwardauth.authResponseHeaders=X-Forwarded-User, X-Forwarded-Proto, X-Forwarded-Uri, X-Forwarded-For, X-Forwarded-Method, X-Secret"
      - "traefik.http.services.traefik-forward-auth.loadbalancer.server.port=4181"
      - "traefik.enable=true"
    restart: always
networks:
  proxy:
    external: true

Das Client-Secret ist in der folgenden Oberfläche unter Keycloak zu finden.

20220322_000109.png

20220322_000110.png

1
sudo docker-compose up -d

Integration ForwardAuth in Traefik

Zuletzt kann nun mittels einer Middleware die Authentifizierung via Keycloak an AzureAD in bestehende Router intigiert werden.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#DOMAIN ist durch die eigene zu ersetzen.
#APP ist durch die gewünschte Subdomain zu ersetzten und im Service abzubilden.
#IP-Adresse ist durch das gewünschte Ziel zu ersetzen.

http:
 #region routers 
  routers:
    login:
      entryPoints:
        - "https"
      rule: "Host(`login.DOMAIN.de`)"
      middlewares:
        - default-headers
        - https-redirect
        - rate-limit
      tls:
        options: tls-options
      service: login 
    login_redirect:
      entryPoints:
        - "https"
      rule: "Host(`login.DOMAIN.de`) && Path(`/`, `/auth`)"
      middlewares:
        - default-headers
        - https-redirect
        - redirect-login
        - rate-limit
      tls:
        options: tls-options
      service: login
    APP:
      entryPoints:
        - "https"
      rule: "Host(`APP.DOMAIN.de`)"
      middlewares:
        - default-headers
        - https-redirect
        - rate-limit
        - keycloak #Aktivierung ForwardAuth
      tls:
        options: tls-options
      service: APP
  services:
    login:
      loadBalancer:
        servers:
          - url: "https://IP-ADRESSE_Keycloak:8643"
        passHostHeader: true
  middlewares:
    redirect-login:
      redirectRegex:
        regex: ".*"
        replacement: "https://login.DOMAIN.de/auth/realms/master/account/#/personal-info"
        permanent: true
    https-redirect:
      redirectScheme:
        scheme: https
        permanent: true    
    keycloak:
      forwardAuth:
        address: "http://IP-ADRESSE_ForwardAUTH:4181"
        trustForwardHeader: true
        authResponseHeaders:
          - "X-Forwarded-User"
          - "X-Forwarded-Proto"
          - "X-Forwarded-Uri"
          - "X-Forwarded-For"
          - "X-Forwarded-Method"
          - "X-Secret"
    rate-limit:
      ratelimit:
        average: 200
        burst: 100
    default-headers:
      headers:
        frameDeny: true
        sslRedirect: true
        browserXssFilter: true
        contentTypeNosniff: true
        forceSTSHeader: true
        stsIncludeSubdomains: true
        stsPreload: true
        stsSeconds: 15552000
        customFrameOptionsValue: SAMEORIGIN
        customRequestHeaders:
          X-Forwarded-Proto: https
tls:
  options:
    tls-options:
      minVersion: VersionTLS12
      sniStrict: true
      cipherSuites:
        - TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
        - TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
        - TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305
        - TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
        - TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305
        - TLS_AES_128_GCM_SHA256
        - TLS_AES_256_GCM_SHA384
        - TLS_CHACHA20_POLY1305_SHA256
      curvePreferences:
        - CurveP521
        - CurveP384
1
sudo docker restart traefik

Es sollten die nun konfigurierten URLs zur Authentifizierung zu Azure AD umgeleitet werden.

Dieser Eintrag ist vom Autor unter CC BY 4.0 lizensiert.