← retour aux snippets

chattr: protéger des fichiers en immutable

Empêcher toute modification/suppression avec chattr +i/+a: configs critiques, logs, répertoires sensibles.

objectif

Protéger des fichiers ou dossiers critiques contre les modifications accidentelles ou malveillantes via les attributs immutables (+i) et append-only (+a). Idéal pour des configs des journaux.

code minimal

# rendre un fichier de config intouchable (édition/suppression/interdite)
sudo chattr +i /etc/nginx/sites-available/data.pm.conf
# vérifier l'attribut
lsattr /etc/nginx/sites-available/data.pm.conf

utilisation

# 1) protéger des configs critiques (nginx, systemd service)
sudo chattr +i /etc/nginx/nginx.conf
sudo chattr +i /etc/systemd/system/data-pm-api.service
lsattr /etc/nginx/nginx.conf /etc/systemd/system/data-pm-api.service

# 2) empêcher l'édition directe du site en prod: protéger le symlink "current"
# (le déploiement se fait via bascule atomique, pas via édits dans current)
sudo chattr +i /srv/data.pm/current
ls -l /srv/data.pm/current && lsattr /srv/data.pm/current

# 3) append-only (+a) pour un log d'audit: on ne peut qu'ajouter
sudo touch /var/log/data.pm/audit.log
sudo chattr +a /var/log/data.pm/audit.log
lsattr /var/log/data.pm/audit.log
# écriture ok; suppression/troncature échouent même pour root (sans retirer +a)

# 4) retirer temporairement l'attribut pour éditer/mettre à jour
sudo chattr -i /etc/nginx/nginx.conf
sudo vim /etc/nginx/nginx.conf
sudo chattr +i /etc/nginx/nginx.conf

# 5) déploiement data.pm en gardant le symlink protégé
# - déprotéger juste le temps de la bascule, puis reprotéger
NEW="/srv/data.pm/releases/2025-08-15_1200"
sudo chattr -i /srv/data.pm/current
sudo ln -sfn "$NEW" /srv/data.pm/current
sudo chattr +i /srv/data.pm/current

variante(s) utile(s)

# protéger un dossier entier (empêche création/suppression/modification dans l'arbre)
# attention: +i sur un dossier bloque toute modification de contenu
sudo chattr +i /etc/data.pm
lsattr -d /etc/data.pm

# append-only sur un dossier (on peut créer des fichiers, mais pas supprimer/renommer existants)
# utile pour répertoires d'archives immuables
sudo chattr +a /srv/archives/data.pm
lsattr -d /srv/archives/data.pm

# liste récursive des fichiers portant +i ou +a
sudo find / -xdev -type f -exec lsattr {} + 2>/dev/null | grep -E '\bi|\ba' | head

# sécuriser un .env critique (édition contrôlée via écriture atomique)
sudo chattr +i /srv/api.data.pm/.env
# pour mise à jour: sudo chattr -i ..., écriture atomique, puis sudo chattr +i ...

# automatiser la (dé)protection d'un fichier autour d'une commande
protect_edit() {
  local f="$1"; shift
  sudo chattr -i "$f"
  "$@"
  local rc=$?
  sudo chattr +i "$f"
  return $rc
}
# ex: protect_edit /etc/nginx/nginx.conf sudo nginx -t && sudo systemctl reload nginx

notes

  • +i (immutable): interdit modification, renommage, suppression et lien; +a (append-only): autorise seulement l’ajout en fin (pas de troncature/renommage).
  • support dépend du filesystem (ext2/3/4, btrfs, xfs récents). Vérifiez avec chattr/lsattr; sinon, l’attribut peut être ignoré.
  • utilisez +i sur des fichiers et symlinks critiques (ex: /srv/data.pm/current) pour éviter les edits directs; effectuez les déploiements par bascule contrôlée.
  • attention aux rotations de logs: un fichier +a ne peut pas être renommé/tronqué. Adaptez logrotate (ou retirez +a le temps de la rotation).
  • ces protections ne remplacent pas des permissions/ACL correctes ni un contrôle d’accès; elles ajoutent une barrière supplémentaire contre les erreurs et l’altération.