Migration de Serveur
Date: 2025-03-15
La machine sur laquelle ce site est hébergé est située chez un hébergeur, et il est parfois utile de changer de machine, ou même d’hébergeur.
Les hébergeurs ont généralement des baies de machines qu’ils remplacent régulièrement, et les machines obsolètes leur coûtent de la place, d’où leurs propositions régulières pour changer de machines.
Ici, on va changer de machine sans changer d’hébergeur, mais les mêmes choses s’appliquent à tous les hébergeurs donnant l’accès à une machine physique (bare-metal) ou virtualisée (VPS) avec Linux. Les CDNs, les clouds (AWS, Azure), les systèmes Windows, les conteneurs (Docker), et les hébergements seuls ne sont pas pris en compte ici.
Système
On va commencer par choisir la machine en fonction de ses besoins :
- localisation/datacenter
- type de machine
- configuration matérielle
- Coeurs et performances CPU
- RAM
- Espace disque
- Bande-passante réseau
- options ajoutables à la volée
Ensuite, on va choisir un système d’exploitation parmi ceux proposés par l’hébergeur.
Dans ce cas, j’ai choisi un VPS avec une configuration légèrement plus à jour que celle de mon VPS précédent, et la distribution de Linux Debian.
Accès
Une fois qu’on a commandé et reçu la machine, il faut y accéder.
L’hébergeur fournit l’adresse IP de la machine, et un login/mot-de-passe temporaires.
DNS
C’est le moment de configurer son service DNS pour qu’un nom pointe vers la nouvelle adresse IP, avec un enregistrement A.
Configuration initiale
Les premières opérations sont indispensables pour la sécurité et pour être sûr de ne pas perdre l’accès à sa propre machine.
Users
On commence par ajouter un compte d’utilisateur et l’essayer :
useradd --home-dir /home/foobar --user-group --create-home --uid 2001 foobar
passwd foobar
su - foobar
Puis on rajoute ce qu’on avait oublié :
usermod --shell /bin/bash --groups sudo foobar
Ensuite, on s’occupe de root :
passwd root
Cette étape est optionnelle puisqu’on peut utiliser sudo.
Il est indispensable de tester que l’accès à distance fonctionne avec ssh depuis une autre machine, avant de supprimer l’utilisateur temporaire qui a été donné par l’hébergeur :
userdel temp
SSH
Mainteant que le contrôle d’accès fonctionne, on peut configurer ssh avec le fichier de configuration /etc/ssh/sshd_config.
Désactivation du login Root
Il est fortement recommandé de désactiver l’authentication de root par mot-de-passe, soit en n’autorisant que les clés, soit en le désactivant totalement dans le fichier de configuration :
#PermitRootLogin prohibit-password ## ne permet que l'authentication de root par clés
PermitRootLogin no ## désactive complètement l'authentication de root
#PermitRootLogin yes ## permet l'authentication de root, déconseillé
Changement de port
Les attaques par brute-force se font généralement sur le port par défaut de SSH, utiliser un autre port inutilisé permet d’éviter une partie des attaques :
Port xyz
Authentification par clés
Une façon courante de le sécuriser est d’utiliser des clés à la place des mots-de-passe. L’intérêt est de pouvoir désactiver l’identification par mot-de-passe, qui permet d’éviter des failles de sécurité et des attaques par brute-force. C’est aussi un moyen de rendre les connexions plus simples pour l’utilisateur.
Notre système est déjà fonctionnel côté client, alors il suffit de copier uniquement la clé publique contenue dans le fichier ~/.ssh/id_rsa.pub vers le fichier ~/.ssh/authorized_keys. Il est important d’interdire la lecture à d’autres utilisateurs avec chmod 600 ~/.ssh/authorized_keys.
Cette fonctionalité ne nécessite pas de redémarrer SSH.
Tests
Il est indispensable de tester la configuration avant de fermer la session.
On redémarre SSHD pour prendre en compte sa nouvelle configuration :
/etc/init.d/ssh restart
On doit vérifier les cas suivants :
- SSH ne répond plus sur le port 22
- SSH répond bien sur le port xyz
- Login root impossible par SSH
- Login d’utilisateur possible par clé
- Login d’utilisateur possible par mot-de-passe
- sudo ou su fonctionnent correctement avec un utilisateur
Une fois que tout a été validé, on fermer sa session sans risque de perdre le contrôle de la machine.
Fail2ban
Ce programme permet de bannir un utilisateur après trop de tentatives de connexion infructueuses. 1
La configuration par défaut est dans le fichier /etc/fail2ban/fail2ban.conf. Elle permet 10 tentatives de connexion et purge la blacklist après une journée. Ça correspond à mon cas d’utilisation, mais on peut l’ajuster pour ne pas risquer de perdre l’accès à sa propre machine.
Sécurité
Par exemple, ici, le serveur a fonctionné 20 minutes, et les logs contiennent déjà des tentatives de connexion :
Invalid user pi from 91.163.173.xx port 4962
pam_unix(sshd:auth): check pass; user unknown
pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=91.163.173.xx
Invalid user pi from 91.163.173.xx port 2921
pam_unix(sshd:auth): check pass; user unknown
pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=91.163.173.xx
Failed password for invalid user pi from 91.163.173.xx port 4962 ssh2
Failed password for invalid user pi from 91.163.173.xx port 2921 ssh2
Connection closed by invalid user pi 91.163.173.xx port 4962 [preauth]
Connection closed by invalid user pi 91.163.173.xx port 2921 [preauth]
Mises-à-jour
Une étape de sécurité importante est d’être sûr que le système soit à jour, et provenant d’une source de confiance.
Il est possible de vérifier, d’ajouter ou de supprimer des sources de paquets avec les fichiers de configuration contenus dans les dossiers suivants :
/etc/apt/sources.lists.d/
/etc/apt/mirrors/
Ensuite, on va vérifier que le système DNS et hosts pointe vers la bonne adresse avec la commande ping exécutée depuis une machine de confiance et la machine en question.
Une fois que tout est vérifié, on peut mettre le système à jour :
apt-get update
apt-get upgrade
Suite de la configuration
On s’est occupé des tâches les plus urgentes, on peut effectuer les tâches suivantes sans se presser, et sans forcément respecter d’ordre.
Swap
Notre machine n’a pas beaucoup de RAM, et il se peut que certaines tâches consomment beaucoup de mémoire, alors on va rajouter un fichier de swap. Ce n’est pas aussi rapide que de la RAM, mais c’est mieux que de planter le système par manque de mémoire.
dd if=/dev/zero of=/root/swap bs=1M count=2048
mkswap /root/swap
chmod 600 /root/swap
echo '/root/swap none swap sw 0 0' >> /etc/fstab
swapon -a
Ici, on crée un fichier vide de 2GB, on lui donne les attributs d’un espace de swap, on lui permet un accès RW uniquement à root, on ajoute sa configuration pour que le système le prenne en compte au démarrage, et on l’active. La commande free permet de voir la mémoire physique disponible, ainsi que les fichiers de swap.
Paquets
C’est le moment d’installer des paquets qui correspondent à notre utilisation. ### Outils On a quelques outils de réseau : whois, mtr, net-tools, lsof. Ils serviront à vérifier le fonctionnement du réseau et de la machine, et de dépanner si quelque chose ne fonctionne pas correctement.
rsync est un programme de syncronisation de fichiers locaux ou par réseau, c’est très utile pour sauvegarder et restaurer des fichiers.
screen est un programme qui permet de faire fonctionner une console sans y être connecté en permanence, ou de la partager entre plusieurs machines. C’est très utile pour des machines accédées à distance.
Services web
On peut installer un ou plusieurs serveurs web de son choix : apache, lighttpd, nginx, ou autre, et les configurer correctement. C’est aussi le moment d’installer les modules associés aux serveurs web (PHP).
On fait attention à ce qu’aucun port ne soit utilisé simultanément par deux services, et on configure les vhosts en fonction de ses domaines DNS.
On va ensuite demander à Let’s encrypt de certifier un certificat SSL, avec la commande certbot qui s’occupe de la génération et du renouvellement.
Il ne reste plus qu’à uploader les fichiers à la racine des serveurs et à recharger leur configuration.
Git
On installe et on configure git 2, puis on peut copier les clés et les données de l’ancienne machine à la nouvelle.
Il est possible d’utiliser git pour de copier les données d’une machine à l’autre :
git clone --mirror git@oldserver:/home/git/projects/project1.git/
cd project1.git
git remote get-url origin
git remote set-url origin git@newserver:/home/git/projects/project1.git/
git push --mirror origin
On va vérifier que tout ait bien fonctionné avec une machine tierce :
mkdir oldrepo; cd oldrepo
git clone --mirror git@oldserver:/home/git/projects/project1.git/
git clone git@oldserver:/home/git/projects/project1.git/
for i in $(find project1* -type f); do md5sum $i ; done > md5sums
cd ../; mkdir newrepo; cd newrepo
git clone --mirror git@newserver:/home/git/projects/project1.git/
git clone git@newserver:/home/git/projects/project1.git/
for i in $(find project1* -type f); do md5sum $i ; done > md5sums
cd ..
diff oldrepo/md5sums newrepo/md5sums
On retrouve des fichiers différents dans le dossier .git, mais on ne trouve aucune différence dans les fichiers sources, ni aucun fichier source manquant.
On peut aussi utiliser la commande diff pour voir ce qui a changé :
for i in $(diff oldrepo/md5sum newrepo/md5sum | awk '{ print $3}'); do diff oldrepo/$i newrepo/$i
Les seuls changements concernent l’adresse du serveur, ce qui valide que la migration a été effectuée correctement.
Autres programmes
C’est le moment de rajouter tout ce que vous avez l’habitude d’utiliser :
- Serveur/cache DNS : Bind, dnsmasq
- Serveur FTP, email
- Client IRC, Bittorrent
- Compilateurs/interpréteurs : GCC, distcc, Python
- Utilitaires pratiques : imagemagick, pdftk, yt-dlp, mencoder
- Scripts utilisateurs
Sauvegarde/restauration
On peut utiliser rsync pour copier des fichiers d’utilisateurs, par exemple :
for i in foo bar; do rsync -ave 'ssh -p xyz' --progress $i@oldmachine:/home/$i/ /home/$i/; done
Ici, rsync va utiliser le protocole ssh, avec le port xyz, pour authentifier chaque utilisateur et chiffrer ses données. On va l’executer sur la nouvelle machine et récupérer les fichiers depuis oldmachine. rsync est surtout intéressant en cas de copies partielles, par exemple avec une connexion instable où il n’y aura pas besoin de tout recopier en cas d’erreur.
On peut aussi utiliser tar ou scp qui sont simples et brutaux. C’est bien adapté à une l’installation initiale d’une machine.
Cosmétique
Il est souvent pratique de modifier le fichier ~/.bashrc pour rendre le shell plus lisible ou lui ajouter des raccourcis clavier :
PS1
La variable $PS1 correspond au début de la ligne de commande. On va afficher utilisateur@machine en vert, ‘:’ en gris, le chemin/dossier courant en bleu, et le symbole ‘$’ en gris :
PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
Aliases
On peut utiliser des raccourcis, comme ll et la pour compléter ls :
alias ls='ls --color=auto'
alias ll='ls -l'
alias la='ls -A'
On peut aussi créer le dossier ~/bin/, pour y placer des scripts d’utilisateurs, et les rendre accessibles par le shell :
export PATH=${HOME}/bin:${PATH}
- ← Previous page
Lectures 2024 - Next page →
cms
Electronics Électronique puissance semiconducteur semiconductors power Hardware CPE INSA Xavier Bourgeois