La especificación POSIX para la chown
utilidad.menciona en surazón fundamentalsecciónsobre la chown user:group
sintaxis (anteriormente chown user.group
) (el énfasis es mío):
El método BSD 4.3 para especificar tanto el propietario como el grupo se incluyó en este volumen de POSIX.1-2008 porque:
- Hay casos en los que no se pudo lograr la condición final deseada utilizando las utilidades chgrp y chown (que solo cambiaron la ID del usuario).(Si el propietario actual no es miembro del grupo deseado y el propietario deseado no es miembro del grupo actual, la función chown() podría fallar a menos que tanto el propietario como el grupo se cambien al mismo tiempo).
Pensé que la user:group
sintaxis era una cuestión de conveniencia. Ahora bien, lo anterior implica que hay cosas que puedes hacer con chown user:group
las que no puedes.chgrp group; chown user
Ahora ese texto no tiene sentido para mí. En 4.3BSD, sólo el root podía cambiar el propietario de un archivo, por lo que en cualquier caso no hay restricciones en lo que puede hacer.
SysV y algunos otros sistemas permiten (o solían permitir) que el propietario de un archivo cambie el usuario y el grupo de un archivo a cualquier cosa, pero incluso en esos sistemas, el texto anterior no tiene sentido para mí. Bien, si uno hace un chown someone-else the-file
, no puede hacerlo chgrp something-else the-file
después porque ya no es el propietario del archivo, pero no hay nada que le impida hacer lo chgrp
primero (sigue siendo el propietario del archivo) y chown
después, y eso no es lo que el El texto de arriba dice exactamente.
No entiendo lo quey el propietario deseado no es miembro del grupo actualtiene que ver con el problema.
Entonces, ¿cuáles son las condiciones por las cualesla función chown() podría fallar a menos que se cambien tanto el propietario como el grupo al mismo tiempo¿Y en qué sistema?
Respuesta1
ElSubsistema Microsoft Interix Unix (ahora retirado)porque su kernel NT trata los permisos de usuarios y grupos de manera un poco diferente a como lo hacen otros:
La información de usuarios y grupos se almacena en elBase de datos de acceso de seguridad. Tanto los usuarios como los grupos se almacenan en la misma base de datos, pero los nombres de grupo y usuario deben ser únicos; ningún grupo puede tener un nombre de usuario y viceversa.(Esta base de datos reemplaza los archivos
/etc/passwd
y/etc/groups
en UNIX).Los usuarios y grupos se crean utilizando la metodología adecuada de Windows.(Administrador de usuarios, Usuarios y computadoras de Active Directory o Usuarios y grupos locales)o con elnet user
comando Win32.(En el directorio se incluyen ejemplos de scripts de shell para crear y eliminar usuarios/usr/examples/admin
).Los usuarios pueden pertenecer a muchos grupos.
Aquí estánalgunoextractos del manual más específicos:
En Windows, un usuario o un grupo pueden poseer un objeto. Esto es diferente de UNIX, en el que sólo un usuario posee un objeto.
Windows identifica a todos los usuarios y grupos internamente mediante un identificador de seguridad.(SID). Un algoritmo hash genera valores SID que son únicos; No habrá dos usuarios o grupos que tengan el mismo SID.
Los usuarios y grupos que tienen permiso para acceder a un objeto se identifican por su SID. Todos los objetos que Windows puede proteger tienen una lista de control de acceso discrecional (DACL), que consta de entradas separadas llamadas entradas de control de acceso (ACE). Una ACE incluye dos datos importantes: un SID de usuario o grupo y una descripción de cuánto acceso tiene el usuario o grupo individual a un objeto.
...Cambiar el ID de grupo del archivo... el usuario que invoca chgrp(1) debe pertenecer al grupo especificado y ser el propietario del archivo, o tener los privilegios adecuados.
... Los operandos propietario y de grupo son opcionales; sin embargo, se debe especificar uno. Si se especifica el operando de grupo, debe ir precedido de dos puntos (:).
El propietario se puede especificar mediante una ID de usuario numérica o un nombre de usuario. Si un nombre de usuario es también un ID de usuario numérico, el operando se utiliza como nombre de usuario. El grupo puede ser un ID de grupo numérico o un nombre de grupo. Si un nombre de grupo es también un ID de grupo numérico, el operando se utiliza como nombre de grupo.
Por razones de seguridad, la propiedad de un archivo sólo puede modificarse mediante un proceso con los privilegios adecuados.
Según lo leí, eso significa que si su cuenta de usuario pertenece a un grupo de Windows con privilegios suficientes para modificar los permisos de un archivo que pertenece a ese grupo, entonces es posible eliminar efectivamente chgrp
ese archivo fuera del control de su cuenta de usuario. Esto equivale a un control menor del que podría tener con parámetros chown
explícitos user:group
. En ese contexto sin posibilidad de declararuser:
y :group
nunca podrías lograr los mismos resultados que de otra manera.
Aquí hay un enlacehasta una mirada detallada a cómo Interix interactúa con las ACL de Windows, centrándose en cómo dicho conocimiento podría aplicarse a los sistemas de archivos Samba en otras variantes de Unix.
Aquí hay un enlacea un ahoraobsoletoDocumento de Solaris que describe el sintonizable rstchown
que...
Indica si la semántica POSIX para la
chown(2)
llamada al sistema está vigente...
Aparentemente, si el parámetro se establece en un valor de 0
...
...desactivar la semántica POSIX abre la posibilidad de que se produzcan varios agujeros de seguridad. También abre la posibilidad de unaEl usuario cambia la propiedad de un archivo a otro usuario y no puede recuperar el archivo.volver sin intervención del usuario o del administrador del sistema.
Esta opción no invalida laConformidad POSIX. El solo hecho de que sea una opción la califica comoconforme:
Aunque todas las implementaciones que cumplen con POSIX.1-2008 admiten todas las funciones que se describen a continuación, es posible que hayaprocedimientos de configuración dependientes del sistema o dependientes del sistema de archivos que pueden eliminar o modificar cualquiera o todas estas características. Estas configuraciones no deben realizarse si se requiere un cumplimiento estricto.
Las siguientes constantes simbólicas se definirán con un valor distinto de -1. Si una constante se define con el valor cero, las aplicaciones deben usar las
sysconf()
funciones , o lapathconf()
utilidad , para determinar qué características están presentes en el sistema en ese momento o para la ruta particular en cuestión.fpathconf()
getconf
_POSIX_CHOWN_RESTRICTED
El uso de
chown()
está restringido a un proceso con privilegios apropiados y a cambiar el ID de grupo de un archivo solo al ID de grupo efectivo del proceso o a uno de sus ID de grupo suplementarios.
La chown()
función del sistema, que es la llamada al sistema documentada realizada tanto por elchown
ychgrp
utilidades de shell - esespecificado para fallarpor numerosas razones. Entre ellos:
EACCES
Se deniega el permiso de búsqueda en un componente del prefijo de ruta.
ELOOP
Existe un bucle en los enlaces simbólicos encontrados durante la resolución del argumento de la ruta.
EPERM
La ID de usuario efectiva no coincide con el propietario del archivo, o el proceso de llamada no tiene los privilegios adecuados y_POSIX_CHOWN_RESTRICTEDindica que dicho privilegio es necesario.
Sin embargo, el comportamiento de otorgar derechos de modificación de permisos a usuarios no root nunca ha sido exclusivo de Solaris. Haymuy bien- aunque algo anticuado - cobertura de permisos de archivos Unix enesta publicación en el foroen el que el autor afirma:
Originalmente, Unix permitía al propietario de un archivo regalar un archivo. El propietario de un archivo podría cambiar el propietario a otra persona. No había forma de que un usuario no root pudiera deshacer esta operación... BSD[más tarde]eliminado
chown
de usuarios no root...[en parte porque]...implementó cuotas de disco que podrían limitar la cantidad de espacio en disco que un usuario podría tener en un sistema de archivos... Los usuarios traviesos podrían regalar archivos grandes para burlar las cuotas.Hoy en día, no es fácil decir si un usuario no root puede almacenar
chown
un archivo. Muchas versiones de Unix permitenamboscomportamientos...
Otro buen -y más reciente-publicación en la lista de correocita esto y continúa:
El valor predeterminado en la mayoría de los sistemas operativos es
chown
estar restringido solo a root. Y existe consenso en que debería seguir así por consideraciones de seguridad. Si un usuario no root cambia el propietario de un archivo y cualquier bit de ejecución está activado, se deben borrar los bitsSUID
y .SGID
Esto puede suceder o no conroot
.Creo que el último párrafo lo dice muy bien.
Ese artículo también hace referencia
CAP_CHOWN
al control de esa instalación en Linux.(eso sólo debería afectar elPOSIX_CHOWN_RESTRICTED
comportamiento). También existe laCAP_FOWNER
capacidad, que es un poco diferente en comportamiento.
Y comousted señala en 2003:
Tenga en cuenta que al menos en HPUX, puede cambiar el propietario de sus archivos(a
root
por ejemplo)incluso si no eres un usuario privilegiado...
...que dependía de un setprivgroup
parámetro de configuración.
En cualquier caso en el que un usuario no root pueda manipular los permisos de archivos, es concebible, como se menciona en elrazón fundamentalcitado en su pregunta, que un usuario puede tener chown
un archivo que le pertenece para que sea propiedad de otro usuario. Si la propiedad del grupo del archivo y los chown
grupos del usuario ing no se alinean, entonces el usuario ya no podrá modificar ese archivo.
En este escenariochown
entonces chgrp
fallaría ya que el usuario ya no tendría permisos para alterar los permisos de ese archivo, mientras que chown user:group
, siempre quegrupopertenece al usuario- tendría éxito.
HayprobablementeMuchas otras situaciones específicas que podrían resultar similares, que podrían incluir directoriopegajosoy/osetgidbits, sistemas de archivos y/o listas de control de acceso específicas de la implementación.este hiloes interesante, por ejemplo. Las innumerables permutaciones están mucho más allá de mi débil comprensión, razón por la cual esta respuesta está en wiki. Si estás leyendo esto, crees que vale la pena mejorarlo y crees que sabes cómo hacerlo.Por favor, hazlo.
También hay documentación extensa sobre los diversos efectos posibles de los permisos de archivos, el recorrido de árboles y los enlaces simbólicos que podrían provocar una falla similar con respecto a las aplicaciones -R
ecursivas chown
aquí:
DeXRAT POSIXEncabezados de secciónTerceroyCuartos Dominios:
Generalmente, los usuarios que especifican la opción para atravesar la jerarquía de archivos desean operar en una única jerarquía física y, por lo tanto, se ignoran los enlaces simbólicos, que pueden hacer referencia a archivos fuera de la jerarquía. Por ejemplo, el archivo de propietario chown es una operación diferente del mismo comando con la opción -R especificada. En este ejemplo, el comportamiento del comando
chown
owner
file
se describe aquí, mientras que el comportamiento del comandochown -R
El archivo del propietario se describe en los dominios tercero y cuarto....Existe un problema de seguridad al utilizar de forma predeterminada un paseo lógico. Históricamente, el mando
chown -R
El archivo de usuario ha sido seguro para el superusuario porquesetuidysetgidLos bits se perdieron cuando se cambió la propiedad del archivo. Si el recorrido fuera lógico, cambiar de propietario ya no sería seguro porque un usuario podría haber insertado un enlace simbólico que apunta a cualquier archivo del árbol. Nuevamente, esto requeriría agregar una opción a los comandos que atraviesan la jerarquía para no indirectamente a través de los enlaces simbólicos, y los guiones históricos que realizan recorridos recursivos se convertirían instantáneamente en problemas de seguridad. Si bien esto es principalmente un problema para los administradores de sistemas, es preferible no tener diferentes valores predeterminados para diferentes clases de usuarios....
En BSD 4.3,
chgrp
durante el recorrido del árbol se cambiaba el grupo del enlace simbólico, no el objetivo. Los enlaces simbólicos en BSD 4.4 no tenían propietario, grupo, modo u otros atributos de archivo del sistema UNIX estándar.
Y desde el POSIXchgrp
En la página propiamente dicha hay esto que apunta a una posible -R
acción ecursiva incompleta, o al menos a lo queusadoser:
Las versiones System V y BSD utilizan diferentes códigos de estado de salida. Algunas implementaciones utilizaron el estado de salida como recuento de la cantidad de errores que ocurrieron; Esta práctica es inviable ya que puede desbordar el rango de valores de estado de salida válidos. Los desarrolladores del estándar optaron por enmascararlos especificando sólo 0 y >0 como valores de salida.
Respuesta2
Supuesto 1: las reglas para determinar si chown
tiene éxito verifican el usuario objetivo y las partes del grupo de forma independiente, es decir, tienen la forma user_condition(target_uid, other_environment_parameters) && group_condition(target_gid, other_environment_parameters)
.
Supuesto 2: chown(file, -1, -1)
tiene éxito.
Supuesto 3: las reglas para determinar si chown
el proceso es exitoso no dependen del grupo al que pertenece actualmente el archivo.
Corolario: si chown(file, uid, gid)
tuviera éxito, entonces también lo haría chown(file, -1, gid) && chown(file, uid, -1)
.
No conozco ninguna variante de Unix que viole cualquiera de estas suposiciones, parecen bastante seguras.
Esta frase parece algo que alguien del comité dijo cuando estaba cansado después de horas de debatir cuántas opciones cabían en una ps
llamada (o que el secretario transcribió mal) y que nadie captó durante la revisión. Después de todo, hay otras buenas razones para permitir que el usuario y el grupo se cambien automáticamente, incluida la razón de rendimiento también citada en el fundamento POSIX, así como la atomicidad (ah, si tan solo hubiera una única llamada para cambiar la propiedad y los permisos ).
Un caso en el que la suposición 3 podría ser errónea es en un sistema en el que un proceso puede obtener la capacidad de cambiar los propietarios del archivo, pero sólo si tiene permiso de escritura en el archivo. Si bien es algo realista, no conozco ningún sistema en el que este sea el caso. Luego, chgrp
a un grupo de un proceso que no se ejecuta ni como root ni como usuario propietario del archivo, lo que podría hacer que el archivo esté fuera del límite para un archivo chown
.
Para una llamada recursiva, hay casos extremos en los que una pasada completa chgrp
seguida de una pasada completa chown
puede fallar cuando una sola pasada sería exitosa. Este no es un argumento muy convincente porque involucra directorios que el propietario no tiene permiso para recorrer, y una aplicación que quisiera protegerse contra todos esos casos necesitaría manipular los permisos de todos modos. No obstante, técnicamente cumple con la condición de este fundamento. Supongamos que el proceso en ejecución tiene un usuario efectivo alice
, un grupo efectivo staff
y la capacidad de cambiar los propietarios de los archivos arbitrariamente (no sólo para regalarlos; varias variantes de Unix tienen esa capacidad, aunque rara vez se concede a procesos que no son root).
$ ls -ld dir dir/file
d---rwx--- 2 charlie staff 1024 Apr 1 1970 dir
drw-rw---- 2 charlie staff 42 Apr 1 1970 file
$ chgrp -R students dir
$ chown -R bob dir
chown: dir: permission denied