Rôle d'un reverse proxy

Un reverse proxy agit comme un intermédiaire sécurisé entre un client frontend (navigateur ou application) et un serveur backend (une base de données, un service ou une API). C'est le point d’entrée unique du réseau applicatif en terminant la connexion TLS, en redirigeant et filtrant le trafic web, et surtout en cachant l'infrastructure interne des services.

Un reverse proxy permet d'organiser de manière encore plus sécurisée la sécurité TLS et les communications entre les différents services lesquels sont basés sur les certificats.

Il existe plusieurs programmes pouvant remplir les fonctions de reverse proxy comme Traefik, Nginx, ou HAProxy.

Les contratines de sécurité du CNRS rendent obligatoires l'accès au CLE et aux services sécurisés uniquement par VPN. Voici les étapes optionnelles pour la réalisation d'un revserse proxy avec TRAEFIK.

Organisation pour la prodcution avec Traefik

La VM Linux est dans un VLAN fermé depuis l’extérieur et accessible uniquement par VPN. Pour cela, il faut installer les services Docker et SSH. Dans notre cas, la configuration du service se fera avec un certificat auto-signé.

Dès que l'on place un reverse proxy devant une application, le certificat serveur public (X.509) ne se trouve plus sur l’application backend, mais bien sur la VM comportant le reverse proxy. Le frontend client établit la connexion TLS avec Traefik lequel déchiffre la communication Puis, soit Trefik communique avec le backend en clair et en HTTP, soit il communique en TLS interne, et HTTPS entre le proxy et le backend.

Les différentes étapes :

1.Création d'un certificat auto-signé

La VM etant dans un VLAN privé, il n'est pas possible d'utiliser Let's encrypt. Il faudra passer par un certificat auto-signé.

apt install mkcert

# Création d'une autorité de confiance local dans /root...
/root/.local/share/mkcert
mkcert -install
mkdir ./certs

mkcert -cert-file ./certs/cle-cert.pem -key-file ./certs/cle-key.pem "cle- mondomaine.fr"

# Verification
openssl verify -CAfile /root/.local/share/mkcert/rootCA.pem cle-cert.pem

2.Installation de Traefik

L'installation est réalisé avec 3 fichiers - 1- docker-compose.yml qui contient la configuration générale - 2- . /conf/traefik.yml qui contient le chemin des certificats - 3- ./conf/elabftw_cle.yml contenant les chemins

Le fichier docker-compose.yml (3.6 a verifier)

        services:
         traefik:
          image: traefik:v3.6
          container_name: traefik
          restart : always
          networks:
           - traefik_web
         ports:
           # the http port
           - "80:80"
           - "443:443"
           # the web ui (enabled by --api.insecure=true)
           - "8080:8080"
         volumes:
           - /etc/localtime:/etc/localtime:ro
           # so that traefik can listen to the docker events
           - /var/run/docker.sock:/var/run/docker.sock
           - ./conf/:/etc/traefik/
           - ./certs:/etc/ssl/my_certs
       networks:
         traefik_web:

Le fichier ./conf/traefik.yml

        # ./traefik/traefik.yml
        global:
         sendAnonymousUsage: false

        log:
         level: "DEBUG"
         format: "common"

        providers:
         docker:
          endpoint: "unix:///var/run/docker.sock"

           watch: true
           exposedByDefault: true
         file:
           directory: "/etc/traefik/"
           watch: true


        tls:
          certificates:
           - certFile: "/etc/ssl/my_certs/cle-cert.pem"
             keyFile: "/etc/ssl/my_certs/cle-key.pem"
          options:
           intermediate:
           minVersion: "VersionTLS12"
           cipherSuites:
             - "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256"
             - "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"
             - "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384"
             - "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384"
             - "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305"
             - "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305"

        api:
         dashboard: true
         debug: true
         insecure: true

        entryPoints:
         insecure:
          address: ":80"
          forwardedHeaders:
            insecure: true
          http:
            redirections:
             entryPoint:
               to: "secure"
               scheme: https
         secure:
          address: ":443"
          forwardedHeaders:
            insecure: true

        #Pour éviter l'erreur 500 Internal Server Error' caused by: x509: cannot validate certificate for
        serversTransport:
         insecureSkipVerify: true

Le fichier ./conf/elabftw_cle.yml

        http: 
         routers:
          elabftw_cnrs: 
           tls: {}
           entryPoints: \["secure", "insecure"\]
           service: "service-cle"
           priority: 50
           rule: "Host(`cle-mondomaine.fr`)"

         services:
          service-cle:
           loadBalancer:
             servers:
              - url: "https://X.Y.W.Y"
docker-compose up -d
docker exec -it traefik sh

3.Vérification du bon fonctionnement du proxy

Le site Web du CLE Il faut penser à mettre le nom de l'URL dans votre DNS car on y accède uniquement par le nom https://cle-mondomaine.fr

Le dashboard de Traefic http://cle-modomaine.fr:8080

Quelques références et liens internet

La référence de base est la documentation interne établie par Henri Valeins.

Voici d'autres références :