Chmelej's Blog

Traefik

Published 16 Oct 20213 min read0 comments
header-image

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 + a Save

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ě …