rss logo

Sécuriser Open WebUI en HTTPS avec Caddy sur Debian

Open WebUI sécurisé en HTTPS avec le chiffrement SSL/TLS

Dans un précédent tutoriel, j’ai expliqué comment installer Open WebUI sur Debian. Pour rappel, Open WebUI est une interface web autohébergée qui permet aux utilisateurs d’interagir avec des grands modèles de langage (LLM) depuis leur navigateur.

Par défaut, l’installation d’Open WebUI décrite dans ce tutoriel utilise une connexion HTTP non chiffrée. Si cela peut être acceptable dans un environnement de test, cette configuration présente des risques de sécurité en production ou en entreprise. Les identifiants, les mots de passe et les conversations peuvent notamment être interceptés lorsqu’ils transitent sur le réseau sans chiffrement.

Pour sécuriser l’accès à Open WebUI en HTTPS, nous allons configurer un proxy inverse (reverse proxy) avec Caddy, un serveur web léger et performant qui prend en charge la gestion automatique des certificats TLS. Caddy permet d’activer simplement les connexions chiffrées et de sécuriser Open WebUI sans configuration complexe.

Architecture

Comme l’illustre le schéma ci-dessous, nous allons utiliser Caddy comme reverse proxy pour sécuriser l’accès à Open WebUI. Caddy reçoit les connexions HTTPS sur le port 443/tcp, gère les certificats TLS et transmet les requêtes au service Open WebUI qui écoute sur le port 8080/tcp.

Dans cette configuration, Caddy et le conteneur Docker Open WebUI s’exécutent sur le même serveur Debian. Caddy assure le chiffrement HTTPS, tandis que les échanges entre le reverse proxy et Open WebUI s’effectuent localement en HTTP.

Schéma d’architecture : Caddy sécurise Open WebUI en HTTPS sur un serveur Debian
Architecture du reverse proxy Caddy : les connexions HTTPS sur le port 443 sont transmises localement au conteneur Docker Open WebUI sur le port 8080.

Installer Caddy

Dans cette section, nous allons installer et configurer Caddy sur notre serveur Debian. Caddy jouera le rôle de reverse proxy : il recevra les connexions HTTPS et transmettra les requêtes au service Open WebUI exécuté localement sur le port 8080.

  • Mettez à jour la liste des paquets et installez Caddy depuis les dépôts Debian :
root@host:~# apt update && apt install caddy
  • Modifiez le fichier de configuration /etc/caddy/Caddyfile. Remplacez IP_DEBIAN par l’adresse IP de votre serveur Debian :
# Configuration du reverse proxy HTTPS pour Open WebUI

# Adresse IP du serveur Debian hébergeant Caddy et Open WebUI.
# Remplacez IP_DEBIAN par l’adresse IP du serveur.
IP_DEBIAN {
    # Générer et gérer les certificats TLS avec l’autorité de certification interne de Caddy.
    # Les appareils clients doivent faire confiance au certificat racine de Caddy.
    tls internal

    # Transmettre les requêtes HTTPS entrantes à Open WebUI.
    # Open WebUI écoute localement sur le port 8080 en HTTP.
    reverse_proxy 127.0.0.1:8080
}
  • Vérifiez la validité de la configuration de Caddy :
root@host:~# caddy validate --config /etc/caddy/Caddyfile
  • Activez le démarrage automatique du service Caddy et redémarrez-le :
root@host:~# systemctl enable caddy
root@host:~# systemctl restart caddy

Vous pouvez maintenant accéder à Open WebUI en HTTPS à l’adresse https://IP_DEBIAN.

Bloquer l’accès HTTP direct à Open WebUI

Maintenant que les utilisateurs peuvent accéder à Open WebUI en HTTPS, nous devons les empêcher de contourner Caddy en se connectant directement au port HTTP non chiffré 8080. Pour cela, nous allons configurer Open WebUI afin qu’il écoute uniquement sur l’interface de boucle locale (127.0.0.1).

  • Arrêtez et supprimez le conteneur Docker existant sans supprimer son volume persistant :
root@host:~# docker rm -f open-webui
  • Recréez le conteneur Open WebUI en ajoutant la variable d’environnement HOST=127.0.0.1 :
