web-dev-qa-db-fra.com

Comment faire un fichier non modifiable?

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

  1. 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.

  2. 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.

37
user2141130

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.
52
jordanm

Vous pouvez:

  1. Modifiez le propriétaire du fichier en root ou un utilisateur nouveau nouvellement créé
  2. Gardez le bon groupe.
  3. Utilisation 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.

1
yo'

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.

0
Robin A. Meade