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=websecureznamená, ž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 URIsa přidat další URI šablonu+aSave
Nastavení labelu na Http service
Na jakekoliv http service proxované Traefikem stačí nastavit
middlewares=traefik-forward-autha 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ě …