¿Cuándo falla chmod?


8

¿Bajo qué circunstancias chmodfallarán?

Miré la página de manual pero solo especifica el uso y no entra en detalles sobre en qué circunstancias no funcionará.

Supongo chmodque funcionará si:

  • eres root
  • usted posee el archivo de destino (y está configurando un bit de modo mundano, es decir, no un bit fijo, otros)

¿Pueden los usuarios usar chmodpara cambiar los permisos en un archivo para el que tienen acceso grupal? ¿Está relacionado con el acceso de lectura / escritura?


2
Fallará si el inodo no se puede modificar, por ejemplo, el sistema de archivos es de solo lectura.
jordanm

Respuestas:


3

Solo el propietario del archivo, o el usuario root, puede cambiar los permisos de un archivo. Los permisos actuales en el archivo o en su directorio padre son irrelevantes¹. Esto se especifica en POSIX :

La aplicación se asegurará de que la identificación de usuario efectiva del proceso coincida con el propietario del archivo o que el proceso tenga los privilegios adecuados para hacerlo.

En la mayoría de los dispositivos, "privilegios apropiados" significa ejecutarse como root. Si no se cumplen estas condiciones, chmodgeneralmente falla EPERM, aunque se permiten otros comportamientos, como abortar el programa debido a una violación de seguridad.

Además, algunas variantes de Unix tienen formas específicas de sistema de autorizar o prohibir chmod. Por ejemplo, Linux tiene una capacidad ( CAP_FOWNER) que permite que los procesos cambien los permisos de un archivo y otros metadatos, independientemente de su propietario.

Hay otras razones por las que chmodpuede fallar aunque el archivo exista, sea accesible y tenga el propietario apropiado. Los más comunes incluyen un sistema de archivos de solo lectura o un sistema de archivos que no admite permisos como FAT. Las menos comunes incluyen restricciones específicas del sistema, como el atributo inmutable en el sistema de archivos ext2 de Linux y sucesores.

Cept Excepto en la medida en que el proceso en ejecución chmoddebe poder acceder al archivo, por lo que debe tener permiso de ejecución en el directorio que contiene el archivo y cualquier otro directorio que atraviese para hacerlo.


2

Los detalles que desea están en la página del manual para la llamada al sistema chmod (). En lugar de man chmodusar man 2 chmod. man chattry man 2 setxattrte interesará también; Los atributos de archivo que chattr / setxattr () aumentan el comportamiento de los permisos tradicionales de Unix establecidos por chmod.


Intentaré esto cuando salga del trabajo.
Wug

1

De acuerdo con el estándar UNIX, "El ID de usuario efectivo del proceso debe coincidir con el propietario del archivo o el proceso debe tener los privilegios adecuados para hacerlo".

Un poco sobre los privilegios apropiados necesita alguna explicación. En los sistemas tradicionales, chmod está permitido en todos los archivos cuando el UID efectivo (en Linux, el UID del sistema de archivos, pero ver más abajo) del proceso es 0 [es decir, root].

Linux tiene un sistema llamado capacidades , y el CAP_FOWNERbit controla la capacidad de usar chmoden todos los archivos. De manera predeterminada, todas las capacidades se otorgan cuando una execve()llamada crea un proceso raíz (ya sea ejecutando un binario setuid o cuando el UID real es 0) o cuando el UID efectivo se establece en 0 (y se elimina cuando se establece en un valor distinto de cero) , y un conjunto de capacidades que se incluyen CAP_FOWNERcuando el UID del sistema de archivos se establece en 0 (y se desactiva cuando se establece en un valor distinto de cero). Lea la página de manual para más detalles.

Usted mencionó el bit fijo, pero omitió el hecho de que los usuarios tampoco pueden establecer el bit setgid en un archivo cuando no están en el grupo asignado al archivo. El bit setuid o setgid también puede ignorarse en circunstancias adicionales definidas por la implementación.


0

¿Pueden los usuarios usar chmod para cambiar los permisos en un archivo para el que tienen acceso grupal?

¿Por qué no lo intentas y ves?

$ touch foo
$ sudo install -o root -g $(id -gn) -m660 foo bar
$ ls -la bar
-rw-rw----  1 root  staff  0 Oct 21 21:33 bar
$ chmod g-w bar
chmod: bar: Operation not permitted
$ chmod g+x bar
chmod: bar: Operation not permitted

Lo he estado buscando, pero esto está relacionado con la seguridad y no quiero perder accidentalmente un caso límite.
Wug

Si le preocupa un caso límite, puede (al menos para minimizar los riesgos) hacer lo siguiente chmody luego verificar los permisos. Si te sientes paranoico, hazlo fsyncantes de comprobarlo.
nanofarad
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.