root@host:~# docker run -d \
  --network=host \
  -v open-webui:/app/backend/data \
  -e HOST=127.0.0.1 \
  -e OLLAMA_BASE_URL=http://127.0.0.1:11434 \
  --name open-webui \
  --restart always \
  ghcr.io/open-webui/open-webui:main
  • Vérifiez qu’Open WebUI écoute uniquement sur 127.0.0.1:8080 :
root@host:~# ss -lntp | grep 8080
LISTEN 0      2048       127.0.0.1:8080       0.0.0.0:*    users:(("python3",pid=11429,fd=27))

💡 Remarque : La variable HOST=127.0.0.1 limite l’écoute d’Open WebUI à l’interface de boucle locale. Les utilisateurs peuvent ainsi accéder à l’application via le reverse proxy HTTPS Caddy, mais ne peuvent pas se connecter directement au port 8080 depuis un autre ordinateur du réseau.

Utiliser des certificats Let's Encrypt

Nous disposons désormais d’un serveur Open WebUI sécurisé en HTTPS grâce aux certificats générés automatiquement par Caddy. Toutefois, ces certificats étant émis par l’autorité de certification (AC) interne de Caddy, le navigateur peut afficher un avertissement de sécurité si les appareils des utilisateurs ne font pas confiance à cette autorité.

En entreprise, vous pouvez préférer des certificats émis par une autorité de certification reconnue publiquement, comme Let's Encrypt. Les utilisateurs peuvent alors accéder à Open WebUI en HTTPS sans avertissement de certificat dans leur navigateur, à condition d’utiliser le nom de domaine couvert par le certificat.

Dans cet exemple, nous allons configurer Caddy pour utiliser des certificats SSL/TLS Let's Encrypt existants, obtenus sur une autre machine puis copiés manuellement sur notre serveur Debian. Cette méthode est particulièrement utile pour les serveurs sans accès à Internet.

💡 Remarque : Avant de poursuivre, créez le répertoire /etc/caddy/certs et copiez-y les fichiers fullchain.pem et privkey.pem obtenus auprès de Let's Encrypt. Assurez-vous que le service Caddy dispose des droits de lecture sur ces fichiers. Les certificats installés manuellement doivent également être renouvelés et remplacés avant leur expiration.

  • Modifiez le fichier de configuration /etc/caddy/Caddyfile. Remplacez openwebui.std.rocks par le nom DNS utilisé pour accéder à votre serveur Open WebUI :
# Configuration du reverse proxy HTTPS pour Open WebUI

# Nom de domaine utilisé pour accéder au serveur Open WebUI.
openwebui.std.rocks {
    # Utiliser un certificat Let's Encrypt existant et sa clé privée.
    # Les certificats sont copiés manuellement sur ce serveur sans accès à Internet.
    tls /etc/caddy/certs/fullchain.pem /etc/caddy/certs/privkey.pem

    # Transmettre les requêtes HTTPS entrantes à Open WebUI.
    # Open WebUI écoute localement sur le port 8080 en HTTP.
    reverse_proxy 127.0.0.1:8080
}
  • Créez un répertoire pour stocker les certificats Let's Encrypt :
root@host:~# mkdir -p /etc/caddy/certs
  • Copiez-y les fichiers du certificat et de la clé privée :
root@host:~# cp fullchain.pem privkey.pem /etc/caddy/certs/
  • Définissez le propriétaire, le groupe et les permissions appropriés :
root@host:~# chown root:caddy /etc/caddy/certs/*.pem
root@host:~# chmod 640 /etc/caddy/certs/*.pem
  • Vérifiez la validité de la configuration de Caddy, puis redémarrez le service pour appliquer les modifications :
root@host:~# caddy validate --config /etc/caddy/Caddyfile
root@host:~# systemctl restart caddy

Conclusion

Nous disposons désormais d’une installation Open WebUI sécurisée et accessible en HTTPS. Caddy joue le rôle de reverse proxy et chiffre les communications entre les utilisateurs et l’interface web.

Que vous utilisiez les certificats générés par l’autorité de certification interne de Caddy ou des certificats Let's Encrypt existants, cette configuration contribue à protéger les identifiants et les conversations des utilisateurs contre l’interception sur le réseau. Elle offre également une solution simple et efficace pour sécuriser l’accès à Open WebUI en entreprise.