¿Cómo hago que un archivo NO sea modificable?

35

Mientras estoy conectado, puedo hacer lo siguiente:

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

Entonces puedo abrir vim (no como root), editar bar, forzar una escritura w!y el archivo se modifica.

¿Cómo puedo hacer que el sistema operativo no permita ninguna modificación de archivo?

ACTUALIZACIÓN 02 de marzo de 2017

  1. chmod 500 fooes una pista falsa: el permiso de escritura en un directorio no tiene nada que ver con la capacidad de modificar el contenido de un archivo, solo la capacidad de crear y eliminar archivos.

  2. chmod 400 foo/barde hecho evita que se modifique el contenido del archivo. Sin embargo , esto no prevenir los permisos de fichero de ser cambiado - el propietario de un archivo siempre puede cambiar los permisos de su archivo (asumiendo que puedan acceder al archivo es decir, permiso de ejecución en todos los directorios de los antepasados). De hecho, strace (1) revela que esto es lo que está haciendo vim (7.4.576 Debian Jessie): vim llama a chmod (2) para agregar temporalmente el permiso de escritura para el propietario del archivo, modifica el archivo y luego llama a chmod ( 2) nuevamente para eliminar el permiso de escritura. Es por eso que usando chattr +iWorks, solo root puede llamar chattr -i. Teóricamente, vim (o cualquier programa) podría hacer lo mismo con chattr que con chmod en un archivo inmutable si se ejecuta como root.

usuario2141130
fuente
3
Creo que debajo del capó, en vimrealidad está cambiando los permisos y luego volviéndolo a poner.
jordanm
¿ No estás corriendo como root?
Alvin Wong
Alvin, hago esto como usuario no root. He editado la publicación para aclarar.
user2141130

Respuestas:

49

Puede establecer el atributo "inmutable" con la mayoría de los sistemas de archivos en Linux.

chattr +i foo/bar

Para eliminar el atributo inmutable, utilice en -lugar de +:

chattr -i foo/bar

Para ver los atributos actuales de un archivo, puede usar lsattr:

lsattr foo/bar

La página de manual chattr (1) proporciona una descripción de todos los atributos disponibles. Aquí está la descripción 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.
jordanm
fuente
3
En Linux, ese indicador inmutable está disponible en muchos sistemas de archivos, no solo ext2 / 3/4 (al menos btrfs, hfsplus, jfs, nilfs2, xfs, ocfs2, ubifs, gfs2, reiserfs AFAICT de un vistazo rápido a través del código)
Stéphane Chazelas
@StephaneChazelas Vi que el chattrcomando era parte del e2fsprogspaquete en mi sistema. Por eso hice esa declaración. He actualizado la respuesta basada en tu comentario.
jordanm
No funciona para enlaces simbólicos :-(. Esta solución sería excelente, porque quiero evitar que el enlace simbólico pueda ser modificado accidentalmente por cualquier usuario, incluido el root.
natenho
¿Inmutable es correcto un indicador de inodo, no un xattr? ioctl bandera para ser precisos?
ytpillai
1

Usted puede:

  1. Cambie el propietario del archivo a rootun usuario ficticio recién creado
  2. Mantener el grupo correcto.
  3. Use chmod 440para permitir la lectura por grupo (que es usted).

Si el usuario correcto no es el único en este grupo, debe crear un nuevo grupo y agregarlo solo a él, y usar este grupo para ello. Sin embargo, usted no es el propietario del archivo, por lo tanto, vino puede cambiar el propietario del archivo.

yo'
fuente
3
Si puede escribir en el directorio principal, entonces vim puede eliminar el archivo y crear uno nuevo (y es lo que hace cuando lo hace :w!). Sin embargo, vim no llega tan lejos como para cambiar temporalmente los permisos del directorio. Por lo tanto, mantener el directorio no escribible debería ser seguro.
Stéphane Chazelas
0

Para hacer un árbol de directorios completo de solo lectura:

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

Para hacerlo legible nuevamente, cambie +ia -i.

Robin A. Meade
fuente