Je suis Charlie

Autres trucs

Accueil

Seulement les RFC

Seulement les fiches de lecture

Mon livre « Cyberstructure »

Ève

Faire un lien symbolique immuable sur Linux

Première rédaction de cet article le 9 septembre 2026


Hier, j'ai cherché à faire un lien symbolique « immuable » sur Linux, plus exactement un lien que son ou sa propriétaire ne risquerait pas de supprimer par accident, tout en lui permettant de créer et détruire d'autres objets dans ce répertoire. Si vous connaissez Linux, vous allez probablement crier « chattr +i, chattr +i ! ». Mais, non, cela ne marche pas.

Essayons quand même, sur le compte d'un utilisateur nommé Bob. D'abord avec un fichier ordinaire :

$ echo "Contenu sans intérêt" > myfile

$ sudo chattr +i myfile

$ ls -l myfile 
-rw-rw-r-- 1 bob bob 23 Sep  9 15:12 myfile
$ lsattr myfile 
----i---------e------- myfile

$ rm myfile 
rm: cannot remove 'myfile': Operation not permitted
  

Parfait, tout marche (une alternative à sudo aurait été la capacité CAP_LINUX_IMMUTABLE mais c'est une autre histoire). Essayons maintenant avec un lien symbolique :

$ ln -s /etc/motd mylink

$ sudo chattr +i mylink 
chattr: Operation not supported while reading flags on mylink
  

Bon, c'est raté, chattr ne marche pas sur les liens symboliques. (Le message exact dépend de votre libc ; vous aurez peut-être plutôt « Symbolic link loop ».) En tout cas, ça ne marche pas sur Linux. (Il parait que cela fonctionne sur FreeBSD.)

Comment faire, alors ? Changer le propriétaire du lien ne change rien car la suppression est une opération sur le répertoire. Le propriétaire du répertoire peut supprimer des fichiers qui ne lui appartiennent pas. Et changer le propriétaire du répertoire ne suffit pas, car on veut que Bob puisse continuer à lire et à écrire dans ce répertoire. Le sticky bit seul ne suffirait pas non plus, il empêche de supprimer les fichiers des autres, pas les siens.

ChatGPT a finalement trouvé une solution, mais à la troisième itération, après quelques idées qui ne marchaient pas (ChatGPT, comme tout utilisateur des réseaux sociaux, ne teste pas ses idées avant de les publier ; « You're right », « Yes. Your suspicion is exactly correct ») :

$ ln -s /etc/motd mylink
$ sudo chown root:bob .
$ sudo chmod +t .
$ sudo chmod g+w .
$ sudo chown --no-dereference root:root mylink

$ rm mylink 
rm: cannot remove 'mylink': Operation not permitted

$ ls -alt                                
total 8
drwxrwxr-t 2 root bob  4096 Sep  9 15:26 .
lrwxrwxrwx 1 root root    9 Sep  9 15:26 mylink -> /etc/motd
drwxr-x--- 3 bob  bob  4096 Sep  9 15:25 ..
  

Détaillons cette solution. On met root comme propriétaire du répertoire (on peut aussi utiliser un autre utilisateur que root) mais le groupe est bob, un groupe qui inclut Bob. On met ensuite le sticky bit. On donne au groupe le droit d'écriture dans le répertoire. Et enfin on change le propriétaire du lien pour que cela ne soit pas Bob (notez le --no-dereference sans lequel chown essaierait de changer la cible du lien et pas le lien). Et Bob ne peut plus supprimer le lien, tout en pouvant lire et écrire dans le répertoire.

Version PDF de cette page (mais vous pouvez aussi imprimer depuis votre navigateur, il y a une feuille de style prévue pour cela)

Source XML de cette page (cette page est distribuée sous les termes de la licence GFDL)