🐧 Administration Linux — systemd, LVM et automatisation

C2.2.1 — Séance 2 Bloc B2 Module M2.2 BTS SIO SISR
FormationBTS SIO option SISR — IRIS Mediaschool
ModuleM2.2 — Services réseau et systèmes
CompétencesB2.2 / B2.3
Durée3h30
PrérequisAvoir 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 exploiter journalctl pour 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 :

DirectiveRôle
After=network.targetGarantit que l'interface réseau est configurée avant le démarrage (ordonnancement, pas une dépendance stricte)
Wants=mysql.serviceDé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=alwaysRedémarre le service en cas d'arrêt (quelle qu'en soit la cause)
WantedBy=multi-user.targetActive 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
💡 Bonne pratique sécurité

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 LVMCommande de créationRôle
PV (Physical Volume)pvcreate /dev/sdbInitialise un disque ou une partition pour LVM
VG (Volume Group)vgcreate vg-data /dev/sdbRegroupe un ou plusieurs PV en un pool de stockage
LV (Logical Volume)lvcreate -L 10G -n lv-www vg-dataDécoupe le VG en volumes utilisables (point de montage)
⚠️ Attention

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
💡 Production

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-by dans le fichier .list et 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/
⚠️ Exigences

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 rsyncRôle
-aMode archive : préserve permissions, timestamps, liens symboliques, propriétaires
-vVerbeux : affiche les fichiers transférés
-zCompresse les données pendant le transfert
--deleteSupprime côté destination les fichiers absents de la source
--excludeExclut 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/sdb pour LVM ou une partition dédiée
  • Accès SSH vers nas01 avec clé publique autorisée pour l'utilisateur backup

É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 -h montrant /var/www monté sur /dev/vg-data/lv-www
  • Configuration Apache adaptée (000-default.conf)
  • Script /usr/local/bin/backup_www.sh et fichier /etc/cron.d/rsync-backup
  • Unit file /etc/systemd/system/myapp.service et sortie de systemctl status myapp

Critères de réussite

  • /var/www est monté depuis un LV et persistant au reboot (entrée fstab ou UUID).
  • ☐ Apache sert les fichiers depuis /var/www et 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.

❓ Question de vérification

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

  1. Dans une unit systemd, que garantit la directive After=network.target ?
  2. Quelle commande LVM initialise un disque physique pour être utilisé dans un Volume Group ?
  3. Comment empêcher qu'un paquet (ex : apache2) soit mis à jour lors d'un apt upgrade ?
  4. Quelle expression cron planifie une tâche tous les dimanches à 02h00 du matin ?
  5. Que fait l'option --delete dans une commande rsync ?
📝 Afficher les corrections
  1. After=network.target garantit 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.
  2. sudo pvcreate /dev/sdbpvcreate initialise 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é.
  3. 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.
  4. 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/.
  5. --delete supprime 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.
💡 À retenir

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.

← C2.2.1 Séance 1 — Comptes, permissions et SSH C2.2.2 Séance 1 — Active Directory déploiement →