Maintenir le système
Identifier la distribution, gérer les paquets avec APT, installer un logiciel depuis un dépôt tiers.
This content is not available in your language yet.
Ce document est votre guide de mission pour la journée. Il mêle cours, TP guidés et exercices pratiques autour d’un fil rouge concret : transformer une machine Linux en serveur de lab.
Chaque mission est indépendante. Si vous maîtrisez déjà une partie, vérifiez rapidement l’existant et passez à la suivante.
Le but n’est pas de recopier des commandes : c’est de comprendre ce que vous configurez, pourquoi, et comment prouver que ça fonctionne.
Maintenir le système
Identifier la distribution, gérer les paquets avec APT, installer un logiciel depuis un dépôt tiers.
Gérer comptes et groupes
Comprendre root, créer un utilisateur et un groupe, vérifier les identités.
Maîtriser les permissions
Lire des droits, changer propriétaire et groupe, exploiter le SGID sur un répertoire partagé.
Administrer les services
Distinguer processus et service, lire les journaux, configurer et redémarrer proprement.
Rendre le serveur joignable
Configurer une IP statique, vérifier la connectivité, administrer en SSH.
Déployer les services réseau
Publier une zone DNS, distribuer l’IP en DHCP, partager un dossier via Samba.
En fin de journée, vous devez être capable de décrire ce que vous avez configuré, justifier pourquoi et prouver que cela fonctionne.
Vous reprenez un petit serveur Linux destiné à une équipe projet. L’équipe a besoin :
Votre mission : transformer cette machine en serveur de lab propre, compréhensible et administrable.
flowchart LR
NAT["Internet / NAT<br/>installation des paquets"]
SRV["srv-inf12<br/>192.168.56.10"]
CLI["cli-inf12<br/>client de test"]
NAT --- SRV
SRV --- CLI
SRV --> WEB["Nginx<br/>intranet.inf12.test"]
SRV --> SSH["OpenSSH<br/>administration distante"]
SRV --> DNS["BIND9<br/>zone inf12.test"]
SRV --> DHCP["ISC DHCP<br/>192.168.56.100 – 150"]
SRV --> SMB["Samba<br/>/srv/partage"]
| Outil | Ce qu’il fait | Commandes principales |
|---|---|---|
| APT | Installe et met à jour les logiciels | apt update, apt install, apt policy |
| systemd | Lance, arrête et supervise les services | systemctl status, systemctl restart, systemctl enable --now |
| journalctl | Lit les journaux des services | journalctl -u nginx -xe |
| OpenSSH | Administration distante chiffrée | ssh utilisateur@ip, ssh-keygen |
| Nginx | Serveur web | nginx -t, systemctl reload nginx |
| BIND9 | Serveur DNS | named-checkconf, named-checkzone, dig |
| ISC DHCP | Serveur DHCP | dhcpd -t -cf ..., systemctl restart isc-dhcp-server |
| Samba | Partage de fichiers réseau | testparm, smbpasswd -a, smbclient |
| iproute2 / ss | Diagnostic réseau | ip -br a, ip route, ss -lntp |
| Séquence | Thème | Durée |
|---|---|---|
| 0 | Mise en route et rappel de méthode | 15 min |
| 1 | Maintenance Linux et gestion des paquets | 45 min |
| 2 | Utilisateurs, groupes et mot de passe root | 45 min |
| 3 | Permissions, propriétaires, inodes | 60 min |
| 4 | Processus, signaux, journaux, serveur web | 60 min |
| 5 | Réseau local, IP statique, SSH | 45 min |
| 6 | DNS + DHCP | 90 min |
| 7 | Partage réseau avec Samba | 45 min |
| 8 | Validation finale / challenge | 15 min |
Quand vous modifiez un système, adoptez toujours ce cycle « observer → modifier → vérifier → tester » issu des bonnes pratiques d’administration système (The Practice of System and Network Administration) :
Observer l’état actuel avant toute modification.
Modifier un seul élément à la fois.
Vérifier la syntaxe si un fichier de configuration est concerné.
Redémarrer ou recharger le service proprement.
Tester côté serveur, puis tester côté client.
Lire les journaux en cas d’échec.
Pour éviter tout incident, le service DHCP doit être testé sur un réseau isolé.
srv-inf12
cli-inf12
| Élément | Valeur |
|---|---|
| Réseau de TP | 192.168.56.0/24 |
| IP du serveur sur le LAN de TP | 192.168.56.10/24 |
| Nom du serveur | srv-inf12 |
| Zone DNS | inf12.test |
| FQDN du serveur | srv-inf12.inf12.test |
| Alias web | intranet.inf12.test |
| Plage DHCP | 192.168.56.100 à 192.168.56.150 |
Gardez ces commandes sous la main pendant toute la journée :
whoami # Qui suis-je ?id # UID, GID, groupespwd # Répertoire couranthostnamectl # Nom de la machine et distributionip -br a # Interfaces et adresses IPip route # Table de routagess -lntup # Ports à l'écouteps -ef # Processus en courssystemctl status <service> # État d'un servicesudo journalctl -u <service> -xe # Journaux d'un servicels -li # Fichiers avec numéro d'inodestat <fichier> # Métadonnées détailléesAvant de rendre un service, un administrateur commence par vérifier le terrain : quelle distribution utilise-t-on ? Les index sont-ils à jour ? Les outils nécessaires sont-ils installés ?
Une distribution Linux assemble :
Sous Debian et Ubuntu, les logiciels sont installés sous forme de paquets .deb gérés par APT (Advanced Package Tool).
flowchart LR
R["Dépôts distants<br/>(serveurs de paquets)"]
I["Index local<br/>(liste des paquets<br/>disponibles)"]
S["Système<br/>(paquets installés)"]
R -- "apt update" --> I
I -- "apt install / upgrade" --> S
I -- "apt policy / show" --> Q["Informations<br/>sur un paquet"]
| Commande | Ce qu’elle fait |
|---|---|
apt update | Met à jour la liste locale des paquets disponibles |
apt upgrade | Met à jour les paquets installés |
apt full-upgrade | Mise à jour plus agressive (peut supprimer/ajouter des paquets) |
apt install <paquet> | Installe un paquet |
apt install --only-upgrade <paquet> | Met à jour un seul paquet sans en installer de nouveau |
apt remove <paquet> | Supprime un paquet |
apt purge <paquet> | Supprime un paquet et ses fichiers de configuration |
apt autoremove | Supprime les dépendances devenues inutiles |
apt show <paquet> | Affiche les détails d’un paquet |
apt policy <paquet> | Montre les versions disponibles et leur origine |
Un serveur fraîchement installé est souvent minimaliste. Un administrateur a besoin d’outils pour éditer, diagnostiquer et tester :
| Catégorie | Paquets utiles |
|---|---|
| Édition | nano, vim |
| Réseau | iproute2, dnsutils, net-tools, curl, wget |
| Compilation | build-essential |
| Diagnostic | lsof, tree, htop |
Tout n’est pas dans les dépôts officiels. Par exemple, Docker CE (Community Edition), très utilisé pour la conteneurisation, n’est pas disponible en version complète dans les dépôts Debian/Ubuntu par défaut (seule une version allégée docker.io y figure).
Pour installer la version officielle, il faut ajouter le dépôt de Docker. Voici la démarche moderne et sécurisée, à bien comprendre car elle s’applique à tout dépôt tiers :
Se demander si le dépôt tiers est vraiment nécessaire
La version docker.io des dépôts officiels est souvent en retard. Pour un usage professionnel, le dépôt Docker officiel est préférable. Mais chaque dépôt tiers augmente la surface de risque (sécurité, conflits, mise à niveau).
Installer les prérequis et récupérer la clé de signature
La clé GPG permet à APT de vérifier que les paquets proviennent bien de Docker et n’ont pas été altérés.
sudo apt install -y ca-certificates curlsudo install -m 0755 -d /etc/apt/keyringssudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg \ -o /etc/apt/keyrings/docker.ascsudo chmod a+r /etc/apt/keyrings/docker.ascDéclarer le dépôt avec signed-by
Le paramètre signed-by lie explicitement ce dépôt à sa clé de signature. C’est la méthode recommandée depuis Debian 12 / Ubuntu 22.04.
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] \ https://download.docker.com/linux/ubuntu \ $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/nullMettre à jour l’index et vérifier
sudo apt updateapt policy docker-ceVous devez voir apparaître une version candidate venant de https://download.docker.com/....
Installer le paquet
sudo apt install -y docker-ce docker-ce-cli containerd.ioIdentifier le système
cat /etc/os-releaseuname -rhostnamectlNotez le nom et la version de votre distribution.
Mettre à jour les index
sudo apt updateMettre à jour les paquets déjà installés
sudo apt upgrade -yInstaller la boîte à outils du lab
sudo apt install -y \ build-essential \ curl wget \ dnsutils \ iproute2 net-tools \ lsof tree htop \ openssh-server \ nginx \ bind9 \ isc-dhcp-server \ samba smbclientVérifier qu’un paquet est bien installé
dpkg -l | grep nginxapt policy nginxLa sortie de apt policy montre la version installée et la version candidate (disponible dans les dépôts).
btop) avec apt policy btop./etc/apt/sources.list et le répertoire /etc/apt/sources.list.d/.Vous devez pouvoir répondre à ces questions :
apt update et apt upgrade ?apt autoremove --dry-run pour voir ce qui serait nettoyé.apt et apt-get : quelles différences constatez-vous ?/etc/apt/sources.list.d/ et identifiez chaque source.Le serveur ne doit pas être utilisé uniquement avec root. On veut un compte utilisateur de travail et un groupe de projet pour gérer les accès.
Pour cette mission, vous devez déjà avoir un compte utilisateur capable d’utiliser sudo. Sur Ubuntu, le premier utilisateur créé lors de l’installation fait partie du groupe sudo par défaut. Vérifiez-le :
id# Vous devez voir "sudo" dans la liste des groupesgroupsSi votre utilisateur n’est pas dans le groupe sudo, connectez-vous en root (ou demandez à l’enseignant) pour l’ajouter :
usermod -aG sudo votre_utilisateurrootroot est le superutilisateur du système :
En pratique, on travaille avec un compte utilisateur ordinaire et on utilise sudo pour les opérations qui nécessitent des privilèges. Cela permet de :
sudo sont loguées) ;sudo, su et les différentes manières de devenir rootIl existe plusieurs façons d’obtenir des privilèges sur un système Linux. Il est essentiel de comprendre les différences :
| Commande | Ce qu’elle fait | Environnement |
|---|---|---|
sudo commande | Exécute une seule commande en tant que root | Garde l’environnement de l’utilisateur courant |
sudo -i | Ouvre un shell root interactif (login shell) | Charge l’environnement complet de root (~root, PATH de root…) |
sudo -s | Ouvre un shell root sans login | Garde le répertoire courant et une partie de l’environnement utilisateur |
su | Change d’utilisateur (par défaut root) | Garde l’environnement de l’utilisateur d’origine |
su - ou su -l | Change d’utilisateur avec login complet | Charge l’environnement complet de l’utilisateur cible |
Exemple pour observer la différence :
# Comparer les environnementswhoami # → votre_utilisateurecho $HOME # → /home/votre_utilisateur
su -c 'echo $HOME' # → /home/votre_utilisateur (ancien environnement !)su - -c 'echo $HOME' # → /root (environnement de root)
sudo -s -c 'echo $HOME' # → /home/votre_utilisateursudo -i -c 'echo $HOME' # → /rootsudo : /etc/sudoersLe fichier /etc/sudoers contrôle qui peut utiliser sudo et pour quoi. On ne le modifie jamais directement — on utilise visudo qui vérifie la syntaxe avant de sauvegarder :
sudo visudoSur Debian/Ubuntu, la ligne qui donne les droits sudo au groupe sudo est :
%sudo ALL=(ALL:ALL) ALLCela signifie : tout membre du groupe sudo peut exécuter n’importe quelle commande en tant que n’importe quel utilisateur, sur n’importe quel hôte.
| Fichier | Contenu |
|---|---|
/etc/passwd | Informations publiques : nom, UID, GID, répertoire home, shell |
/etc/shadow | Mots de passe chiffrés et politique d’expiration |
/etc/group | Groupes et leurs membres |
/etc/gshadow | Informations sensibles sur les groupes |
Vous pouvez consulter ces fichiers avec cat ou grep, mais ne les modifiez jamais à la main. Utilisez les commandes dédiées (adduser, usermod, passwd…).
adduser vs useradd| Commande | Style | Comportement |
|---|---|---|
adduser | Convivial (Debian/Ubuntu) | Crée le home, demande un mot de passe, configure le profil |
useradd | Bas niveau (toutes distributions) | Crée le compte sans interactivité, options à spécifier manuellement |
Dans ce support, on utilise adduser pour sa simplicité. Mais sachez que useradd existe : vous le croiserez dans des scripts et sur d’autres distributions.
Linux utilise ces numéros en interne pour gérer les droits. La commande id montre tout :
id stagiaire# uid=1001(stagiaire) gid=1001(stagiaire) groups=1001(stagiaire),1002(projetweb)Définir un mot de passe root
sudo passwd rootCréer le groupe du projet
sudo addgroup projetwebCréer un utilisateur de travail
sudo adduser stagiaireRépondez aux questions interactives (mot de passe, nom complet…).
Ajouter l’utilisateur au groupe du projet
sudo usermod -aG projetweb stagiaireVérifier l’identité et les appartenances
id stagiairegetent group projetwebgrep '^stagiaire:' /etc/passwdgrep '^projetweb:' /etc/groupauditeur.id auditeur.projetweb, puis vérifiez avec id auditeur.sudo et ses limites (15 min)Cet exercice montre concrètement pourquoi le moindre privilège est crucial.
Observer : qui a sudo actuellement ?
getent group sudoVotre utilisateur principal doit y apparaître. L’utilisateur stagiaire ne doit pas y être.
Constater l’échec de sudo pour stagiaire
su - stagiairesudo apt updateRésultat attendu : stagiaire is not in the sudoers file. This incident will be reported.
C’est le comportement normal et souhaité : un compte de travail n’a pas de raison d’avoir les pleins pouvoirs.
Donner temporairement sudo à stagiaire
Revenez à votre session administrateur (exit ou Ctrl+D), puis :
sudo usermod -aG sudo stagiaireReconnectez-vous en tant que stagiaire pour que le changement prenne effet :
su - stagiairesudo apt update # Fonctionne maintenantRetirer sudo pour revenir à la normale
Revenez à votre session administrateur, puis :
sudo deluser stagiaire sudoVérifiez :
id stagiaire# "sudo" ne doit plus apparaître dans les groupesExplorer les différences entre su et su -
# En tant que votre utilisateur principal :su stagiairepwd # → vous êtes toujours dans votre ancien répertoireecho $HOME # → /home/votre_utilisateur (pas celui de stagiaire !)exit
su - stagiairepwd # → /home/stagiaireecho $HOME # → /home/stagiaire (environnement correct)exitRetenez : su - charge l’environnement complet, c’est presque toujours ce que vous voulez.
Vous devez pouvoir expliquer :
usermod -aG (et pourquoi le -a est crucial) ;root.adduser vs useradd --create-home.passwd stagiaire pour changer le mot de passe.man adduser et man useradd pour voir les options disponibles.Vous devez préparer deux espaces :
/srv/intranet) ;/srv/partage).Pour bien les configurer, il faut comprendre comment Linux représente un fichier et comment les droits sont appliqués.
Sous Linux, un fichier n’est pas « juste un nom ». Voici comment ça fonctionne :
flowchart LR
DIR["Répertoire /srv/partage"]
DIR --> E1["'rapport.txt' → inode 42"]
DIR --> E2["'notes.md' → inode 87"]
E1 --> I1["Inode 42<br/>propriétaire: stagiaire<br/>groupe: projetweb<br/>permissions: rw-rw----<br/>taille: 1024 octets"]
E2 --> I2["Inode 87<br/>propriétaire: root<br/>groupe: projetweb<br/>permissions: rw-r-----<br/>taille: 256 octets"]
touch demo.txtls -li demo.txt # le premier nombre affiché est le numéro d'inodestat demo.txt # affiche toutes les métadonnées en détail| Type | Commande | Principe | Si l’original est supprimé |
|---|---|---|---|
| Lien physique (dur) | ln fichier lien | Pointe vers le même inode | Le lien reste valide |
| Lien symbolique | ln -s fichier lien | Fichier spécial contenant un chemin | Le lien devient cassé |
Exemple pour observer la différence :
echo "contenu" > original.txtln original.txt lien-dur.txtln -s original.txt lien-symbo.txtls -li original.txt lien-dur.txt lien-symbo.txtLes deux premiers fichiers partagent le même numéro d’inode. Le lien symbolique a son propre inode.
Quand vous faites ls -l, vous voyez quelque chose comme :
drwxrws--- 2 root projetweb 4096 avr 18 10:00 partageDécomposition :
d rwx rws ---│ │ │ ││ │ │ └── autres (o) : aucun droit│ │ └──────── groupe (g) : lecture + écriture + SGID│ └────────────── propriétaire (u) : lecture + écriture + traversée└─────────────────── type : répertoireflowchart TD
F["Fichier ou répertoire"]
F --> U["Propriétaire (u)"]
F --> G["Groupe (g)"]
F --> O["Autres (o)"]
U --> UR["r · w · x"]
G --> GR["r · w · x"]
O --> OR["r · w · x"]
Sur un répertoire, les lettres n’ont pas exactement le même sens que sur un fichier :
| Permission | Sur un fichier | Sur un répertoire |
|---|---|---|
r | Lire le contenu | Lister les noms des entrées |
w | Modifier le contenu | Créer, supprimer, renommer des entrées |
x | Exécuter le programme | Traverser le répertoire (y accéder) |
| Commande | Ce qu’elle fait | Exemple |
|---|---|---|
chmod | Change les permissions | chmod 2770 /srv/partage |
chown | Change propriétaire (et optionnellement groupe) | chown root:projetweb /srv/partage |
chgrp | Change uniquement le groupe | chgrp projetweb /srv/partage |
Sur un répertoire, le bit SGID (Set Group ID) est très utile pour le travail collaboratif : tous les nouveaux fichiers créés à l’intérieur héritent automatiquement du groupe du répertoire.
Sans SGID, chaque fichier créé appartient au groupe principal de l’utilisateur qui le crée — ce qui complique rapidement le partage.
# Le "2" en tête active le SGIDchmod 2770 /srv/partage| Notation | Signification |
|---|---|
2770 | SGID + rwx propriétaire + rwx groupe + rien pour les autres |
2775 | SGID + rwx propriétaire + rwx groupe + r-x pour les autres |
Créer les arborescences de travail
sudo install -d -o root -g projetweb -m 2775 /srv/intranetsudo install -d -o root -g projetweb -m 2775 /srv/intranet/publicsudo install -d -o root -g projetweb -m 2770 /srv/partageLa commande install -d crée le répertoire et applique directement propriétaire, groupe et permissions.
Créer une première page du mini site
cat <<'EOF' | sudo tee /srv/intranet/public/index.html<!doctype html><html lang="fr"><head> <meta charset="utf-8"> <title>INF12 - Intranet</title></head><body> <h1>Le mini intranet fonctionne</h1> <p>Page déposée par le groupe projetweb.</p></body></html>EOF
sudo chown root:projetweb /srv/intranet/public/index.htmlsudo chmod 664 /srv/intranet/public/index.htmlObserver les métadonnées
ls -ld /srv/intranet /srv/intranet/public /srv/partagels -li /srv/intranet/public/index.htmlstat /srv/intranet/public/index.htmlIdentifiez : le propriétaire, le groupe, les permissions, le numéro d’inode.
Tester l’héritage de groupe
sudo -u stagiaire touch /srv/partage/test-groupe.txtls -l /srv/partage/Le fichier doit appartenir au groupe projetweb (hérité grâce au SGID), pas au groupe personnel de stagiaire.
Observer les liens et les inodes
sudo -u stagiaire bash -c 'cd /srv/partage && echo "demo" > original.txt'sudo -u stagiaire bash -c 'cd /srv/partage && ln original.txt lien-dur.txt'sudo -u stagiaire bash -c 'cd /srv/partage && ln -s original.txt lien-symbo.txt'ls -li /srv/partage/original.txt /srv/partage/lien-dur.txt /srv/partage/lien-symbo.txtConstatez que original.txt et lien-dur.txt partagent le même numéro d’inode.
/srv/atelier avec des droits intentionnellement trop ouverts (chmod 777).sudo -u auditeur touch /srv/atelier/fichier-intrus.txt # ça passe !ls -l /srv/atelier/ # le fichier appartient au groupe personnel d'auditeur, pas à projetwebsudo chown root:projetweb /srv/ateliersudo chmod 2770 /srv/atelier# Un membre de projetweb peut écriresudo -u stagiaire touch /srv/atelier/ok.txtls -l /srv/atelier/ok.txt # groupe = projetweb (hérité grâce au SGID)
# Un utilisateur hors groupe est bloquésudo -u auditeur touch /srv/atelier/interdit.txt# → Permission denied2770 :
2 = SGID (héritage de groupe) ;7 = rwx pour le propriétaire ;7 = rwx pour le groupe ;0 = aucun droit pour les autres.x manquant (5 min)sudo mkdir /srv/piegesudo chmod 660 /srv/piege # lecture + écriture, mais PAS traverséels /srv/piege/ # → Permission denied !Le droit r sans x sur un répertoire est inutile : vous ne pouvez même pas y entrer. Corrigez :
sudo chmod 770 /srv/piegels /srv/piege/ # fonctionne maintenantVous devez pouvoir expliquer :
/srv/partage ;chown, chgrp et chmod.umask et observez son effet sur les permissions des fichiers créés.chmod +t) sur un répertoire et observez l’effet.Le mini intranet doit maintenant devenir un vrai service. Vous allez utiliser Nginx comme application concrète pour comprendre la différence entre un processus et un service, la notion de journal, et la logique configuration → test → reload → validation.
Un processus est une instance d’un programme en cours d’exécution. Quand vous tapez ls, le noyau crée un processus qui exécute le programme /usr/bin/ls, puis ce processus se termine dès que la commande est finie.
Chaque processus possède :
| Attribut | Signification |
|---|---|
| PID | Identifiant numérique unique du processus |
| PPID | PID du processus parent (celui qui l’a lancé) |
| UID / GID | Identité sous laquelle il s’exécute |
| État | Running, Sleeping, Stopped, Zombie… |
Tous les processus forment un arbre dont la racine est le processus PID 1 (systemd sur les systèmes modernes). Chaque processus est créé par un parent via l’appel système fork().
# Observer l'arbre des processuspstree -p | head -30ps -ef | head -20Quand un processus parent se termine avant son enfant, l’enfant devient orphelin. Le noyau le rattache automatiquement au processus PID 1 (systemd), qui devient son nouveau parent et se chargera de le nettoyer proprement quand il se terminera. C’est le mécanisme de réadoption (parfois appelé « ramasse-miettes »).
Un processus zombie est un processus qui a terminé son exécution mais dont le parent n’a pas encore lu son code de retour (via l’appel système wait()). Il ne consomme plus de CPU ni de mémoire, mais il occupe une entrée dans la table des processus. On le reconnaît à l’état Z dans ps :
ps aux | grep ' Z'# Si vous voyez des lignes avec [defunct], ce sont des zombies| Type | Cause | Dangereux ? | Résolution |
|---|---|---|---|
| Orphelin | Le parent est mort, l’enfant tourne encore | Non, PID 1 le réadopte | Automatique |
| Zombie | L’enfant est mort, le parent n’a pas fait wait() | Peu, sauf en grand nombre | Tuer le parent (pas le zombie lui-même) |
flowchart TD
subgraph "Processus classique"
P1["sleep 1000<br/>Lancé manuellement<br/>Disparaît avec le terminal"]
end
subgraph "Service systemd"
P2["nginx<br/>Lancé par systemd<br/>Redémarre automatiquement<br/>Supervisé en permanence"]
end
Un service (ou daemon) est un processus particulier :
systemd) ;journalctl.| Processus | Service | |
|---|---|---|
| Lancé par | L’utilisateur (terminal, script…) | systemd (au démarrage ou manuellement) |
| Supervisé | Non | Oui (redémarrage automatique possible) |
| Persiste après déconnexion | Non (sauf nohup ou disown) | Oui |
| Journaux centralisés | Non | Oui (journalctl) |
| Exemple | sleep 1000, vim fichier.txt | nginx, ssh, bind9 |
kill ne veut pas dire « tuer brutalement »La commande kill envoie un signal à un processus :
| Signal | Numéro | Effet |
|---|---|---|
SIGTERM | 15 | Demande polie d’arrêt — le processus peut nettoyer ses ressources |
SIGKILL | 9 | Arrêt immédiat et brutal — aucun nettoyage possible |
SIGHUP | 1 | Souvent utilisé pour demander le rechargement de la configuration |
systemctl et journalctl| Commande | Ce qu’elle fait |
|---|---|
systemctl status <service> | Affiche l’état du service |
systemctl start <service> | Démarre le service |
systemctl stop <service> | Arrête le service |
systemctl restart <service> | Arrête puis redémarre |
systemctl reload <service> | Recharge la config sans couper le service |
systemctl enable --now <service> | Active au démarrage et démarre immédiatement |
journalctl -u <service> -xe | Affiche les derniers journaux avec contexte d’erreur |
Un service web est un excellent cas d’étude car il mobilise en une seule manipulation :
curl ou un navigateur).Vérifier l’état de Nginx
systemctl status nginxss -lntp | grep ':80'Si Nginx n’est pas démarré, démarrez-le avec sudo systemctl start nginx.
Créer une configuration de site dédiée
Fichier : /etc/nginx/sites-available/intranet.conf
server { listen 80; server_name intranet.inf12.test srv-inf12.inf12.test; root /srv/intranet/public; index index.html;
location / { try_files $uri $uri/ =404; }}Créez ce fichier avec sudo nano /etc/nginx/sites-available/intranet.conf.
Activer le site et désactiver le site par défaut
sudo ln -sfn /etc/nginx/sites-available/intranet.conf /etc/nginx/sites-enabled/intranet.confsudo rm -f /etc/nginx/sites-enabled/defaultTester la configuration avant de recharger
sudo nginx -tSi la syntaxe est correcte, vous verrez syntax is ok et test is successful.
Recharger le service
sudo systemctl reload nginxsystemctl status nginxTester avec curl
curl http://127.0.0.1Vous devez voir le HTML de votre page index.html.
Observer les processus Nginx
ps -ef | grep nginxpgrep -a nginxVous verrez un processus maître (lancé par root) et un ou plusieurs processus worker (lancés par www-data).
Comprendre kill avec un processus simple
sleep 1000 &jobs -lkill %1 # SIGTERM : arrêt propre
sleep 1000 &jobs -lkill -9 %1 # SIGKILL : arrêt brutalLa différence n’est pas visible sur sleep, mais sur un vrai service, kill -9 peut corrompre des données.
Lire les journaux
sudo journalctl -u nginx -n 20 --no-pagerSimuler une erreur de configuration et lire le diagnostic
Introduisons volontairement une erreur pour voir comment nginx -t et journalctl aident au diagnostic :
# Créer une erreur de syntaxe dans la configecho "ceci_est_une_erreur;" | sudo tee -a /etc/nginx/sites-available/intranet.conf
# Tester la syntaxe — l'erreur est détectée AVANT le redémarragesudo nginx -tSortie attendue :
nginx: [emerg] unknown directive "ceci_est_une_erreur" in /etc/nginx/sites-available/intranet.conf:12nginx: configuration file /etc/nginx/nginx.conf test failedSi vous aviez redémarré sans tester d’abord, le service serait tombé. Essayons :
sudo systemctl reload nginxsystemctl status nginxLe service refuse de recharger. Regardez les journaux :
sudo journalctl -u nginx -xe --no-pagerSortie typique :
nginx[12345]: nginx: [emerg] unknown directive "ceci_est_une_erreur" in /etc/nginx/sites-available/intranet.conf:12nginx[12345]: nginx: configuration file /etc/nginx/nginx.conf test failedsystemd[1]: nginx.service: Main process exited, code=exited, status=1/FAILURELe message est clair : il donne le fichier, le numéro de ligne et la nature de l’erreur.
Corrigez en supprimant la ligne fautive :
sudo sed -i '/ceci_est_une_erreur/d' /etc/nginx/sites-available/intranet.confsudo nginx -t # doit afficher "syntax is ok"sudo systemctl reload nginxsystemctl status nginx # doit être "active (running)"Comprendre reload vs restart vs enable --now
| Commande | Ce qu’elle fait | Quand l’utiliser |
|---|---|---|
systemctl reload nginx | Relit la config sans couper le service | Après un changement de config, pour éviter une interruption |
systemctl restart nginx | Arrête puis redémarre le service | Quand un reload ne suffit pas ou après une mise à jour |
systemctl enable --now nginx | Active le service au démarrage et le démarre tout de suite | Lors de la première mise en place |
Testez :
sudo systemctl restart nginxsystemctl status nginx
# enable --now est utile pour les services pas encore activéssudo systemctl enable --now nginxsystemctl is-enabled nginx # → enabled/srv/intranet/public/status.html avec un contenu HTML simple.curl http://127.0.0.1/status.html./var/log/nginx/access.log) pour voir vos requêtes.Vous devez pouvoir :
kill -9 ne doit pas être la première solution ;curl.systemctl restart nginx et systemctl reload nginx : quelle différence ?/var/log/nginx/error.log et /var/log/nginx/access.log.Votre serveur doit maintenant être administrable depuis un client de test. Pour cela, il lui faut une adresse IP stable sur le réseau de TP et un service SSH actif.
Pour communiquer sur un réseau IP, une machine a besoin :
| Paramètre | Rôle | Exemple dans notre lab |
|---|---|---|
| Adresse IP | Identifie la machine sur le réseau | 192.168.56.10 |
| Masque / préfixe | Définit la taille du réseau | /24 (= 255.255.255.0) |
| Passerelle | Routeur vers d’autres réseaux | (pas nécessaire sur le LAN isolé) |
| Serveur DNS | Résout les noms en adresses | 192.168.56.10 (notre serveur BIND) |
ip -br a # Interfaces et adresses (format court)ip addr show # Interfaces et adresses (format détaillé)ip route # Table de routageping -c 3 IP # Test de connectivitéss -lntp # Ports TCP à l'écouteSSH permet d’administrer un serveur à distance de manière chiffrée :
scp, sftp) ;sequenceDiagram
participant C as Client (cli-inf12)
participant S as Serveur SSH (srv-inf12)
C->>S: Connexion TCP port 22
S->>C: Échange de clés (chiffrement)
C->>S: Authentification (mot de passe ou clé)
S->>C: Session shell ouverte
Identifier les interfaces réseau
Sur le serveur (srv-inf12) :
# Sur le serveur (srv-inf12)ip -br aip routeRepérez l’interface connectée au réseau de TP isolé.
Configurer l’adresse IP statique du serveur
Créez ou modifiez /etc/netplan/01-inf12.yaml :
network: version: 2 renderer: networkd ethernets: ens33: dhcp4: true ens34: dhcp4: false addresses: - 192.168.56.10/24Remplacez ens33 et ens34 par les noms réels de vos interfaces.
sudo netplan generatesudo netplan trysudo netplan applyModifiez /etc/network/interfaces :
auto loiface lo inet loopback
allow-hotplug enp0s3iface enp0s3 inet dhcp
allow-hotplug enp0s8iface enp0s8 inet static address 192.168.56.10 netmask 255.255.255.0Puis appliquez la configuration :
sudo systemctl restart networkingVérifier la configuration
Sur le serveur :
# Sur le serveur (srv-inf12)ip -br aping -c 2 192.168.56.10Activer SSH
Sur le serveur :
# Sur le serveur (srv-inf12)sudo systemctl enable --now sshsystemctl status sshss -lntp | grep ':22'Vous devez voir le port 22 à l’écoute.
Tester depuis le client
Sur le client (cli-inf12) :
# Sur le client (cli-inf12)ssh stagiaire@192.168.56.10Acceptez l’empreinte à la première connexion, puis entrez le mot de passe.
En cas de problème
Sur le serveur :
# Sur le serveur (srv-inf12)systemctl status sshsudo journalctl -u ssh -xe --no-pagerss -lntp | grep ':22'hostnamectl puis id à distance.scp :
# Sur le client (cli-inf12)echo "test SSH" > /tmp/demo.txtscp /tmp/demo.txt stagiaire@192.168.56.10:/tmp/L’installation par défaut d’OpenSSH fonctionne, mais elle n’est pas sécurisée pour un environnement de production. On va :
root directe.Avant de couper l’authentification par mot de passe, il faut avoir une clé déployée, sinon vous vous enfermez dehors.
# Sur le client (cli-inf12)ssh-keygen -t ed25519 -C "stagiaire@cli-inf12"Répondez aux questions :
~/.ssh/id_ed25519 ;Cela crée deux fichiers :
| Fichier | Rôle | À partager ? |
|---|---|---|
~/.ssh/id_ed25519 | Clé privée — votre identité | Jamais |
~/.ssh/id_ed25519.pub | Clé publique — à déployer sur les serveurs | Oui |
# Sur le client (cli-inf12)ssh-copy-id -i ~/.ssh/id_ed25519.pub stagiaire@192.168.56.10Entrez le mot de passe une dernière fois. Vérifiez que la connexion par clé fonctionne :
# Sur le client (cli-inf12)ssh stagiaire@192.168.56.10# Vous devez être connecté SANS qu'on vous demande de mot de passeSur le serveur, sauvegardez d’abord la configuration d’origine :
# Sur le serveur (srv-inf12)sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bakCréez un fichier de surcharge dédié (bonne pratique — on ne touche pas au fichier principal) :
# Sur le serveur (srv-inf12)sudo tee /etc/ssh/sshd_config.d/hardening.conf > /dev/null <<'SSH'# --- Durcissement SSH pour le lab INF12 ---
# Changer le port d'écoute (évite le bruit des scans sur le port 22)Port 2222
# Interdire la connexion root directePermitRootLogin no
# Authentification par clé uniquementPubkeyAuthentication yesPasswordAuthentication no
# Désactiver les méthodes inutilesKbdInteractiveAuthentication noUsePAM yes
# Limiter les tentativesMaxAuthTries 3MaxSessions 3
# Timeout d'inactivité (5 min)ClientAliveInterval 300ClientAliveCountMax 0
# Journalisation détailléeLogLevel VERBOSESSH| Directive | Explication |
|---|---|
Port 2222 | Écoute sur le port 2222 au lieu de 22 — réduit les scans automatiques |
PermitRootLogin no | Interdit la connexion directe en root — on passe par sudo |
PasswordAuthentication no | Plus de mot de passe — clé SSH obligatoire |
MaxAuthTries 3 | Déconnexion après 3 tentatives échouées |
ClientAliveInterval 300 | Déconnecte les sessions inactives après 5 min |
LogLevel VERBOSE | Journaux détaillés pour le diagnostic |
# Sur le serveur (srv-inf12)sudo sshd -t # Vérifier la syntaxesudo systemctl restart sshss -lntp | grep ':2222' # Le nouveau port doit apparaître# Sur le client (cli-inf12)ssh -p 2222 stagiaire@192.168.56.10# Sur le client (cli-inf12) — forcer l'authentification par mot de passessh -p 2222 -o PubkeyAuthentication=no stagiaire@192.168.56.10# → Permission denied (publickey).Si vous voyez Permission denied (publickey)., c’est que le durcissement fonctionne.
Vous devez pouvoir :
ss -lntp) ;ssh-add et le SSH agent pour éviter de retaper la passphrase.Le mini intranet fonctionne, mais le joindre par adresse IP n’est pas pratique. Vous allez :
srv-inf12.inf12.test via un serveur DNS ;intranet.inf12.test ;Le DNS associe des noms à des données. C’est l’annuaire du réseau.
| Type d’enregistrement | Rôle | Exemple |
|---|---|---|
A | Nom → adresse IPv4 | srv-inf12 → 192.168.56.10 |
CNAME | Alias vers un autre nom | intranet → srv-inf12.inf12.test. |
NS | Serveur de noms pour la zone | inf12.test. → srv-inf12.inf12.test. |
SOA | En-tête d’autorité de la zone | Numéro de série, intervalles de rafraîchissement… |
sequenceDiagram
participant C as Client
participant D as Serveur DNS (srv-inf12)
C->>D: Qui est intranet.inf12.test ?
D->>D: Zone inf12.test : intranet = CNAME → srv-inf12
D->>D: srv-inf12 = A → 192.168.56.10
D->>C: Réponse : 192.168.56.10
Le DHCP distribue automatiquement la configuration réseau aux clients :
| Paramètre distribué | Exemple |
|---|---|
| Adresse IP | 192.168.56.105 |
| Masque | 255.255.255.0 |
| Serveur DNS | 192.168.56.10 |
| Nom de domaine | inf12.test |
sequenceDiagram
participant C as Client (cli-inf12)
participant S as Serveur DHCP (srv-inf12)
C->>S: DISCOVER — « Y a-t-il un serveur DHCP ? »
S->>C: OFFER — « Voici 192.168.56.105 »
C->>S: REQUEST — « J'accepte cette adresse »
S->>C: ACK — « C'est noté, bail signé pour 600 s »
Ces deux services sont complémentaires mais font des choses très différentes :
Le DHCP peut indiquer au client quel serveur DNS utiliser — c’est exactement ce que l’on va configurer.
Après l’installation de BIND9, le répertoire /etc/bind/ contient plusieurs fichiers. Il est important de comprendre leur rôle avant d’ajouter les vôtres :
| Fichier | Rôle |
|---|---|
named.conf | Fichier principal — charge les autres fichiers de configuration |
named.conf.options | Options globales (forwarders, récursion, écoute…) |
named.conf.local | C’est ici qu’on déclare nos propres zones |
named.conf.default-zones | Zones par défaut du système (localhost, broadcast, RFC 1918…) |
db.local | Zone de résolution directe pour localhost → 127.0.0.1 |
db.127 | Zone de résolution inverse pour 127.0.0.1 → localhost |
db.0, db.255, db.empty | Zones vides pour les plages réservées (RFC 1918, etc.) |
zones.rfc1918 | Déclare les zones inverses des réseaux privés (10.x, 172.16.x, 192.168.x) |
bind.keys | Clés DNSSEC de la racine (pour la validation des signatures) |
rndc.key | Clé d’authentification pour l’outil de contrôle rndc |
# Observer l'arborescencels -l /etc/bind/cat /etc/bind/named.conf # voir la chaîne d'inclusionToutes les commandes de cette partie s’exécutent sur le serveur (srv-inf12).
Déclarer la zone DNS
Ajoutez à la fin de /etc/bind/named.conf.local :
zone "inf12.test" { type master; file "/etc/bind/db.inf12.test";};Créer le fichier de zone
Créez /etc/bind/db.inf12.test :
$TTL 86400@ IN SOA srv-inf12.inf12.test. admin.inf12.test. ( 2026041801 ; Serial 3600 ; Refresh 1800 ; Retry 604800 ; Expire 86400 ) ; Negative Cache TTL
@ IN NS srv-inf12.inf12.test.srv-inf12 IN A 192.168.56.10intranet IN CNAME srv-inf12.inf12.test.Vérifier la syntaxe avant de redémarrer
# Sur le serveur (srv-inf12)sudo named-checkconfsudo named-checkzone inf12.test /etc/bind/db.inf12.testSi tout est bon, vous verrez OK.
Redémarrer BIND et tester
# Sur le serveur (srv-inf12)sudo systemctl restart bind9systemctl status bind9Tests :
# Sur le serveur (srv-inf12)dig @127.0.0.1 srv-inf12.inf12.testdig @127.0.0.1 intranet.inf12.testVous devez obtenir 192.168.56.10 dans la section ANSWER.
Toutes les commandes de cette partie s’exécutent sur le client (cli-inf12).
Configurer le client pour utiliser notre DNS
network: version: 2 renderer: networkd ethernets: ens33: dhcp4: false addresses: - 192.168.56.20/24 nameservers: addresses: - 192.168.56.10sudo netplan applyauto enp0s8iface enp0s8 inet static address 192.168.56.20 netmask 255.255.255.0 dns-nameservers 192.168.56.10Puis appliquez :
sudo systemctl restart networkingTester la résolution et le site web
# Sur le client (cli-inf12)getent hosts srv-inf12.inf12.testgetent hosts intranet.inf12.testcurl http://intranet.inf12.testVous devez voir la page HTML du mini intranet.
Sauf mention contraire, les commandes ci-dessous s’exécutent sur le serveur (srv-inf12).
Configurer l’interface d’écoute
Fichier : /etc/default/isc-dhcp-server
INTERFACESv4="ens34"Remplacez ens34 par l’interface réellement connectée au LAN de TP.
Configurer l’étendue DHCP
Fichier : /etc/dhcp/dhcpd.conf
option domain-name "inf12.test";option domain-name-servers 192.168.56.10;default-lease-time 600;max-lease-time 7200;authoritative;
subnet 192.168.56.0 netmask 255.255.255.0 { range 192.168.56.100 192.168.56.150; option broadcast-address 192.168.56.255;}Si une passerelle existe sur votre réseau de TP, ajoutez :
option routers 192.168.56.1;Vérifier puis démarrer le service
# Sur le serveur (srv-inf12)sudo dhcpd -t -cf /etc/dhcp/dhcpd.confsudo systemctl restart isc-dhcp-serversystemctl status isc-dhcp-serverEn cas de problème :
# Sur le serveur (srv-inf12)sudo journalctl -u isc-dhcp-server -xe --no-pagerBasculer le client en DHCP
Sur le client (cli-inf12) :
network: version: 2 renderer: networkd ethernets: ens33: dhcp4: truesudo netplan applyauto enp0s8iface enp0s8 inet dhcpPuis appliquez :
sudo systemctl restart networkingVérifiez :
# Sur le client (cli-inf12)ip -br aresolvectl status 2>/dev/null || cat /etc/resolv.confValidation fonctionnelle complète
Depuis le client :
# Sur le client (cli-inf12)getent hosts intranet.inf12.testcurl http://intranet.inf12.testwww dans le fichier de zone DNS :
www IN CNAME srv-inf12.inf12.test.Serial.named-checkzone, redémarrez BIND, puis testez avec dig @127.0.0.1 www.inf12.test.cat /var/lib/dhcp/dhcpd.leasesVous devez pouvoir répondre :
A ? un CNAME ?A pour un second serveur fictif.dig @192.168.56.10 intranet.inf12.test depuis le client.L’équipe veut échanger facilement des fichiers entre le serveur et les postes clients. Vous allez partager /srv/partage via Samba, le protocole qui permet à Linux de parler le même langage de partage que Windows (SMB/CIFS).
Samba ne contourne pas les permissions Unix. Si le système de fichiers interdit l’écriture, le partage réseau ne l’autorisera pas non plus — même si la configuration Samba le permet.
flowchart LR
C["Client"] -->|"SMB/CIFS"| S["Samba<br/>vérifie l'accès Samba"]
S -->|"Accès fichier"| FS["Système de fichiers<br/>vérifie les permissions Unix"]
Les deux couches doivent autoriser l’accès pour que l’opération réussisse.
Samba maintient sa propre base de mots de passe, séparée de /etc/shadow. Pour qu’un utilisateur Linux puisse accéder aux partages :
sudo smbpasswd -a stagiaire| Fichier / commande | Rôle |
|---|---|
/etc/samba/smb.conf | Configuration principale de Samba |
testparm | Vérifie la syntaxe du fichier de configuration |
Sauf mention contraire, les commandes ci-dessous s’exécutent sur le serveur (srv-inf12).
Définir un mot de passe Samba pour stagiaire
# Sur le serveur (srv-inf12)sudo smbpasswd -a stagiaireAjouter le partage à la fin de /etc/samba/smb.conf
[partage] path = /srv/partage browseable = yes read only = no valid users = @projetweb force group = projetweb create mask = 0660 directory mask = 2770| Directive | Explication |
|---|---|
path | Répertoire partagé sur le serveur |
browseable | Visible dans la liste des partages |
read only = no | Autorise l’écriture |
valid users = @projetweb | Seuls les membres du groupe projetweb ont accès |
force group | Les fichiers créés appartiennent au groupe projetweb |
create mask | Permissions des fichiers créés via Samba |
directory mask | Permissions des répertoires créés via Samba |
Vérifier la syntaxe puis redémarrer
# Sur le serveur (srv-inf12)testparmsudo systemctl restart smbdsystemctl status smbdTester depuis le client
Sur le client (cli-inf12) :
Lister les partages disponibles :
# Sur le client (cli-inf12)smbclient -L //192.168.56.10 -U stagiaireSe connecter au partage :
# Sur le client (cli-inf12)smbclient //192.168.56.10/partage -U stagiaireCommandes utiles dans smbclient :
ls # Lister les fichiersput fichier.txt # Envoyer un fichierget fichier.txt # Télécharger un fichiermkdir dossier-test # Créer un répertoirequit # Quittersmbclient.ls -l /srv/partage/ : qui est le propriétaire ? quel est le groupe ? quelles sont les permissions ?Vous devez pouvoir :
smb.conf avec testparm ;smbclient.mount -t cifs (nécessite le paquet cifs-utils).Un poste client du réseau de TP doit pouvoir :
intranet.inf12.test (DNS) ;| Test | Commande côté client | Résultat attendu |
|---|---|---|
| DHCP | ip -br a | IP dans la plage 192.168.56.100-150 |
| DNS | getent hosts intranet.inf12.test | Résolution vers 192.168.56.10 |
| Web | curl http://intranet.inf12.test | HTML de la page d’accueil |
| SSH | ssh -p 2222 stagiaire@192.168.56.10 | Connexion ouverte (clé uniquement) |
| Samba | smbclient -L //192.168.56.10 -U stagiaire | Partage [partage] visible |
Si tous ces tests passent, votre serveur de lab est opérationnel.
sudo passwd rootsudo addgroup projetwebsudo adduser stagiairesudo usermod -aG projetweb stagiaireid stagiairegetent group projetwebls -li fichierstat fichierchmod 2770 /srv/partagechown root:projetweb /srv/partagechgrp projetweb /srv/partageps -efpgrep -a nginxsystemctl status nginxsystemctl restart nginxsudo journalctl -u nginx -xe --no-pagerip -br aip routess -lntp | grep ':2222'ssh -p 2222 stagiaire@192.168.56.10ssh srv-inf12 # si ~/.ssh/config est configurénamed-checkconfnamed-checkzone inf12.test /etc/bind/db.inf12.testdig @127.0.0.1 intranet.inf12.testdhcpd -t -cf /etc/dhcp/dhcpd.confsystemctl restart isc-dhcp-serversystemctl status isc-dhcp-serversmbpasswd -a stagiairetestparmsmbclient -L //192.168.56.10 -U stagiaireQuand quelque chose ne fonctionne pas, suivez toujours le même enchaînement :
ip -br aip routeping -c 2 192.168.56.10ss -lntupsystemctl status sshsudo journalctl -u ssh -xe --no-pagerss -lntp | grep ':2222'sudo sshd -t # vérifier la syntaxe de sshd_configsudo nginx -tsystemctl status nginxsudo journalctl -u nginx -xe --no-pagercurl http://127.0.0.1sudo named-checkconfsudo named-checkzone inf12.test /etc/bind/db.inf12.testsystemctl status bind9sudo journalctl -u bind9 -xe --no-pagerdig @127.0.0.1 intranet.inf12.testsudo dhcpd -t -cf /etc/dhcp/dhcpd.confsystemctl status isc-dhcp-serversudo journalctl -u isc-dhcp-server -xe --no-pagertestparmsystemctl status smbdsudo journalctl -u smbd -xe --no-pagersmbclient -L //192.168.56.10 -U stagiaireCes questions peuvent être posées à l’oral. Préparez-vous à y répondre :
chmod 2770 est-il utile sur un répertoire partagé ?kill -9 n’est-il pas la première solution ?Cette journée couvre le jour 6 du module INF12. Si vous voulez prolonger ou réviser d’autres thèmes du programme :
| Thème | Ressource recommandée |
|---|---|
| Vim | vimtutor fr sur votre machine, puis Vim User Manual |
| Shell, FHS, fichiers | Debian Reference |
| Démarrage système | Debian Reference — System initialization |
| Dépôts tiers | Ubuntu Server — Third party repository usage |
| Pare-feu | Ubuntu Server — Firewalls |
| LDAP | Ubuntu Server — Install OpenLDAP |
| NFS | Ubuntu Server — Network File System |
| FTP | Ubuntu Server — FTP server |
| RAID et LVM | Debian Handbook — Advanced Administration |
| BTRFS | BTRFS documentation |
| Proxy / Squid | Ubuntu Server — Install Squid |
Le fil rouge de cette journée montre qu’un administrateur Linux ne manipule jamais des notions isolées. Quand on met en place un service concret, on mobilise en même temps :
Si vous retenez une seule idée, retenez celle-ci :
Observer → Modifier → Vérifier → Tester → Lire les journaux.