Deze pagina beschrijft een wijze waarop een Applicatie kan worden afgeschermd met OIDC authenticatie. In deze beschrijving worden alle services uitgevoerd als docker containers.
We maken gebruik van de volgende services:
- Traefik
- whoami
- forward-oidc
Je kan deze serices eenvoudig als 'stacks' opzetten via 'Portainer'. Alternatief is 1 docker-compose.yml file waarin je alle services gezamenlijk opneemt.
In deze beschrijving worden ze afzonderlijk toegelicht.
Maak een **.env** met daarin de volgende inhoud:
DOMAIN=<je domain naam, bijvoorbeeld example.org>
OIDC_ISSUER=<je OIDC Issuer URL, bij SRAM is dat https://proxy.sram.surf.nl>
OIDC_CLIENT_ID=<de OIDC Client ID>
OIDC_CLIENT_SECRET=<je OIDC Client Secret>
SECRET=<maak-een-mooie-lange-secret>
Traefik
Traefik verzorgt de frontend proxy. De service wordt als volgt gedefinieerd;
services:
traefik:
image: traefik:latest
restart: unless-stopped
ports:
- 80:80
- 443:443
networks:
- external
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
networks:
external:
external: true
Whoami
Deze service is de voorbeeld applicatie die is afgeschermd met OIDC authenticatie. Traefik zorgt er voor dat de 'forward-oidc' middleware eerst succesvol moet worden uitgevoerd voordat de appliatie wordt gepresenteerd aan de gebruiker
services:
whoami:
image: traefik/whoami:latest
restart: unless-stopped
labels:
- "traefik.enable=true"
- "traefik.http.routers.whoami.rule=Host(`whoami.${DOMAIN}`)"
- "traefik.http.routers.whoami.tls=true"
- "traefik.http.routers.whoami.tls.certresolver=le"
- "traefik.http.routers.whoami.entrypoints=https"
- "traefik.http.routers.whoami.middlewares=forward-oidc"
networks:
- external
networks:
external:
external: true
Forward-Auth
Hier vindt de authenticatie plaats. Er zijn hier veel alternatieven voor beschikbaar. In deze beschrijving heb ik gekozen voor een GO implementatie van Thom Seddon
services:
forward_oidc:
image: thomseddon/traefik-forward-auth:2
build: build
networks:
- external
environment:
DEFAULT_PROVIDER: oidc
PROVIDERS_OIDC_ISSUER_URL: ${OIDC_ISSUER}
PROVIDERS_OIDC_CLIENT_ID: ${CLIENT_ID}
PROVIDERS_OIDC_CLIENT_SECRET: ${CLIENT_SECRET}
SECRET: ${SECRET}
AUTH_HOST: oidc.${DOMAIN}
COOKIE_DOMAIN: ${DOMAIN}
labels:
- "traefik.enable=true"
- "traefik.http.routers.oidc.rule=Host(`oidc.${DOMAIN}`)"
- "traefik.http.routers.oidc.entrypoints=https"
- "traefik.http.routers.oidc.tls=true"
- "traefik.http.routers.oidc.tls.certresolver=le"
- "traefik.http.services.oidc.loadbalancer.server.port=4181"
- "traefik.http.routers.oidc.middlewares=forward-oidc"
- "traefik.http.middlewares.forward-oidc.forwardauth.address=http://forward_oidc:4181"
- "traefik.http.middlewares.forward-oidc.forwardauth.trustForwardHeader=true"
- "traefik.http.middlewares.forward-oidc.forwardauth.authResponseHeaders=X-Forwarded-User"
restart: unless-stopped
networks:
external:
external: true