
Proč vyhrál Traefik nad Nginx? Do teď jsem pouzival Nginx, ale na dockeru jako proxy-server se mi líbí víc Traefik, asi proto že má automatický provisioning nových service. Stačí přidat pár magických labelu a hotovo.
Nastaveni
- traefik admin konzole by měla být chráněna heslem :-)
- všechny služby by měly podporovat HTTPS (let’s encrypt) a automaticky přesměrovávat z HTTP
SSO pomocí Keycloak
Cíl cvičení: nastavit Traefik tak, aby byl schopný autentizace proti keycloak (KC). Keycloak i Traefik běží na stejném docker-host a dokonce Keycloak je schovaný za Traefikem, stejně jako ostatní služby.
K tomu jsem našel modul traefik-forward-auth
(TFA) na githubu existuje několik klonů, po několika pokusech jsem vybral ten od mesosphere
neb by měl podporovat .well-known/openid-configuration
Po několika pokusech jsem se dostal k cíli:
traefik-forward-auth:
image: mesosphere/traefik-forward-auth
environment:
- SECRET=*****
- PROVIDER_URI=https://keycloak.chmelej-dev-docker.czela.net/auth/realms/cleni.czela.net
- CLIENT_ID=netadmin
- CLIENT_SECRET=*****
- SCOPE=openid profile email
- LOG_LEVEL=debug
labels:
- traefik.enable=true
- traefik.docker.network=traefik_webgateway
- traefik.http.services.forwardauth.loadbalancer.server.port=4181
- traefik.http.routers.forwardauth.entrypoints=websecure
- traefik.http.routers.forwardauth.rule=Path(`/_oauth`)
- traefik.http.routers.forwardauth.middlewares=traefik-forward-auth
- traefik.http.middlewares.traefik-forward-auth.forwardauth.address=http://traefik-forward-auth:4181
- traefik.http.middlewares.traefik-forward-auth.forwardauth.authResponseHeaders=X-Forwarded-User
- traefik.http.middlewares.traefik-forward-auth.forwardauth.trustForwardHeader=true
links:
- traefik
networks:
- web
depends_on:
- traefik
deploy:
restart_policy:
condition: on-failure
delay: 30s
max_attempts: 3
window: 30s
Poznámky k proměnným a labelům
- SECRET naprosto netuším k čemu to slouží, ale chtějí nějakou náhodnou hodnotu
- SCOPE dokud jsem to nenastavil, tak keycloak odmítal autorizovat. jako defaultní hodnota se posílalo
openid profile email groups
.entrypoints=websecure
znamená, že se přilepí na všechny https dotazy.rule=Path('/_oauth')
jakýkoliv požadavek na /_oauth je přesměrován na vnitřní službu TFA a ta by měla zajistit správnou komunikaci s Keycloak- trochu to zlobilo při startu, protože KC je bez Traefiku nedostupný a Traefiku na začátku chvíli trvá než se zinicializuje. To způsobí, že někdy TFA ihned po startu spadne … proto je tam nastaven restart. Na druhý pokus už naběhne.
Nastavení Keycloak
Na KC jsem žádné dramatické změny nemusel dělat, použil jsem jiz existující client
. Jen je potřeba, aby KC akceptoval URI, ze kterého přichází požadavek k autorizaci, jinak to hlásí chybu invalid redirect_uri
Clients / Settings / Valid Redirect URIs
a přidat další URI šablonu+
aSave
Nastavení labelu na Http service
Na jakekoliv http service proxované Traefikem stačí nastavit
middlewares=traefik-forward-auth
a Traefik začne autorizovat. Aplikace si může ověřeného usera vytáhnout z HTTP hlavičky -X-Forwarded-User: [email protected]
příklad:
whoami:
image: containous/whoami
labels:
- traefik.enable=true
- traefik.http.routers.whoami.rule=Host(`whoami.chmelej-dev-docker.czela.net`)
- traefik.http.routers.whoami.tls=true
- traefik.http.routers.whoami.tls.certresolver=lets-encrypt
- traefik.port=80
- traefik.http.routers.whoami.middlewares=traefik-forward-auth
- traefik.http.whoami.https-redirect.headers.sslproxyheaders.X-Forwarded-Proto=https
networks:
- web
Race Condition při startu služeb
Jelikož mám jeden docker server, kde beží Traefik i Keycloak, tak při 1. startu vznikne stav, kdy Traefik nechce kompletně naběhnout, protože k tomu potřebuje Keycloak, který je ovšem schovaný za nenaběhnutým Traefikem. Naštěstí spadne pouze modul traefik-forward-auth, takže pak stačí chvíli počkat až si to sedne a Traefik restartovat a pak už se to chytne. Tato situace nastává nepravidelně …