🐧 Administration Linux — systemd, LVM et automatisation
| Formation | BTS SIO option SISR — IRIS Mediaschool |
|---|---|
| Module | M2.2 — Services réseau et systèmes |
| Compétences | B2.2 / B2.3 |
| Durée | 3h30 |
| Prérequis | Avoir complété la Séance 1 — gestion comptes et sécurisation SSH |
📌 Introduction (10 min)
Une application web qui tourne en root et qui est compromise conduit souvent à une escalation immédiate vers un shell root. Pour limiter ce risque, systemd permet d'exécuter des services avec un utilisateur dédié (User=www-data) et des cgroups limités. Cette séance montre comment écrire des unit files corrects, gérer le stockage avec LVM (ajout, extension) et automatiser des tâches de maintenance avec cron/rsync et apt.
🎯 Objectifs de la séance
- Écrire et déployer des unités systemd (
.service) robustes (ExecStart,After,WantedBy,Restart,User) et exploiterjournalctlpour le diagnostic. - Créer un PV/VG/LV, formater et monter un LV en production, et l'agrandir en ligne avec
lvextend+resize2fs. - Utiliser apt en production (
update/upgrade, simulate install,apt-mark hold) et automatiser des sauvegardes rsync via cron.
1. systemd en profondeur (60 min)
systemd est l'init moderne qui gère les services, les sockets et les timers. Un fichier .service contient trois sections principales : [Unit] (dépendances et description), [Service] (commande à exécuter, user/group, comportement), [Install] (cibles pour enable).
Structure d'une unité .service
Exemple commenté d'une unité simple pour un service applicatif :
# /etc/systemd/system/myapp.service
[Unit]
Description=MyApp - service applicatif InnovatTech
After=network.target
Wants=mysql.service
[Service]
Type=simple
User=www-data
Group=www-data
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/python3 /opt/myapp/app.py
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
Explications des directives clés :
| Directive | Rôle |
|---|---|
After=network.target | Garantit que l'interface réseau est configurée avant le démarrage (ordonnancement, pas une dépendance stricte) |
Wants=mysql.service | Dépendance souple : tente de démarrer mysql, mais ne bloque pas si absent (contrairement à Requires=) |
User= / Group= | Exécute le processus sans privilèges root — réduction de la surface d'attaque |
Restart=always | Redémarre le service en cas d'arrêt (quelle qu'en soit la cause) |
WantedBy=multi-user.target | Active le service lors d'un démarrage en mode multi-utilisateur standard |
Commandes systemctl essentielles
# Recharger la liste d'unités après création/modification
sudo systemctl daemon-reload
# Démarrer et activer au boot
sudo systemctl enable --now myapp.service
# Statut et logs
sudo systemctl status myapp.service
sudo journalctl -u myapp.service --since today
Diagnostic avec journalctl
# Logs d'Apache depuis ce matin
sudo journalctl -u apache2 --since today
# Suivre les logs en temps réel
sudo journalctl -u myapp.service -f
# Dernières 50 lignes
sudo journalctl -u myapp.service -n 50
Ne jamais exécuter une application web en root. Utilisez User=www-data ou un utilisateur dédié avec des droits limités. Montez les volumes avec les options noexec,nodev pour les répertoires publics si possible.
2. LVM — création, montage et extension en ligne (50 min)
LVM (Logical Volume Manager) permet de gérer des volumes logiques indépendants du partitionnement physique. Il introduit trois niveaux d'abstraction :
| Objet LVM | Commande de création | Rôle |
|---|---|---|
| PV (Physical Volume) | pvcreate /dev/sdb | Initialise un disque ou une partition pour LVM |
| VG (Volume Group) | vgcreate vg-data /dev/sdb | Regroupe un ou plusieurs PV en un pool de stockage |
| LV (Logical Volume) | lvcreate -L 10G -n lv-www vg-data | Découpe le VG en volumes utilisables (point de montage) |
pvcreate efface les métadonnées du disque ciblé. Vérifiez toujours le périphérique avec lsblk avant toute opération destructive.
Vérifications préalables
# Voir les disques disponibles et partitions
lsblk -f
blkid
Création d'un LV pour /var/www sur /dev/sdb
# Initialiser le disque pour LVM (attention : détruit les données existantes)
sudo pvcreate /dev/sdb
# Créer un VG nommé vg-data
sudo vgcreate vg-data /dev/sdb
# Créer un LV de 10G nommé lv-www
sudo lvcreate -L 10G -n lv-www vg-data
# Formater en ext4
sudo mkfs.ext4 /dev/vg-data/lv-www
# Monter et ajouter au fstab
sudo mkdir -p /var/www
sudo mount /dev/vg-data/lv-www /var/www
# Vérifier
df -h /var/www
# Extrait attendu : /dev/mapper/vg-data-lv--www 9.9G ... /var/www
# Ajouter dans /etc/fstab pour montage au boot (utiliser UUID est préférable)
sudo blkid /dev/vg-data/lv-www
# Exemple fstab entry (adapter UUID) :
# /dev/mapper/vg-data-lv--www /var/www ext4 defaults 0 2
Extension en ligne (+5G)
# Agrandir le LV
sudo lvextend -L +5G /dev/vg-data/lv-www
# Redimensionner le système de fichiers ext4 (en ligne, volume monté)
sudo resize2fs /dev/vg-data/lv-www
# Vérifier l'espace
df -h /var/www
Commandes de supervision LVM
sudo pvdisplay
sudo vgdisplay
sudo lvdisplay /dev/vg-data/lv-www
Toujours tester les opérations LVM (pvcreate, lvextend) dans un environnement non critique avant d'opérer sur un serveur en production. Garder une sauvegarde avant toute manipulation de volume.
3. Gestionnaire APT (25 min)
APT est l'outil de gestion des paquets Debian/Ubuntu. En production : mettre à jour les index, tester la mise à niveau et verrouiller des paquets si nécessaire.
# Mettre à jour les listes et appliquer les mises à jour
sudo apt update && sudo apt upgrade -y
# Simuler une installation (dry-run)
sudo apt-get -s install package-name
# Lister les paquets installés
dpkg --get-selections | grep -v deinstall
# Empêcher un paquet d'être mis à jour
sudo apt-mark hold apache2
# Pour lever le hold
sudo apt-mark unhold apache2
# Inspecter les versions disponibles
apt policy apache2
Remarques sur la sécurité des dépôts :
- APT vérifie la signature GPG des index des dépôts par défaut.
- Pour les sources externes, utiliser
signed-bydans le fichier.listet importer la clé dans/etc/apt/trusted.gpg.d/.
4. cron et automatisation (20 min)
cron permet d'automatiser des tâches planifiées. Utiliser crontab -e pour des tâches utilisateur, ou /etc/cron.d/ pour des tâches système avec un champ utilisateur explicite.
Syntaxe d'une entrée cron
# ┌──── minute (0-59)
# │ ┌──── heure (0-23)
# │ │ ┌──── jour du mois (1-31)
# │ │ │ ┌──── mois (1-12)
# │ │ │ │ ┌──── jour de la semaine (0=dim, 6=sam)
# │ │ │ │ │
# * * * * * utilisateur commande
# Éditer la crontab root
sudo crontab -e
# Exemple : sauvegarde hebdomadaire dimanche 02:00
0 2 * * 0 /usr/local/bin/backup_www.sh
# Fichier système /etc/cron.d/rsync-backup
0 2 * * 0 root /usr/local/bin/backup_www.sh
# Les scripts dans /etc/cron.daily/ sont lancés quotidiennement par run-parts
ls -l /etc/cron.daily/
Les scripts appelés par cron doivent être exécutables (chmod +x) et utiliser des chemins absolus (le PATH de cron est minimal). Toujours rediriger les logs vers /var/log/ pour l'audit.
5. rsync — sauvegarde distante et options utiles (15 min)
rsync est l'outil de synchronisation recommandé pour les sauvegardes incrémentales. Il transfère uniquement les différences, ce qui le rend très efficace.
| Option rsync | Rôle |
|---|---|
-a | Mode archive : préserve permissions, timestamps, liens symboliques, propriétaires |
-v | Verbeux : affiche les fichiers transférés |
-z | Compresse les données pendant le transfert |
--delete | Supprime côté destination les fichiers absents de la source |
--exclude | Exclut un dossier ou un motif du transfert |
-e 'ssh -p 2222' | Utilise SSH sur un port personnalisé |
# Sauvegarde distante via SSH (le / final sur /var/www/ est important !)
rsync -avz --delete /var/www/ backup@nas01:/backups/www/
# Exclure des dossiers
rsync -avz --delete --exclude 'cache/' --exclude 'node_modules/' /var/www/ backup@nas01:/backups/www/
# Utiliser un port SSH personnalisé
rsync -avz -e 'ssh -p 2222' /var/www/ backup@nas01:/backups/www/
Script de sauvegarde minimal
# /usr/local/bin/backup_www.sh (exemple minimal)
cat <<'EOF' | sudo tee /usr/local/bin/backup_www.sh
#!/bin/bash
set -euo pipefail
LOG=/var/log/backup_www.log
rsync -avz --delete --exclude 'cache/' /var/www/ backup@nas01:/backups/www/ >> "$LOG" 2>&1
EOF
sudo chmod +x /usr/local/bin/backup_www.sh
Puis planifier via cron (voir section précédente).
🔧 Travaux Pratiques (80 min)
Contexte
Vous êtes technicien chez InnovatTech. Le serveur debian-srv01 doit héberger /var/www sur un LV dédié, Apache doit servir depuis ce volume, un script de sauvegarde rsync doit envoyer les données vers nas01, et un service applicatif custom doit être géré via systemd.
Objectifs
- Créer un LV dédié pour
/var/www, y installer Apache et monter au boot. - Écrire un script de sauvegarde rsync et l'automatiser via cron (ou
/etc/cron.d/). - Écrire et activer une unit systemd pour un service applicatif run as
www-data.
Prérequis techniques
- Accès administrateur sur
debian-srv01 - Disque libre
/dev/sdbpour LVM ou une partition dédiée - Accès SSH vers
nas01avec clé publique autorisée pour l'utilisateurbackup
Étape 1 — Créer le PV, VG et LV
# Vérifier le disque cible
lsblk /dev/sdb
sudo pvcreate /dev/sdb
sudo vgcreate vg-data /dev/sdb
sudo lvcreate -L 15G -n lv-www vg-data
sudo mkfs.ext4 /dev/vg-data/lv-www
sudo mkdir -p /var/www
sudo mount /dev/vg-data/lv-www /var/www
sudo chown -R www-data:www-data /var/www
# Ajouter au fstab via UUID (plus robuste qu'un nom de périphérique)
UUID=$(blkid -s UUID -o value /dev/vg-data/lv-www)
echo "UUID=$UUID /var/www ext4 defaults 0 2" | sudo tee -a /etc/fstab
Étape 2 — Installer Apache et pointer vers /var/www
sudo apt update && sudo apt install -y apache2
# Adapter DocumentRoot
sudo sed -i 's#/var/www/html#/var/www#g' /etc/apache2/sites-available/000-default.conf
sudo systemctl restart apache2
sudo systemctl enable apache2
# Vérifier
sudo systemctl status apache2
Étape 3 — Script de sauvegarde rsync et tâche cron
# Générer une clé SSH pour root et la copier sur nas01
sudo -u root ssh-keygen -t ed25519 -f /root/.ssh/id_ed25519 -N '' -C "backup@debian-srv01"
ssh-copy-id -i /root/.ssh/id_ed25519.pub backup@nas01
# Créer le script
sudo tee /usr/local/bin/backup_www.sh > /dev/null <<'EOF'
#!/bin/bash
set -e
LOG=/var/log/backup_www.log
DATE=$(date -I)
/usr/bin/rsync -avz --delete --exclude 'cache/' /var/www/ backup@nas01:/backups/www/ >> "$LOG" 2>&1
EOF
sudo chmod +x /usr/local/bin/backup_www.sh
# Planifier via /etc/cron.d
sudo tee /etc/cron.d/rsync-backup > /dev/null <<'EOF'
0 2 * * 0 root /usr/local/bin/backup_www.sh
EOF
# Vérifier
ls -l /etc/cron.d/rsync-backup
Étape 4 — Unit systemd pour un service applicatif custom
sudo mkdir -p /opt/myapp
sudo tee /opt/myapp/runner.sh > /dev/null <<'EOF'
#!/bin/bash
cd /opt/myapp
exec /usr/bin/python3 -u app.py
EOF
sudo chmod +x /opt/myapp/runner.sh
sudo chown -R www-data:www-data /opt/myapp
# Unit file
sudo tee /etc/systemd/system/myapp.service > /dev/null <<'EOF'
[Unit]
Description=MyApp service InnovatTech
After=network.target
[Service]
Type=simple
User=www-data
Group=www-data
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/runner.sh
Restart=on-failure
RestartSec=5s
[Install]
WantedBy=multi-user.target
EOF
# Activer le service
sudo systemctl daemon-reload
sudo systemctl enable --now myapp.service
sudo systemctl status myapp.service
sudo journalctl -u myapp.service --since "5 minutes ago"
Livrable attendu
- Sortie de
lsblk/df -hmontrant/var/wwwmonté sur/dev/vg-data/lv-www - Configuration Apache adaptée (
000-default.conf) - Script
/usr/local/bin/backup_www.shet fichier/etc/cron.d/rsync-backup - Unit file
/etc/systemd/system/myapp.serviceet sortie desystemctl status myapp
Critères de réussite
- ☐
/var/wwwest monté depuis un LV et persistant au reboot (entrée fstab ou UUID). - ☐ Apache sert les fichiers depuis
/var/wwwet démarre automatiquement. - ☐ La sauvegarde rsync s'exécute (simulation manuelle + vérification de
/var/log/backup_www.log). - ☐ L'application custom est gérée par systemd et redémarre automatiquement en cas de crash.
✅ Synthèse (10 min)
Cette séance a montré la complémentarité des outils : systemd pour la gestion et la supervision des services, LVM pour la flexibilité du stockage, apt pour maintenir le système à jour, et cron/rsync pour l'automatisation des sauvegardes. La règle de sécurité est récurrente : limiter les privilèges d'exécution (User=www-data) et automatiser la supervision.
En une phrase, expliquez pourquoi User=www-data dans une unit systemd réduit la portée d'une compromission d'application.
📝 QCM — Testez vos connaissances
- Dans une unit systemd, que garantit la directive
After=network.target? - Quelle commande LVM initialise un disque physique pour être utilisé dans un Volume Group ?
- Comment empêcher qu'un paquet (ex :
apache2) soit mis à jour lors d'unapt upgrade? - Quelle expression cron planifie une tâche tous les dimanches à 02h00 du matin ?
- Que fait l'option
--deletedans une commandersync?
📝 Afficher les corrections
After=network.targetgarantit l'ordonnancement — systemd démarrera l'unité seulement après que la cible réseau soit atteinte. Ce n'est pas une dépendance stricte (le service ne plante pas si network.target échoue) mais une garantie d'ordre de démarrage.sudo pvcreate /dev/sdb—pvcreateinitialise un disque ou une partition pour LVM en y écrivant les métadonnées LVM. Attention : cette opération détruit les données existantes sur le périphérique ciblé.sudo apt-mark hold apache2— Cette commande marque le paquet comme "en attente", ce qui empêche apt de le mettre à jour. Pour lever le verrou :sudo apt-mark unhold apache2.0 2 * * 0— Lecture : minute 0, heure 2, tous les jours du mois (*), tous les mois (*), jour de la semaine 0 (dimanche). Cette syntaxe est valide dans crontab et dans les fichiers/etc/cron.d/.--deletesupprime côté destination les fichiers absents de la source — Cela rend la destination une copie miroir exacte de la source. Utile pour les sauvegardes synchronisées, mais dangereux si mal utilisé (perte de données côté destination). À toujours utiliser avec précaution.
systemd, LVM, apt et cron/rsync sont les quatre piliers de l'administration Linux en production. Exécuter les services avec des utilisateurs dédiés (non root), gérer le stockage de façon flexible avec LVM, maintenir les paquets à jour et automatiser les sauvegardes sont des pratiques indispensables pour tout technicien SISR.
