Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
technique:tech_team:traefik [2021/11/16 00:49] qduchemitechnique:tech_team:traefik [2023/01/08 22:12] (Version actuelle) – pourquoi ajouter docker-socket-proxy ? ppom
Ligne 5: Ligne 5:
  
 Comme on l'a vu dans les pages précédentes, exposer un conteneur par un mapping sur le port de l'hôte a ses limites. Comme on l'a vu dans les pages précédentes, exposer un conteneur par un mapping sur le port de l'hôte a ses limites.
 +
 +Dans cette page, on va voir en illustration le problème avec les ports, et comment le résoudre grâce à Traefik. =)
  
 ## Problématique ## Problématique
Ligne 10: Ligne 12:
 Sur chaque machine, Picasoft héberge plusieurs services web accessibles via une URL. Lors de la consultation sur un navigateur web, cette URL est traduite en adresse IP, et permet de trouver la machine qui correspond à l'URL. Sur chaque machine, Picasoft héberge plusieurs services web accessibles via une URL. Lors de la consultation sur un navigateur web, cette URL est traduite en adresse IP, et permet de trouver la machine qui correspond à l'URL.
  
-Chaque service tourne dans un conteneur Docker. En prenant un exemple, la situation est la suivante :+Chaque service tourne dans un conteneur Docker. En prenant pour exemple Mattermost et Etherpad, la situation est la suivante :
  
 {{ :technique:docker:general:without_traefik_443.png |}} {{ :technique:docker:general:without_traefik_443.png |}}
  
-Le navigateur contacte naturellement le port `443` car l'URL est en HTTPS, dans cet exemple.+<bootnote>Le navigateur contacte naturellement le port `443` car l'URL est en HTTPS, dans cet exemple. 443 est le port standard pour le protocole HTTPS, la version sécurisée de HTTP.</bootnote>
  
 <bootnote question>Comment est-ce-que la machine sait quel conteneur correspond à quelle URL ?</bootnote> <bootnote question>Comment est-ce-que la machine sait quel conteneur correspond à quelle URL ?</bootnote>
Ligne 36: Ligne 38:
  
 C'est une solution simple, néanmoins elle nécessite d'utiliser les ports dans l'URL, et ce n'est vraiment pas pratique pour les utilisateurices. Les sites web que l'on consulte tous les jours n'ont pas de numéro de port dans leur URL, en général. C'est une solution simple, néanmoins elle nécessite d'utiliser les ports dans l'URL, et ce n'est vraiment pas pratique pour les utilisateurices. Les sites web que l'on consulte tous les jours n'ont pas de numéro de port dans leur URL, en général.
 +
 +<bootnote critical>En plus, le service n'est pas sécurisé _de base_ via HTTPS avec cette solution. On ne rentre pas dans les détails ici, mais HTTPS permet de chiffrer les communications entre un client et un serveur. Pour faire du HTTPS, il faut obtenir un **certificat**, qui atteste qu'on est bien le propriétaire du site et qui « contient » la clé de chiffrement, puis indiquer aux applications d'utiliser ces certificats... Un gros boulot qu'il faudrait refaire sur l'ensemble des services!</bootnote>
  
 ## Utiliser un reverse proxy ## Utiliser un reverse proxy
Ligne 50: Ligne 54:
 <bootnote question>Comment associer une URL à un conteneur ?</bootnote> <bootnote question>Comment associer une URL à un conteneur ?</bootnote>
  
-Il y a plusieurs solutions. `nginx` peut tout à faire être [utilisé comme reverse proxy](https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/). L'inconvénient, c'est qu'il va falloir lui fournir une configuration statique qui associe une URL à un conteneur, et cette configuration devra être modifiée à chaque nouveau service. Il faudra aussi gérer les certificats SSL pour chaque service, par exemple.+Il y a plusieurs solutions. `nginx` peut tout à faire être [utilisé comme reverse proxy](https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/). L'inconvénient, c'est qu'il va falloir lui fournir une configuration statique qui associe une URL à un conteneur, et cette configuration devra être modifiée à chaque nouveau service. Il faudra aussi gérer les certificats pour chaque service, par exemple.
  
 C'est pourquoi nous utilisons Traefik, un outil clé en main pour Docker. Traefik fonctionne comme un reverse proxy traditionnel, mais ajoute quelques fonctionnalités bien pratiques : C'est pourquoi nous utilisons Traefik, un outil clé en main pour Docker. Traefik fonctionne comme un reverse proxy traditionnel, mais ajoute quelques fonctionnalités bien pratiques :
Ligne 88: Ligne 92:
  
 <bootnote warning>Tout conteneur qui ne se trouve pas dans le réseau `proxy` ne sera jamais pris en compte par Traefik.</bootnote> <bootnote warning>Tout conteneur qui ne se trouve pas dans le réseau `proxy` ne sera jamais pris en compte par Traefik.</bootnote>
 +
 +### Point sécurité : réduction de la surface d'attaque
 +
 +1. Traefik est un service critique pour la sécurité de nos services : c'est un des seuls services qui est accessible en première ligne depuis Internet.
 +De tous nos services, c'est un de ceux qui peut être le plus plausiblement compromis.
 +
 +2. Pour avoir la liste des autres conteneurs Docker, Traefik se connecte normalement via la socket d'administration Docker /var/run/docker.sock.
 +C'est une permission accordée que très exceptionnellement à un conteneur, car elle donne tous les droits sur Docker, et donc les droits `root` par extension.
 +
 +Pour éviter de donner trop de permissions à Traefik, on utilise un [intermédiaire](https://github.com/Tecnativa/docker-socket-proxy/) entre Traefik et la socket d'administration.
 +Cet intermédiaire n'est pas accessible depuis le monde extérieur, donc difficile à compromettre.
 +Il ne va autoriser que les requêtes légitimes de Traefik (lister les conteneurs) et interdire toute autre tentative de connexion (créer ou supprimer un conteneur, un volume, etc).
 +
 +### Et plus concrètement ?
 +
 +C'est parti pour un peu plus de pratique sur la [[technique:tech_team:traefik_usage|page suivante]] !
  • technique/tech_team/traefik.1637020141.txt.gz
  • de qduchemi