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
- Traefik Grundinstallation
- Installation siehe: Traefik Grundinstallation
- Docker Host
- Installation siehe: Docker Grundinstallation
- Azure AD Abonnement
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.
Anlage Azure AD Anwendung
Zunächst ist eine Azure AD Anwendung anzulegen, welche später als Endpunkt zur Authentifizierung genutzt werden wird.
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.
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
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.
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.