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
  • No labels