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 domainnaam, 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