Come posso rendere un file NON modificabile?


35

Durante l'accesso, posso fare quanto segue:

mkdir foo
touch foo/bar
chmod 400 foo/bar 
chmod 500 foo

Quindi posso aprire vim (non come root), modificare bar, forzare una scrittura w!e il file viene modificato.

Come posso fare in modo che il sistema operativo non accetti modifiche ai file?

AGGIORNAMENTO 02 Mar 2017

  1. chmod 500 fooè un'aringa rossa: l'autorizzazione di scrittura su una directory non ha nulla a che fare con la possibilità di modificare il contenuto di un file - solo la possibilità di creare ed eliminare file.

  2. chmod 400 foo/barimpedisce infatti di modificare il contenuto del file. Tuttavia , ciò non impedisce la modifica delle autorizzazioni di un file: il proprietario di un file può sempre modificare le autorizzazioni del suo file (supponendo che possano accedere al file, ovvero eseguire le autorizzazioni su tutte le directory degli antenati). In effetti, strace (1) rivela che questo è ciò che sta facendo vim (7.4.576 Debian Jessie) - vim chiama chmod (2) per aggiungere temporaneamente il permesso di scrittura per il proprietario del file, modifica il file e quindi chiama chmod ( 2) di nuovo per rimuovere il permesso di scrittura. Questo è il motivo per cui usando chattr +iworks - solo root può chiamare chattr -i. Teoricamente, vim (o qualsiasi altro programma) potrebbe fare la stessa cosa con chattr come fa con chmod su un file immutabile se eseguito come root.


3
Credo che sotto il cofano, in vimrealtà stia cambiando le autorizzazioni e poi rimettendolo.
Giordania,

Stai non esegue come root?
Alvin Wong,

Alvin, lo faccio come utente non root. Ho modificato il post per chiarire.
user2141130

Risposte:


49

È possibile impostare l'attributo "immutabile" con la maggior parte dei filesystem in Linux.

chattr +i foo/bar

Per rimuovere l'attributo immutabile, utilizzare -invece di +:

chattr -i foo/bar

Per vedere gli attributi correnti di un file, puoi usare lsattr:

lsattr foo/bar

La manpage chattr (1) fornisce una descrizione di tutti gli attributi disponibili. Ecco la descrizione per 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.

3
Su Linux, quel flag immutabile è disponibile su molti file system non solo ext2 / 3/4 (almeno btrfs, hfsplus, jfs, nilfs2, xfs, ocfs2, ubifs, gfs2, reiserfs AFAICT da una rapida occhiata al codice)
Stéphane Chazelas

@StephaneChazelas Ho visto che il chattrcomando faceva parte del e2fsprogspacchetto sul mio sistema. Ecco perché ho fatto questa affermazione. Ho aggiornato la risposta in base al tuo commento.
Giordania,

Non funziona per i collegamenti simbolici :-(. Questa soluzione sarebbe ottima, perché voglio evitare che il collegamento simbolico possa essere accidentalmente modificato da qualsiasi utente, incluso root.
natenho,

Immutabile è un flag di inode corretto, non un xattr? bandiera ioctl per essere precisi?
ytpillai,

1

Puoi:

  1. Cambia il proprietario del file in rooto un utente fittizio appena creato
  2. Mantieni il gruppo corretto.
  3. Utilizzare chmod 440per consentire la lettura per gruppo (che sei tu).

Se l'utente corretto non è l'unico in questo gruppo, è necessario creare un nuovo gruppo e aggiungervi solo lui e utilizzarlo per questo. Tuttavia, non sei il proprietario del file, pertanto vinon puoi modificare il proprietario del file.


3
Se riesci a scrivere nella directory principale, vim può eliminare il file e crearne uno nuovo (ed è quello che fa quando lo fai :w!). vim non si spinge fino a cambiare temporaneamente le autorizzazioni della directory. Quindi mantenere la directory non scrivibile dovrebbe essere sicuro.
Stéphane Chazelas

0

Per rendere un intero albero di directory di sola lettura:

cd <directory>
find ./ -print0 | sudo xargs -I {} -0 chattr +i {}

Per renderlo nuovamente leggibile, passare +ia -i.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.