Sécuriser son serveur Ollama : authentification, reverse proxy, exposition
Sécuriser Ollama n'est pas une option quand le daemon devient accessible au-delà de votre machine. Des milliers d'instances traînent sur internet sans le moindre contrôle d'accès, offrant du calcul GPU gratuit à qui les trouve — et parfois bien pire. Ce guide montre comment vérifier votre exposition, placer une authentification devant l'API via un reverse proxy, chiffrer le trafic et n'ouvrir l'accès distant que proprement.
#Pourquoi sécuriser Ollama est urgent
Ollama n'a aucune authentification native. Le daemon écoute, sert les requêtes, point final : il part du principe que seul un client de confiance sur la machine locale lui parle. Ce modèle tient tant qu'on reste sur http://localhost:11434. Le problème apparaît dès qu'on change une variable d'environnement pour rendre le service accessible depuis le réseau — un geste courant pour brancher une interface distante ou une autre machine.
En positionnant OLLAMA_HOST sur 0.0.0.0, on demande au daemon d'écouter sur toutes les interfaces réseau. Si le port 11434 n'est pas filtré par un pare-feu, l'API se retrouve ouverte à tout le réseau local, voire à internet entier si la machine a une IP publique ou une redirection de port sur la box. Aucun mot de passe, aucun jeton : n'importe qui peut envoyer des requêtes, télécharger ou supprimer vos modèles, et consommer votre GPU.
#Ce que l'API Ollama expose vraiment
Avant de protéger quoi que ce soit, il faut comprendre l'étendue de la surface d'attaque. L'API Ollama n'est pas qu'un endpoint de chat : c'est une API d'administration complète, sans distinction de privilèges. Un client anonyme dispose exactement des mêmes droits que vous.
- /api/generate et /api/chat
- Génération de texte. Consomme votre GPU à volonté et voit passer tous les prompts — donc potentiellement des données sensibles injectées par vos propres applications.
- /api/tags
- Liste tous les modèles installés. Un attaquant sait immédiatement ce que vous hébergez, y compris vos éventuels fine-tunes internes.
- /api/pull
- Télécharge n'importe quel modèle depuis un registre. Un tiers peut saturer votre disque ou installer un modèle piégé.
- /api/delete
- Supprime des modèles. Destruction de données possible sans aucune authentification.
- /api/create et /api/push
- Création de modèles à partir d'un Modelfile et envoi vers un registre. Détournement complet de l'instance.
- /v1/*
- Couche OpenAI-compatible sur le même port. Même absence de contrôle d'accès, exploitable par n'importe quel client OpenAI standard.
#Vérifier si votre Ollama est exposé
Commencez par un diagnostic honnête. L'objectif : savoir sur quelles interfaces le daemon écoute et si le port est joignable depuis l'extérieur. Trois vérifications, de la plus locale à la plus externe.
D'abord, regardez sur quelles adresses le processus est en écoute. Une écoute sur 127.0.0.1 est saine ; une écoute sur 0.0.0.0 ou une IP de réseau signifie que le service accepte des connexions distantes.
Ensuite, testez depuis une autre machine du réseau. Remplacez IP_DU_SERVEUR par l'adresse locale de la machine Ollama. Si la commande renvoie la liste des modèles, l'instance est joignable sur le réseau — ce qui est acceptable en LAN de confiance, mais jamais sans filtrage vers internet.
Enfin, contrôlez l'exposition publique. Si votre machine a une IP publique ou une redirection de port active, cherchez-la sur un moteur de recensement comme Shodan ou Censys. Une requête simple sur le port 11434 et la bannière Ollama révèle si votre instance est déjà indexée. Vous pouvez aussi tester votre IP publique directement.
#Étape 1 — Revenir à une écoute localhost
La première mesure, et souvent la seule nécessaire, consiste à ramener Ollama à son comportement par défaut : n'écouter que sur la boucle locale. Aucune raison d'exposer le port brut si vous placez ensuite un reverse proxy devant. Le proxy parlera à Ollama en local, et le monde extérieur ne parlera qu'au proxy.
Sur Linux, Ollama tourne en service systemd. La variable OLLAMA_HOST se configure via une surcharge de service, ce qui survit aux mises à jour du paquet.
- 01Éditer la surcharge du serviceOuvrez l'éditeur de surcharge systemd pour le service ollama. Cela crée un fichier drop-in propre sans toucher au service d'origine.
- 02Forcer l'écoute localeDéclarez OLLAMA_HOST sur 127.0.0.1:11434. Le daemon refusera alors toute connexion venant du réseau.
- 03Recharger et redémarrerRechargez la configuration systemd puis redémarrez le service pour appliquer la variable.
- 04ConfirmerRevérifiez avec ss -tlnp | grep 11434 : l'adresse doit être 127.0.0.1 et non 0.0.0.0.
#Étape 2 — Ajouter une authentification via reverse proxy
Puisque Ollama ne sait pas authentifier, on délègue cette responsabilité à un reverse proxy placé devant lui. Le proxy exige un identifiant, vérifie le trafic, puis relaie vers Ollama en local. Deux options éprouvées : Caddy (configuration minimale, TLS automatique) et nginx (omniprésent, très documenté).
#Option A — Caddy (recommandé pour la simplicité)
Caddy gère le TLS automatiquement via Let's Encrypt et propose une authentification basique en quelques lignes. Générez d'abord un hash du mot de passe, puis référencez-le dans le Caddyfile. Ne stockez jamais le mot de passe en clair.
Avec un nom de domaine pointant sur votre IP publique et les ports 80/443 ouverts, Caddy obtient et renouvelle seul le certificat TLS. Le client devra fournir l'identifiant à chaque requête via l'en-tête Authorization.
#Option B — nginx
nginx demande un fichier de mots de passe séparé, généré avec htpasswd, puis un bloc server qui applique l'authentification et relaie vers Ollama. C'est plus verbeux mais très répandu, notamment quand nginx sert déjà d'autres services.
#Étape 3 — Chiffrer le trafic (TLS)
L'authentification basique transmet l'identifiant encodé en base64 : sans TLS, il circule quasiment en clair et se capture trivialement. Le chiffrement du transport n'est donc pas optionnel dès qu'on sort du localhost. Deux cas de figure selon que vous avez un nom de domaine public ou non.
- Domaine public + ports 80/443
- Let's Encrypt via Caddy (automatique) ou certbot pour nginx. Certificat reconnu, aucun avertissement navigateur, renouvellement automatique.
- Réseau interne sans domaine public
- Certificat auto-signé ou autorité interne (mkcert). Les clients devront faire confiance au certificat, mais le trafic reste chiffré sur le LAN.
- Derrière un VPN
- Le tunnel VPN chiffre déjà tout. TLS reste recommandé en défense en profondeur, mais moins critique puisque personne d'externe n'atteint le proxy.
#Étape 4 — Accès distant propre : VPN et Tailscale
La question la plus importante : avez-vous vraiment besoin d'exposer Ollama sur internet ? Dans la grande majorité des cas, non. Vous voulez y accéder depuis vos propres appareils, pas depuis le web ouvert. Un réseau privé (VPN) répond exactement à ce besoin sans jamais exposer le port publiquement.
Tailscale est l'option la plus simple : il crée un réseau maillé chiffré (WireGuard) entre vos machines, avec des IP privées stables. Ollama n'écoute alors que sur l'interface Tailscale, et seuls vos appareils authentifiés dans votre tailnet peuvent le joindre. Aucune redirection de port, aucune IP publique exposée.
- 01Installer Tailscale sur le serveurInstallez le client et connectez la machine à votre tailnet. Elle reçoit une IP privée en 100.x.y.z accessible uniquement depuis vos autres appareils authentifiés.
- 02Lier Ollama à l'interface TailscaleRéglez OLLAMA_HOST sur l'IP Tailscale de la machine (ou gardez 127.0.0.1 et exposez via Tailscale Serve). Le port n'est joignable que dans le tailnet.
- 03Installer Tailscale sur vos clientsVos autres machines rejoignent le même tailnet et atteignent Ollama via son IP 100.x.y.z, où que vous soyez, sans ouvrir le moindre port sur la box.
- 04Vérifier l'isolementDepuis un réseau externe hors tailnet, le port doit être totalement injoignable. C'est le comportement attendu.
Si vous tenez à un VPN classique, WireGuard auto-hébergé offre le même résultat avec plus de contrôle : vous montez le tunnel, vous liez Ollama à l'interface wg0, et le port reste invisible depuis internet. Le choix entre Tailscale et WireGuard nu tient surtout à l'arbitrage entre simplicité et souveraineté totale de l'infrastructure.
#Durcissement réseau complémentaire
Au-delà du proxy et du VPN, quelques mesures de défense en profondeur limitent les dégâts en cas de mauvaise configuration. Le principe directeur : ne jamais dépendre d'une seule couche.
- Pare-feu strict
- Bloquez le port 11434 en entrée sur toutes les interfaces sauf loopback et VPN. Avec ufw : refuser 11434 par défaut, autoriser uniquement depuis le sous-réseau Tailscale/WireGuard.
- Pas de redirection de port
- Ne créez jamais de port forwarding 11434 sur la box/routeur. Si vous en avez un « pour tester », supprimez-le : c'est la cause n°1 des instances exposées.
- Limitation de débit
- Sur le reverse proxy, appliquez un rate limiting pour amortir un éventuel abus même après authentification (nginx limit_req, Caddy rate_limit).
- Mots de passe forts et rotation
- L'authentification basique ne résiste qu'à la force du secret. Utilisez des mots de passe longs et changez-les si un poste client est compromis.
- Journalisation
- Activez les logs d'accès du proxy pour repérer les tentatives anormales. Une instance saine ne reçoit que vos requêtes.
#Dépannage
- 403 Forbidden derrière le proxy
- Ollama rejette l'en-tête Host. Forcez Host à localhost:11434 côté proxy, ou définissez OLLAMA_ORIGINS pour autoriser votre domaine.
- Le streaming se fige ou arrive en bloc
- Le proxy bufferise la réponse. Désactivez le buffering (proxy_buffering off sur nginx) et augmentez le timeout de lecture pour les longues générations.
- curl fonctionne mais pas depuis une autre machine
- Ollama écoute encore sur 127.0.0.1 alors que le proxy est ailleurs, ou le pare-feu bloque le port 443 du proxy. Vérifiez ss -tlnp et les règles ufw.
- Certificat Let's Encrypt échoue
- Le port 80 doit être joignable depuis internet pour la validation HTTP-01, et le domaine doit pointer sur la bonne IP. Vérifiez le DNS et l'ouverture du port 80.
- Tailscale : Ollama injoignable dans le tailnet
- Ollama écoute sur 127.0.0.1 sans tailscale serve. Soit liez OLLAMA_HOST à l'IP 100.x, soit exposez via tailscale serve 11434.
- Toujours visible sur Shodan après correction
- L'index met du temps à se rafraîchir. Confirmez d'abord vous-même depuis un réseau externe que le port est fermé ; l'indexation se mettra à jour ensuite.
#Pour aller plus loin
Sécuriser l'accès n'est qu'une partie du tableau. Ces guides prolongent celui-ci sur le déploiement et la conformité :
- Déployer un chatbot IA pour son équipe sur intranet
- Le cas d'usage typique où ce durcissement s'applique : Ollama + Open WebUI multi-utilisateurs derrière un reverse proxy authentifié.
- Déployer un LLM en production avec Docker Compose
- Stack complète Ollama + Traefik où le reverse proxy et l'isolation réseau sont gérés dès la conception.
- LLM local et RGPD : la conformité données privées en entreprise
- Le pendant réglementaire : une exposition non maîtrisée est aussi un risque de fuite de données personnelles à documenter.
Un retour, une erreur, une précision ? Faites-nous signe, ça améliore le guide pour tout le monde.