Chapitre 5.3 — L’utilisateur deploy
⏱️ TL;DR — Travailler en root au quotidien est une faute de sécurité : une commande de trop, un script malveillant, et c’est toute la machine qui tombe. On crée donc un utilisateur normal —
deploy— qu’on ajoute au groupe sudo (droits d’admin à la demande), à qui on copie sa clé SSH, et qu’on teste. Ensuite seulement on durcitsshd_config(rappel Partie 4 :PermitRootLogin no,PasswordAuthentication no) — l’ordre est vital pour ne pas se verrouiller dehors. À partir de là, tout le travail du cours se fait endeploy+sudo, jamais en root. C’est le pivot du durcissement : on ferme la porte root, la plus convoitée par les attaquants.
🎯 Objectifs
- Créer un utilisateur de travail
deployavecadduser. - Lui donner les droits d’administration à la demande via le groupe sudo.
- Copier sa clé SSH (depuis la machine locale, ou en recopiant
authorized_keys). - Tester l’accès
deploy+sudoavant de couper root — pour ne pas s’enfermer dehors. - Durcir
sshd_configdans le bon ordre : root off, mot de passe off.
Pourquoi quitter root : le moindre privilège
Depuis le début de cette partie, tu es connecté en root. C’était nécessaire pour un VPS neuf, mais c’est un état temporaire. Root peut tout faire, sans garde-fou : un rm mal ciblé efface le système, un script piégé s’exécute sans résistance, une faille dans un service tournant en root donne les pleins pouvoirs à l’attaquant. Le principe du moindre privilège (vu en Partie 3) dit l’inverse : on travaille avec le minimum de droits, et on monte en root ponctuellement, pour une commande précise, via sudo.
Concrètement : on crée un utilisateur normal, deploy, qui sera ton compte de travail quotidien. Quand une action demande les droits d’admin (installer un paquet, redémarrer un service), tu la préfixes de sudo — et cette élévation est explicite, tracée, et limitée à cette commande.
🔒 Sécurité — Root est la cible numéro un des attaquants : c’est le compte qui existe sur toutes les machines Linux, et le seul dont le nom est connu d’avance. Les robots de bruteforce ne testent quasiment que
root. En désactivant la connexion root (bientôt) et en travaillant endeploy, tu fais disparaître cette cible : un attaquant doit d’abord deviner ton nom d’utilisateur, puis franchir la clé SSH. Deux inconnues au lieu de zéro.
Étape 1 — Créer l’utilisateur deploy
Toujours connecté en root, crée l’utilisateur avec adduser (l’outil convivial de Debian/Ubuntu, préférable à useradd bas niveau) :
🐚 Au terminal
adduser deploy
# Crée l'utilisateur "deploy", son groupe, son dossier /home/deploy et un shell.
# La commande demande un MOT DE PASSE : choisis-en un solide (il servira pour sudo).
# Les autres champs (nom complet, etc.) : tu peux les laisser vides (Entrée).adduser fait tout le travail : il crée le compte, le dossier personnel /home/deploy, le shell par défaut, et te demande un mot de passe. Ce mot de passe ne servira pas à se connecter en SSH (on utilisera la clé), mais il servira à confirmer les commandes sudo — choisis-le donc robuste.
Étape 2 — Donner sudo à deploy
Sur Ubuntu/Debian, appartenir au groupe sudo donne le droit d’utiliser sudo. On ajoute deploy à ce groupe :
usermod -aG sudo deploy
# -a : ajoute (append) au groupe SANS retirer des groupes existants
# -G sudo : le groupe cible
# ATTENTION au -a : sans lui, usermod REMPLACE la liste des groupes (dangereux).Le -a (append) est crucial : sans lui, usermod -G remplacerait tous les groupes de l’utilisateur par le seul groupe indiqué. Avec -aG, on ajoute sudo à ses groupes existants. Mémorise le duo -aG, toujours ensemble.
⚠️ Piège — Oublier le
-adeusermod -aG. Unusermod -G sudo deploy(sans-a) écrase la liste des groupes dedeployet ne lui laisse que sudo — il perd son groupe primaire et d’autres appartenances, ce qui casse des choses subtiles. Toujours-aG, jamais-Gseul pour ajouter un groupe.
Étape 3 — Copier la clé SSH de deploy
deploy existe et peut faire du sudo, mais il ne peut pas encore se connecter en SSH : il n’a pas de clé publique autorisée. Il faut copier ta clé publique dans son ~/.ssh/authorized_keys. Deux méthodes.
Méthode A — depuis ta machine locale (la plus simple)
Depuis ton poste (pas depuis le serveur), tant que la connexion par mot de passe est encore ouverte pour deploy :
# Sur TA MACHINE LOCALE :
ssh-copy-id deploy@203.0.113.10
# Copie ta clé publique (~/.ssh/id_ed25519.pub) dans authorized_keys de deploy.
# Demande le mot de passe de deploy (celui défini à l'étape 1).ssh-copy-id s’occupe de tout : il crée ~/.ssh avec les bonnes permissions et ajoute ta clé. C’est la voie royale (revoir la Partie 4 sur la génération de clés ed25519).
Méthode B — recopier authorized_keys à la main
Si ssh-copy-id n’est pas disponible, ou si la connexion par mot de passe est déjà fermée, tu peux recopier la clé depuis root, qui l’a déjà dans son propre authorized_keys (le fournisseur l’y a mise à la création) :
🐚 Au terminal — sur le serveur, en root :
mkdir -p /home/deploy/.ssh # crée le dossier .ssh de deploy
cp /root/.ssh/authorized_keys /home/deploy/.ssh/ # recopie la ou les clés autorisées
chown -R deploy:deploy /home/deploy/.ssh # deploy devient propriétaire (essentiel)
chmod 700 /home/deploy/.ssh # dossier accessible par deploy seul
chmod 600 /home/deploy/.ssh/authorized_keys # fichier lisible par deploy seulLes permissions sont critiques : SSH refuse d’utiliser un ~/.ssh ou un authorized_keys trop permissif (droits en écriture pour le groupe ou les autres). 700 sur le dossier, 600 sur le fichier, et surtout chown à deploy — sinon les fichiers appartiennent à root et deploy ne peut pas les lire.
💡 Réflexe — Après avoir posé une clé, teste la connexion
deploydans un NOUVEAU terminal, sans fermer ta session root actuelle. Tant que tu n’as pas confirmé quessh deploy@ipfonctionne et quesudorépond, tu gardes ta session root ouverte comme filet. On ne coupe jamais un accès avant d’avoir validé le nouveau.
Étape 4 — Tester deploy + sudo AVANT de couper quoi que ce soit
C’est l’étape qu’on ne saute jamais. Ouvre un nouveau terminal sur ta machine locale (garde la session root ouverte à côté) :
# Sur ta machine locale, NOUVEAU terminal :
ssh deploy@203.0.113.10 # doit te connecter SANS mot de passe (par la clé)
whoami # doit afficher : deploy
sudo apt update # teste sudo : demande le mot de passe de deploy, puis exécuteSi ssh deploy@ip te connecte par la clé, que whoami dit deploy, et que sudo apt update fonctionne (après avoir tapé le mot de passe de deploy) : tout est bon. Tu peux passer au durcissement SSH. Si quoi que ce soit échoue, tu corriges depuis ta session root encore ouverte — sans risque de t’enfermer.
Étape 5 — Durcir SSH (dans le bon ordre)
Maintenant, et seulement maintenant que deploy + sudo + clé sont validés, on ferme les portes de root et du mot de passe. Ces réglages ont été introduits en Partie 4 ; on les applique ici, dans le contexte du provisioning. Édite la config du serveur SSH :
🐚 Au terminal — en
deploy, avec sudo :
sudo nano /etc/ssh/sshd_configRepère (ou ajoute) ces deux directives, et mets-les à no :
PermitRootLogin no
PasswordAuthentication noPermitRootLogin no— interdit toute connexion SSH directe enroot. La cible n°1 des bruteforces disparaît.PasswordAuthentication no— interdit la connexion par mot de passe : seules les clés sont acceptées. Le bruteforce de mots de passe devient impossible (il n’y a plus de mot de passe à deviner).
Puis recharge la configuration SSH pour l’appliquer :
sudo systemctl restart ssh # applique la nouvelle config (le service peut s'appeler ssh ou sshd)
# Sur certaines distros : sudo systemctl restart sshd⚠️ Piège — Couper
PermitRootLoginetPasswordAuthenticationavant d’avoir testé quedeployse connecte par clé. Si ta clé n’est pas correctement en place et que tu désactives le mot de passe, tu te verrouilles dehors : plus de root, plus de mot de passe, et pas de clé qui marche. La règle d’or : garde ta session actuelle ouverte, ouvre une nouvelle connexiondeploypour vérifier, et ne durcis qu’après confirmation. (Filet ultime : la console de secours du fournisseur, dans son panneau web, qui accède à la machine hors SSH.)
🔒 Sécurité — Ces deux
nosont parmi les gains de sécurité les plus rentables du serveur.PermitRootLogin nosupprime la cible universelle ;PasswordAuthentication norend le bruteforce structurellement impossible (pas de mot de passe = rien à forcer). Combinés à la cléed25519et, bientôt, à fail2ban et au pare-feu, l’accès SSH passe de « porte grande ouverte » à « coffre-fort ». Pense aussi àAllowUsers deploypour restreindre explicitement qui peut se connecter.
À partir de maintenant : deploy + sudo, jamais root
Le changement de compte n’est pas cosmétique, c’est un changement de méthode pour tout le reste du cours. Désormais :
- Tu te connectes en
deploy(ssh deploy@ip), jamais en root. - Les commandes d’admin sont préfixées de
sudo:sudo apt install,sudo systemctl restart nginx,sudo nano /etc/…. - Les services applicatifs (Node, Nginx, Postgres) tourneront eux aussi en utilisateurs dédiés non-root (Parties 7 et 9).
🧭 Sur FormaCampus — Sur
formacampus-prod, l’équipe créedeploy, lui donne sudo, y colle la cléed25519de l’ingé responsable du déploiement, testessh deploy@formacampus-proddans un second terminal, puis coupe root et le mot de passe. À partir de là, plus personne ne se connecte en root : les déploiements, les redémarrages de services, tout passe pardeploy+sudo. Quand la CI/CD arrivera (Partie 13), c’est encoredeploy(avec sa propre clé de déploiement) qui poussera les releases — jamais root. Le compte root devient un compte de secours qu’on n’utilise qu’en dernier recours via la console fournisseur.
📚 La doc — Toutes les directives de
sshd_configsont documentées dansman sshd_config:PermitRootLogin,PasswordAuthentication,AllowUsers,PubkeyAuthentication,Port… C’est la référence exacte pour ta version. Pouradduser/usermod, voirman adduseretman usermod.
✏️ Exercices
Exercice 1 — Le bon ordre. Remets dans l’ordre ces gestes de création de deploy, et explique pourquoi cet ordre évite de s’enfermer dehors : (A) PermitRootLogin no ; (B) adduser deploy ; (C) tester ssh deploy@ip ; (D) usermod -aG sudo deploy ; (E) copier la clé SSH.
✅ Solution
Ordre : B → D → E → C → A. (B) créer deploy, (D) lui donner sudo, (E) copier sa clé SSH, (C) tester que ssh deploy@ip marche par la clé et que sudo répond, puis seulement (A) couper l’accès root (et le mot de passe).
L’ordre est vital : on ne désactive root et le mot de passe qu’après avoir prouvé que le nouvel accès deploy par clé fonctionne. Sinon, si la clé n’est pas bien en place, on se retrouve sans root, sans mot de passe et sans clé valide — verrouillé dehors.
Exercice 2 — Permissions cassées. Tu as recopié authorized_keys à la main dans /home/deploy/.ssh/, mais ssh deploy@ip demande toujours un mot de passe (la clé est ignorée). Quelles sont les deux causes les plus probables et comment les corriger ?
✅ Solution
SSH ignore un ~/.ssh ou un authorized_keys mal sécurisé ou mal possédé. Les deux causes classiques :
- Mauvais propriétaire : les fichiers appartiennent à
root(créés en root) au lieu dedeploy. Correction :sudo chown -R deploy:deploy /home/deploy/.ssh. - Permissions trop ouvertes : SSH exige
700sur le dossier et600sur le fichier. Correction :chmod 700 /home/deploy/.sshetchmod 600 /home/deploy/.ssh/authorized_keys.
Après correction, ssh deploy@ip doit se connecter par la clé, sans mot de passe.
🧠 Quiz de révision
1. Pourquoi crée-t-on un utilisateur deploy au lieu de travailler en root ?
deploy au lieu de travailler en root ?Pour appliquer le moindre privilège : on travaille avec le minimum de droits et on monte en root ponctuellement via sudo. Root peut tout faire sans garde-fou (une erreur ou un script piégé compromet toute la machine) et c’est la cible n°1 des attaquants. deploy + sudo limite les dégâts et l’exposition.
2. Que fait usermod -aG sudo deploy, et pourquoi le -a est-il crucial ?
usermod -aG sudo deploy, et pourquoi le -a est-il crucial ?Elle ajoute deploy au groupe sudo (qui donne le droit d’utiliser sudo). Le -a (append) est crucial : sans lui, usermod -G remplacerait tous les groupes de l’utilisateur par le seul groupe indiqué, lui faisant perdre ses autres appartenances. Toujours -aG ensemble.
3. Pourquoi tester ssh deploy@ip avant de désactiver root et le mot de passe ?
ssh deploy@ip avant de désactiver root et le mot de passe ?Pour ne pas se verrouiller dehors. Tant qu’on n’a pas confirmé que deploy se connecte par clé et que sudo fonctionne, couper root + mot de passe pourrait laisser sans aucun accès si la clé est mal posée. On garde la session en cours ouverte, on teste dans un nouveau terminal, puis on durcit.
4. Que font PermitRootLogin no et PasswordAuthentication no ?
PermitRootLogin no et PasswordAuthentication no ?PermitRootLogin no interdit la connexion SSH directe en root (supprime la cible universelle des bruteforces). PasswordAuthentication no interdit la connexion par mot de passe : seules les clés sont acceptées, ce qui rend le bruteforce de mot de passe impossible. Les deux se mettent dans /etc/ssh/sshd_config, puis on redémarre le service SSH.
5. Pourquoi les permissions de ~/.ssh et authorized_keys importent-elles ?
~/.ssh et authorized_keys importent-elles ?SSH refuse d’utiliser une clé si le dossier ~/.ssh ou le fichier authorized_keys est trop permissif ou appartient au mauvais utilisateur (mesure anti-détournement). Il faut 700 sur ~/.ssh, 600 sur authorized_keys, et surtout que ces fichiers appartiennent à l’utilisateur (chown deploy:deploy). Sinon la clé est ignorée et SSH retombe sur le mot de passe.
Chapitre suivant : 5.4 — Le pare-feu (UFW) — fermer tous les ports par défaut et n’ouvrir que SSH, 80 et 443, sans se couper l’accès.