Permitir al propietario crear y leer archivos, pero no modificar o eliminar


17

Me gustaría dar permisos a un usuario para crear y leer archivos en un directorio en particular, pero no para modificar o borrar archivos. Si el usuario puede añadir a los archivos que está bien, pero yo no prefiero. Esto está en Ubuntu Linux.

Creo que esto es imposible con los permisos de archivos estándar de Unix, pero quizás esto es posible utilizando ACL? El usuario siempre se conecta a través de SFTP, por lo que si había alguna manera de controlar esto dentro de SFTP (a diferencia de los permisos del sistema operativo) que estaría bien.

Para ser absolutamente claro, quiero lo siguiente:

  • echo hello> prueba # tiene éxito, porque la prueba no existe, y se permite la creación
  • echo hello >> prueba # puede tener éxito o no, dependiendo de si se permite anexar
  • eco hello2> prueba # falla, porque la prueba ya existe, y no se permite la modificación
  • la prueba de gato # tiene éxito porque las lecturas están permitidas
  • rm test # falla, porque no está permitido borrar

Si usted se pregunta por qué quiero hacer esto, es hacer una copia de seguridad del sistema Duplicati resistente a ransomware.


1
Los archivos se crean siempre vacía. Cuando lo haga echo > test, la cáscara hace una open("test", O_WRONLY|O_CREAT|O_TRUNC)que crea el archivo y luego invoca echoque escribe el contenido para que lo modifica. Ahora podría permitir que solo la primera apertura (WR) tenga éxito.
Stéphane Chazelas

@ StéphaneChazelas - editado para aclarar que los
anexos

Respuestas:


16

Se podría utilizar bindfscomo:

$ ls -ld dir
drwxr-xr-t 2 stephane stephane 4096 Aug 12 12:28 dir/

Ese directorio es propiedad de stephane, con el grupo stephane (stephane es su único miembro). También tenga en cuenta lo tque impide que los usuarios renombren o eliminen entradas que no les pertenecen.

$ sudo bindfs -u root -p u=rwD,g=r,dg=rwx,o=rD dir dir

Nos bindfs dirsuperamos con propiedad y permisos fijos para archivos y directorios. Todos los archivos parecen ser propiedad de root(aunque debajo del directorio real todavía son propiedad de stephane).

Los directorios obtienen drwxrwxr-x root stephanepermisos mientras que otros tipos de archivos obtienen permisos -rw-r--r-- root stephane.

$ ls -ld dir
drwxrwxr-t   2 root     stephane   4096 Aug 12 12:28 dir

Ahora crear un archivo funciona porque el directorio es grabable:

$ echo test > dir/file
$ ls -ld dir/file
-rw-r--r-- 1 root stephane 5 Aug 12 12:29 dir/file

Sin embargo, no es posible hacer una segunda escritura open() en ese archivo ya que no tenemos permiso:

$ echo test > dir/file
zsh: permission denied: dir/file

(tenga en cuenta que no se permite agregar allí (como parte de sus requisitos iniciales)).

Una limitación: si bien no se puede quitar o cambiar el nombre de las entradas en la dircausa del tpoco, nuevos directorios que se crean en que no tendrá que tpoco, por lo que será capaz de cambiar el nombre o entradas de borrado allí.


¡Esto es brillante! Gracias por tomarse el tiempo para encontrar una solución tan elegante. Había oído hablar de bindfs antes, pero esta es la primera vez que he utilizado realmente.
paj28

4

La chattr +aopción permitirá añadiendo solamente. Los archivos pueden ser alterados de esa manera, pero sólo mediante la adición de (líneas es decir anexar) a ellos. No puede eliminar archivos existentes, sino crear nuevos. Esto podría satisfacer sus necesidades:

sudo chattr -R +a /dir/to/apply/to

desde man chattr

Un archivo con el `un' conjunto de atributos sólo puede estar abierto en modalidad de apertura para la escritura. Solo el superusuario o un proceso que posee la capacidad CAP_LINUX_IMMUTABLE puede establecer o borrar este atributo.

(tenga en cuenta que también se aplica a los directorios)

Así que su lista se vería así:

echo hello > test # succeeds, because test doesn't exist, and creation is allowed
echo hello2 > test # fails, because test already exists, and overwriting is not allowed
echo hello3 >> test # succeeds, because appending is allowed
cat test # succeeds, because reads are allowed
rm test # fails, because delete is not allowed

Ok, esto suena prometedor. Previene correctamente eliminaciones, y si un archivo tiene el atributo, se evita que se sobrescriban. Sin embargo, cuando se crean nuevos archivos, no obtienen automáticamente el atributo. ¿Hay alguna manera de que esto suceda automáticamente?
paj28

Si el directorio tiene el atributo, los archivos se comportarán en consecuencia a pesar de no tener el atributo establecido explícitamente. El problema son los archivos en subdirecciones nuevas. Por ejemplo dir1 es chattr +aentonces puedo crear un archivo, no se me permite quitarla, puede anexar. Si creo dir1 / dir2, entonces puedo hacer lo que quiera EN dir2
Fiximan

1
Lamentablemente no: dpaste.com/042XQ7X
paj28

Aahh, lo siento - Hice una prueba incorrecta antes
Fiximan

@ paj28 su enlace está roto :-(
mjaggard
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.