¿Quién puede cambiar los permisos de un archivo / directorio?

14

Creo (no estoy seguro) que el propietario de un archivo / directorio y el usuario raíz son los únicos usuarios que pueden cambiar los permisos de un archivo / directorio. ¿Estoy en lo correcto o hay otros usuarios a los que también se les permite cambiar los permisos?

usuario226341
fuente

Respuestas:

19

Solo el propietario y root(superusuario) pueden cambiar el permiso de un archivo o directorio. Esto significa que el propietario y el superusuario pueden establecer los permisos read ( r), write ( w) y execute ( x). Pero solo se permite cambiar la propiedad (usuario / grupo) de archivos y directorios con los comandos chown/ .chgrproot

Rakib
fuente
19
El propietario de un archivo puede cambiar la propiedad del grupo de ese archivo si el usuario es miembro del nuevo grupo.
Kusalananda
7

Para el funcionamiento normal, solo el usuario root y el propietario pueden hacerlo chmod. Además, la raíz puede chowny chgrp, y además, el propietario puede chgrpsiempre que el propietario sea miembro del grupo objetivo.

Sin embargo, por razones de seguridad, existe otro caso: cualquier usuario con permiso de escritura en el directorio que contiene el archivo puede reemplazar el archivo con una copia y, por lo tanto, convertirse en el propietario, obteniendo la capacidad de modificar los permisos y el contenido.

Al igual que:

14:14 mybox:~ mkdir mydir
14:14 mybox:~ cd mydir/
14:14 mybox:mydir echo foo | sudo tee yourfile
foo
14:14 mybox:mydir ls -ld . yourfile 
drwxr-xr-x  3 me    staff  102 Apr 11 14:14 .
-rw-r--r--  1 root  staff    4 Apr 11 14:14 yourfile

Creamos un directorio y escribimos un archivo como root. Como root posee el archivo, no podemos escribir en él, ni podemos hacer chmod:

14:15 mybox:mydir echo bar > yourfile 
-bash: yourfile: Permission denied
14:15 mybox:mydir chmod a+x yourfile
chmod: Unable to change file mode on yourfile: Operation not permitted

Sin embargo, tenemos permiso de escritura en el directorio, por lo que podemos reemplazar el archivo para obtener la propiedad:

14:15 mybox:mydir mv yourfile yourfile2
14:15 mybox:mydir cp yourfile2 yourfile
14:15 mybox:mydir ls -ld . yourfile 
drwxr-xr-x  4 me   staff  136 Apr 11 14:15 .
-rw-r--r--  1 me   staff    4 Apr 11 14:15 yourfile

Y ahora que somos propietarios, podemos, por supuesto, hacer lo que queramos con ese archivo:

14:15 mybox:mydir echo bar > yourfile 
14:15 mybox:mydir chmod a+x yourfile
14:16 mybox:mydir cat yourfile
bar

Del mismo modo, cualquier usuario con permiso de escritura para cualquier directorio en la ruta completa que conduce al archivo puede reemplazar la estructura del directorio a partir de ese momento, obteniendo así la propiedad del archivo con el nombre dado. La propiedad o los permisos del archivo original real (que cambiamos el nombre a "yourfile2") no cambian, por supuesto.

14:17 mybox:mydir ls -l yourfile2
-rw-r--r--  1 root  staff  4 Apr 11 14:14 yourfile2
Bajo
fuente
¿Sabe si alguna distribución de Linux admite características de seguridad adicionales como Windows? Si estoy en Windows, puedo configurar el permiso de eliminación de un archivo como denegado para evitar la eliminación incluso cuando el directorio es permisivo.
Kevin Li
Muchos (¿la mayoría?) Sabores actuales de Linux admiten listas de control de acceso a nivel de archivo, ( getfacl / setfacl) que dan más flexibilidad que los permisos de archivo de estilo "clásico". La eliminación de archivos en * nix funciona eliminando el enlace al archivo del directorio, por lo que la eliminación de archivos siempre está controlada por los permisos del directorio; los permisos de archivo en sí mismos no juegan ningún papel allí.
Bajo
Muy fiel a la filosofía de Unix de "todo es un archivo". ¿Entonces estás diciendo que tal cosa no se puede hacer en Linux?
Kevin Li
3
@KevinLi Esta respuesta no es realmente completa. Puede establecer el bit fijo en un directorio para limitar la capacidad de los no propietarios de eliminar o cambiar el nombre de los archivos. Vea esta pregunta y sus respuestas: unix.stackexchange.com/questions/79395/… No es necesario usar ACL u otros esquemas.
Andrew Henle
Los sistemas de archivos @KevinLi * nix son muy diferentes de los de Windows. Los archivos existen por separado de la jerarquía de directorios, y pueden tener varios "enlaces duros" apuntando a ellos en los directorios. Eliminar un archivo en realidad significa eliminar el enlace duro, que se realiza en el directorio. El archivo realiza un seguimiento de cuántos enlaces duros apuntan a él, y el archivo real permanecerá en el disco siempre que haya al menos un enlace duro apuntando a él. Por lo tanto, su eliminación es controlada por los permisos de directorio, que hacer una opción especial para que sólo permita eliminaciones por el propietario del archivo y de la raíz, como dice Andrés.
Bajo
1

El chmodcomando invoca directamente la llamada al sistema del mismo nombre; la página del manual para la chmod(2)llamada al sistema (en Linux 4.10) dice:

El UID efectivo del proceso de llamada debe coincidir con el propietario del archivo, o el proceso debe tener privilegios (Linux: debe tener la CAP_FOWNERcapacidad).

Si el proceso de llamada no tiene privilegios (Linux: no tiene la CAP_FSETIDcapacidad), y el grupo del archivo no coincide con la ID de grupo efectiva del proceso o una de sus ID de grupo suplementarias, el S_ISGIDbit se desactivará, pero esto no hará que se devuelva un error.

Entonces, sí, un proceso que se ejecuta como root puede cambiar los permisos de cualquier archivo si no se ha eliminado la CAP_FOWNERcapacidad.


También de interés es chown; la página del manual chown(2)dice:

Solo un proceso privilegiado (Linux: uno con la CAP_CHOWNcapacidad) puede cambiar el propietario de un archivo. El propietario de un archivo puede cambiar el grupo del archivo a cualquier grupo del que ese propietario sea miembro. Un proceso privilegiado (Linux: con CAP_CHOWN) puede cambiar el grupo arbitrariamente.

Toby Speight
fuente