Pour le système d’exploitation, j’ai décidé de partir sur une LTS d’Ubuntu Server (Ubuntu Server 24.04 “Noble Numbat” LTS). J’ai donc la dernière version du système d’exploitation sur une version stable. Je peux donc faire les mises à jour de sécurité pendant 5 ans de mon serveur avant de faire une mise à niveau.
Choisissez un data center le plus proche de vos clients, à voir en fonction des disponibilités.
Notez bien l’adresse IP de votre serveur afin de vous connecter plus tard dessus.
Si vous pouvez, liez votre nom de domaine à l’adresse IP de votre serveur. Cela vous permettra de connecter directement en faisant:
ssh <utilisateur>@<nom de domaine>
au lieu de :
ssh <utilisateur>@<adresse ip>
Vous allez souvent recevoir par email les premières informations de votre serveur comme l’adresse IP, le premier mot de passe, le nom de l’utilisateur par défaut.
Créer un utilisateur avec moins de droits
Afin de ne pas tous le temps se connecter avec un utilisateur qui a des droits sudo sur le serveur et minimiser la surface potentielle d’attaque, nous allons créer un nouvel utilisateur avec moins de droits.
Création de l’utilisateur
sudo adduser <username>
Rentrer le mot de passe pour cet utilisateur (même si nous allons l’utiliser 1 ou 2 fois par la suite).
Garder bien en tête ce nom d’utilisateur, vous allez vous connecter avec plus tard.
Créer le groupe: docker et ajouter l’utilisateur
Afin d’éviter de devoir tout le temps mettre sudodevant nos commandes Docker, nous allons ajouter notre utilisateur à un groupe que nous allons créer.
Si vous êtes sur une machine virtuelle ou un VPS, il généralement conseillé de redémarrer entièrement le serveur, pour que les changements prennent effet.
Copie de votre clé SSH
Nous allons maintenant copier la clé SSH sur le serveur afin de pouvoir nous connecter sans mot de passe par la suite.
Je vous conseille de copier votre clé pour les 2 utilisateurs.
Une bonne pratique est de mettre deux clés différentes. Une que vous allez utiliser tous les jours avec l’utilisateur que vous venez de créer et une seconde de secours avec l’utilisateur principale de votre serveur.
Information
Vous pouvez définir à SSH la clé que vous voulez utiliser lors de la connexion
ssh -i ~/.ssh/mykey user@host
Autoriser uniquement la connexion par clé SSH
De nombreux utilisateurs de serveurs SSH utilisent des mots de passe faibles, de nombreux pirates informatiques recherchent des serveurs SSH et devinent des mots de passe au hasard.
Un pirate peut essayer des milliers de mots de passe par heure et avec du temps finir par le cracker. La solution recommandée est d’utiliser des clés SSH plutôt que des mots de passe. Pour être aussi difficile à deviner qu’une clé SSH classique, un mot de passe doit contenir 634 lettres et chiffres aléatoires.
Pour désactiver la connexion par mot de passe, nous allons modifier la configuration de notre serveur SSH.
Attention
Vérifier que vous pouvez bien vous connecter avec uniquement votre clé SSH avant d’aller plus loin.
Vous risquez de rester bloqué en dehors de votre serveur et de devoir le réinitialiser à zéro.
Ouvrer avec votre éditeur de texte préféré (nano, vi, vim, …) le fichier: /etc/ssh/sshd_config
Modifier la ligne #PasswordAuthentication yes à `PasswordAuthentication n
Enregistrer et redémarrer le service ssh :
sudo service ssh restart
Configurer le pare-feu
Ubuntu fourni un firewall lors de l’installation: Uncomplicated Firewall (UFW).
Celui ci va nous permettre de bloquer et/ou autoriser des connexions entrantes comme sortantes.
Attention
Un fonctionnalité de Docker fait que UFW ne contrôle pas les connexions sur les ports définis par les conteneurs.
Dans notre cas, ce n’est pas un problème car tous notre trafic va passer par le conteneur de Traefik.
Je vous conseil quand même d’appliquer le fix décrit dans cet article: Appliquer les règles UFW à Docker
Dans un premier temps, nous allons vérifier que UFW contrôle les connexions IPv4 comme IPv6.
Ouvrez le fichier /etc/default/ufw avec votre éditeur préféré et vérifiez que l’IPV6 soit à vrai: IPV6=yes.
Par la suite, nous allons créer les règles par défaut du serveur.
sudo ufw default deny incoming
Ici nous bloquons par défaut toutes les connexions entrantes vers notre serveur.
De même, nous allons bloquer toutes les connexions sortantes du serveur:
sudo ufw default allow outgoing
Maintenant, on peut créer les règles que l’on souhaite.
On va donc ouvrir les ports:
Ici, on garde le driver par défaut de Docker. On ajoute juste 2 options:
Le fichier de log ne peux pas faire plus de 20 Mo.
Il ne peux pas avoir plus de 14 fichiers de log.
Dans mon cas, je générais entre 8 et 16Mo de log par jour. Cette configuration me permet donc de garder un peu plus de 14 jours de log.
Traefik
Traefik est un proxy inverse et un load balancer open-source conçu pour faciliter la gestion du trafic vers des microservices et des conteneurs. Il s’intègre nativement avec des orchestrateurs comme Docker, Kubernetes et Consul, et permet l’auto-découverte des services. Grâce à son support intégré pour le HTTPS (via Let’s Encrypt), le routage dynamique et sa configuration déclarative.
Ici, je vais donner le fichier docker-compose.yaml puis revenir ligne par ligne dessus:
Dans un premier temps, on créer un service avec l’image de Traefik. On défini les stratégies de redémarrage du service. Ici, le service redémarrera sauf si l’utilisateur le stop.
Ensuite, on sélectionne le provider de Traefik, dans notre cas: docker et on monte le socket de docker avec le volume.
De plus, on monte un volume qui sert à stocker les certificats SSL générés par Traefik et on indique à Traefik les informations nécessaires pour LetsEncrypt.
Ici ont créé les entrypoints de Traefik: 80 pour l’HTTP et 443 pour l’HTTPS. À cela on ajoute une condition: transforme toutes les requêtes HTTP en HTTPS.
Enfin, on active l’interface graphique de Traefik. Ici, on va pouvoir surveiller les services, routes et middleware. On lui défini une URL, défini l’entrypoints à utiliser et le gestionnaire de certificat.
Pour éviter que tout le monde puisse avoir accès à ce dashboard, on lui ajoute un mot de passe sous la forme d’un middleware. Pour éviter d’écrire en dure le mot de passe dans le fichier, on utilise les secrets fournis par Docker.
Et voilà! Traefik est opérationnel.
Portainer
Portainer est une interface web simplifiant la gestion des conteneurs Docker, Kubernetes et d’autres environnements. Il offre une gestion intuitive des stacks, volumes, réseaux et images, facilitant l’administration des infrastructures cloud et DevOps.
Dans ce nouveau service, on utilise une image de communauté de Portainer en version alpine (plus légère).
Comme pour Traefik, on monte le socket de docker et un moyen de sauvegarder les données de configuration de Portainer.
Avec les labels, on indique à Traefik comment afficher les différents composants (Frontend et Edge) de Portainer.
Une bonne pratique est d’ajouter un healthcheck. Cela permet à Docker de définir l’état de santé du container. En quoi cela nous intéresse ? Eh bien, Traefik se base sur l’état de santé du container (s’il est défini) pour ouvrir ou non les connexions.
Voilà ! Vous un serveur prêt à accueillir vos plus beaux projets.