Bien que connecté, je peux faire ce qui suit:
mkdir foo
touch foo/bar
chmod 400 foo/bar
chmod 500 foo
Ensuite, je peux ouvrir Vim (pas comme root
), éditer bar
, forcer une écriture avec w!
, et le fichier est modifié.
Comment puis-je rendre le système d'exploitation interdire toute modification de fichier?
(( mise à jour mars 02 2017
chmod 500 foo
est un hareng rouge: l'autorisation d'écriture sur un répertoire n'a rien à voir avec la possibilité de modifier le contenu d'un fichier - seule la possibilité de créer et de supprimer des fichiers.
chmod 400 foo/bar
empêche en fait que le contenu du fichier d'être modifié. mais, c'est non Empêcher les autorisations d'un fichier d'être modifiées - le propriétaire d'un fichier peut toujours modifier les autorisations de son fichier (en supposant qu'elles puissent accéder au fichier, c'est-à-dire l'autorisation d'exécution sur tous les ancêtres répertoires). En fait, Strace (1) révèle que c'est ce que Vim (7.4.576 Debian Jessie) fait - Vim appelle Chmod (2) pour ajouter temporairement l'autorisation d'écriture pour le propriétaire du fichier, modifie le fichier, puis appelle chmod ( 2) Encore une fois pour enlever l'autorisation d'écriture. C'est pourquoi en utilisant chattr +i
travaux - seule la racine peut appeler chattr -i
. Théoriquement, VIM (ou tout programme) pourrait faire la même chose avec Chattr car il le fait avec CHMOD sur un fichier immuable si elle est courante en tant que root.
Vous pouvez définir l'attribut "immuable" avec la plupart des systèmes de fichiers sous Linux.
chattr +i foo/bar
Pour supprimer l'attribut immuable, vous utilisez -
à la place de +
:
chattr -i foo/bar
Pour voir les attributs actuels d'un fichier, vous pouvez utiliser lsattr:
lsattr foo/bar
Le CHATTR (1) Manpage fournit une description de tous les attributs disponibles. Voici la description de i
:
A file with the `i' attribute cannot be modified: it cannot be deleted
or renamed, no link can be created to this file and no data can be
written to the file. Only the superuser or a process possessing the
CAP_LINUX_IMMUTABLE capability can set or clear this attribute.
Vous pouvez:
root
ou un utilisateur nouveau nouvellement crééchmod 440
Pour permettre la lecture par groupe (qui est vous).Si l'utilisateur correct n'est pas le seul de ce groupe, vous devez créer un nouveau groupe et l'ajouter uniquement à celui-ci et utiliser ce groupe pour cela. Cependant, vous n'êtes pas le propriétaire du fichier, donc votre vi
ne peut pas modifier le propriétaire du fichier.
Pour créer un arbre de répertoire entier en lecture seule:
cd <directory>
find ./ -print0 | Sudo xargs -I {} -0 chattr +i {}
Pour le rendre lisible à nouveau, changez +i
à -i
.