Keycloak : Installation avec Docker et reverse-proxy SSL Nginx

Keycloak : Installation avec Docker et reverse-proxy SSL Nginx

Table of Contents

Introduction

Keycloak est une solution opensource permettant d'implémenter du SSO (Single-Sign-On) au sein d'une infrastructure. Il est compatible avec les principaux protocoles d'authentification (OAuth2.0, OpenID-Connect). Il peut être couplé à un annuaire LDAP.

Dans cet article, Keycloak, va être déployé sur une Debian 10 conteneurisé dans 2 images dockers. Docker-Compose va orchestrer le tout. Un serveur nginx sera en frontal en tant que reverse-proxy.

Prérequis

Installation

Installation des paquets

  • Installer docker :

    sudo apt install docker
  • Installer docker-compose :

    sudo apt install docker-compose
  • Vérifier l'installation de docker-compose :

    docker-compose --version

Création du docker-compose

  • Créer un répertoire afin d'y stocker le fichier docker-compose :

    sudo mkdir keycloak
  • Se positionner dans le répertoire nouvellement créé :

    cd keycloak
  • Créer un fichier docker-compose.yml :

    sudo vi docker-compose.yml

Attention, le fichier doit être au format YAML ce qui signifie que la tabulation est interdite (il faut mettre des espaces pour l'indentation).

  • Copier / Coller le fichier suivant :

    version: '3.3'
    
    volumes:
    postgres_data:
      driver: local
    
    services:
    postgres:
      image: postgres
      volumes:
        - postgres_data:/var/lib/postgresql/data
      environment:
        POSTGRES_DB: keycloak
        POSTGRES_USER: keycloak
        POSTGRES_PASSWORD: password
    keycloak:
      image: jboss/keycloak:latest
      environment:
        PROXY_ADDRESS_FORWARDING: 'true'
        DB_VENDOR: POSTGRES
        DB_ADDR: postgres
        DB_DATABASE: keycloak
        DB_USER: keycloak
        DB_PASSWORD: password
        KEYCLOAK_USER: admin
        KEYCLOAK_PASSWORD: Mon_mot_de_passe
      ports:
        - 9090:8080
      depends_on:
        - postgres
    
    • Le numéro de version indiqué en 1ère ligne peut varier suivant votre version de docker-compose. Dans mon cas, j'ai une version de docker-compose en 1.21.0.

    • Le port de keycloak dans le conteneur est le 8080, il sera bind sur le 9090 du serveur.

    • La directive PROXY_ADDRESS_FORWARDING est très importante dans le cas d'une utilisation de reverse proxy.

Lancement du docker-compose

  • Exécuter le docker-compose :

    sudo docker-compose -f ~/keycloak/docker-compose.yml up
  • Pour lancer le docker-compose en arrière-plan :

    sudo docker-compose -f ~/keycloak/docker-compose.yml up -d
  • Vérifier que les conteneurs docker soient bien démarrés :

    sudo docker ps
  • Le résultat soit être similaire à :

    CONTAINER ID        IMAGE                   COMMAND                  CREATED              STATUS              PORTS                              NAMES
    643f26101b75        jboss/keycloak:latest   "/opt/jboss/tools/do…"   About a minute ago   Up 52 seconds       8443/tcp, 0.0.0.0:9090->8080/tcp   keycloak_keycloak_1
    6789a8285283        postgres                "docker-entrypoint.s…"   About a minute ago   Up 52 seconds       5432/tcp                           keycloak_postgres_1
    

Configuration reverse-proxy SSL avec Nginx

  • Un serveur Nginx doit être opérationnel.

    S'appuyer sur cet article : Nginx : Installation d’un Reverse Proxy

  • Les certificats SSl doivent être générés.

    S'appuyer sur cet article : Nginx : Ajouter un certificat SSL Let’s Encrypt pour passer en HTTPS

  • Créer le fichier de configuration du virtual host :

    sudo vi /etc/nginx/sites-available/keycloak.conf
  • Copier / Coller le fichier suivant :

    server {
          listen 80;
          server_name keycloak.example.com;
          rewrite ^ https://keycloak.example.com permanent;
    }
    
    server {
          listen 443 ssl;
          server_name keycloak.example.com;
          ssl_certificate /etc/letsencrypt/live/keycloak.example.com/fullchain.pem;
          ssl_certificate_key /etc/letsencrypt/live/keycloak.example.com/privkey.pem;
          ssl_session_cache builtin:1000 shared:SSL:10m;
          ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
          ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
          ssl_prefer_server_ciphers on;
    
          location / {
                  proxy_set_header Host $host;
                  proxy_set_header X-Real-IP $remote_addr;
                  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                  proxy_set_header X-Forwarded-Proto $scheme;
                  proxy_pass http://IP_MON_SERVEUR_KEYCLOACK:9090;
          }
    
    }
    • Remplacer keycloak.example.com par le nom de domaine pour le serveur keycloak. Le nécessaire doit être fait au sein de la zone DNS.
    • Vérifier les chemins d'accès aux certificats SSL.
    • Modifier la directive proxy_pass pour correspondre avec le serveur keycloak.
  • Créer un lien symbolique pour activer le virtual host :

    sudo ln -s /etc/nginx/sites-available/keycloak.conf /etc/nginx/sites-enabled/keycloak.conf
  • Vérifier la configuration de Nginx avec :

    sudo nginx -t
  • Redémarrer le service nginx :

    sudo systemctl restart nginx

Accès administrateur à Keycloak

Les credentials à entrer sont ceux définit dans le fichier docker-compose.yml aux lignes suivantes :

      KEYCLOAK_USER: admin
      KEYCLOAK_PASSWORD: Mon_mot_de_passe

Démarrage automatique avec le système

  • Avec la configuration actuelle au redémarrage du serveur keycloak, le docker-compose ne sera pas lancé.

  • Pour activer le démarrage automatique des conteneurs Postegresql et Keycloak au boot du serveur, modifier le docker-compose.yml et ajouter cette ligne dans chaque services qui doit démarrer avec le service docker :

    restart: always

    Si les conteneurs sont arrêtés à la main, ils ne démarreront pas automatiquement. Docker comprend que c'est une action manuelle et que c'est l'état désiré.

  • Pour que cela soit fonctionnel, le service docker.service doit être en status enable :

    sudo systemctl status docker.service
  • Le résultat doit être le suivant :

    Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
  • Si cela n'est pas le cas :

    sudo systemctl enable docker.service

2 commentaires

OpenProject : Mise en place du SSO avec Keycloak Publié le14h49 - 28 octobre 2021

[…] Keycloak : Installation avec Docker et reverse-proxy SSL Nginx […]

Keycloak : Integration LDAP externe Publié le17h33 - 4 novembre 2021

[…] Keycloak : Installation avec Docker et reverse-proxy SSL Nginx […]

Les commentaires sont fermés.

Les commentaires sont fermés.