Migration de Serveur

Date: 2025-03-15

Tags: info réseau serveur

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 :

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 :

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 :

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}

  1. On m’a appris l’existence de Crowdsec pour remplacer Fail2ban.↩︎

  2. Git - Setting Up the Server↩︎

Electronics Électronique puissance semiconducteur semiconductors power Hardware CPE INSA Xavier Bourgeois

Xavier