Tengo un directorio que contiene datos compartidos entre varios usuarios. El acceso a este directorio y todo lo que se encuentre debajo será controlado por el grupo del directorio, que se agregará a los usuarios en cuestión. Como tal, creé el conjunto de carpetas "grupo adhesivo" chmod g+s
. El directorio contendrá una estructura de árbol con directorios y archivos, y la cantidad total de archivos probablemente sea de unos pocos millones. Los archivos serán bastante pequeños, no preveo nada más grande que 50 MB.
Mi problema es que el propietario del archivo o directorio sigue siendo el usuario que lo creó. Como tal, incluso si eliminara a ese usuario del grupo de acceso, no eliminaría su acceso por completo.
Asi que:
¿Hay otras opciones que perdí para garantizar que todos los archivos y subdirectorios tengan el mismo propietario?
Espero que pueda navegar periódicamente por todo el directorio con un trabajo cron, pero eso me parece ineficaz para lo que es esencialmente un comando una vez pr-file.
Encontré un ejemplo usando INotify, pero eso me parece de alto mantenimiento, ya que requiere secuencias de comandos.
No he podido averiguar si ACL me puede ayudar con la propiedad forzada.
¿Hay una manera más inteligente de hacer esto?
Lo que quiero es tener un directorio que se pueda compartir agregando un grupo a un usuario. Todo lo creado en este directorio hereda el esquema de permisos de su padre. Si hay una mejor manera de lo que estoy intentando, soy todo oídos.
fuente
chown -hR owner:group
?Respuestas:
Establecer un propietario predeterminado "automáticamente" requeriría un directorio que se
setuid
comportara comosetgid
. Sin embargo, si bien esto se puede configurar en FreeBSD, otros sistemas UNIX y Linux simplemente ignoranu+s
. Sin embargo, en su caso, puede haber otra solución.Entonces, básicamente, por lo que veo, desea controlar el acceso a un directorio utilizando el mecanismo de grupos. Sin embargo, esto no requiere que restrinja los permisos en toda la estructura de directorios. En realidad, el
--x
bit de ejecución del directorio podría ser justo lo que necesita. Dejame darte un ejemplo. Asumiendo que...group_dir
directorio esourgroup
.ourgroup
grupo pueden accedergroup_dir
.user1
yuser2
pertenecen aourgroup
.... considere la siguiente configuración:
Aquí, supongamos que cada elemento fue creado por su propietario.
Ahora, en esta configuración:
ourgroup
. Cualquier persona del grupo puede crear, mover, eliminar archivos en cualquier lugar dentrogroup_dir
(pero no más profundo).ourgroup
será bloqueadagroup_dir
y, por lo tanto, no podrá manipular nada debajo de ella. Por ejemplo,user3
(que no es miembro deourgroup
), no puede leergroup_dir/user2_submission/README
(a pesar de que tiener--
permiso en el archivo).Sin embargo, hay un pequeño problema en este caso: debido a la típica umask, los elementos creados por los usuarios no pueden ser manipulados por otros miembros del grupo. Aquí es donde entran las ACL. Al establecer permisos predeterminados, se asegurará de que todo esté bien a pesar del valor de umask:
Esta llamada establece:
rw(x)
Permisos predeterminados para el propietario.rw(x)
Permisos predeterminados para el grupo.group_dir
todos modos, en realidad no importa cuáles son sus permisos debajo.Ahora, si creo un elemento como
user2
:Con esta ACL en su lugar, podemos intentar reconstruir nuestra estructura anterior:
Aquí nuevamente, cada elemento es creado por su propietario.
Además, si desea dar un poco más de potencia / seguridad a quienes usan el directorio, es posible que desee considerar un poco pegajoso. Esto, por ejemplo, evitaría
user1
eliminaruser2_submission
(ya que tiene-w-
permiso paragroup_dir
):Ahora, si
user1
intenta eliminaruser2
el directorio, obtendrá un encantadorOperation not permitted
. Sin embargo, tenga en cuenta que si bien esto evita modificaciones en la estructura del directoriogroup_dir
, los archivos y directorios que se encuentran debajo todavía son accesibles:Otra cosa a tener en cuenta es que las ACL que utilizamos configuran permisos predeterminados . Por lo tanto, es posible que el propietario de un elemento cambie los permisos asociados a él. Por ejemplo,
user2
puede funcionar perfectamente ...... por lo tanto, su directorio de envío completo no está disponible para nadie en el grupo.
Sin embargo, dado que originalmente estaba dispuesto a dar
rws
acceso completo a cualquier persona del grupo, supongo que confía en estos usuarios y que no esperaría demasiadas operaciones maliciosas de ellos.fuente
group_dir
en primer lugar no podrá ingresar , sin importar si posee el archivo o no. El único "privilegio" real que tiene el propietario es que puede cambiar los permisos de sus creaciones (que detallé un poco más en mi respuesta).group_dir
directorio es propiedad deroot:ourgroup
with-rwxr-x---
, lo que significa que solo los usuarios root y miembrosourgroup
pueden acceder a él, es decir, hacer cualquier cosa con los archivos que contiene. Si no tiene--x
permiso en un directorio, no puede acceder a un archivo dentro de él, incluso si tiene permisos del archivo en sí.Hay una forma más inteligente de hacer esto. Utiliza una combinación de set-gid y acls predeterminados . Obviamente, necesitará un sistema de archivos habilitado para acl. Supongamos que el directorio que desea compartir se encuentra
/var/grpdir
y que los miembros del gruposharing
deberían poder acceder a él.Las ACL predeterminadas son heredadas por subdirectorios creados en un directorio con ACL predeterminadas. Esto significa que cualquier archivo creado en
/var/grpdir
tendrá su grupo establecidosharing
por el bit setgid del directorio. Además, heredará las acls predeterminadas, que anularán las premisiones predeterminadas de estilo Linux, porque no especificamos ACL con usuarios o grupos específicos. Esto significa que todos los archivos se crearán con propiedad<user>:sharing
y permisosrw-rw----
. Los directorios serán los mismos, excepto que también tendrán sus propias ACL predeterminadas configuradas de la misma manera que sus padres (/var/grpdir
) y, por supuesto, tendrán los bits ejecutables establecidos para el usuario y el grupo. Si elimina a un usuario delsharing
grupo, no podrá acceder al directorio (ni a ningún archivo que contenga, incluso si lo posee).A diferencia de la corrección periódica de permisos con un cronjob, los permisos siempre están sincronizados, ya que se actualizan atómicamente con los archivos y directorios recién creados. Esta solución es ligera; no se necesitan demonios, y no hay un pico para IO mientras se corrigen los permisos de una sola vez.
fuente
No conozco ninguna buena manera de hacer esto. La forma técnicamente más limpia sería un sistema de archivos FUSE que lo haga. Por supuesto, mucho trabajo si nadie lo ha hecho todavía.
Alternativas:
Usa samba. samba tiene el
force user
parámetro Puede exportar un directorio localmente y montarlo localmente. No hace que los accesos sean más rápidos, pero puede ser aceptable ya que solo se trata de redes de bucle invertido.Use un sistema de archivos que no sea Linux como FAT32. Esto debe configurarse para que un determinado usuario lo monte. Los permisos de acceso deben ser manejados por el directorio padre.
fuente
No he oído hablar de ninguna forma de cambiar automáticamente la propiedad de un archivo, de modo que el propietario del archivo cambie cuando el archivo se mueva a un determinado directorio. Lo más parecido es lo pegajoso, pero parece que has indicado que la propiedad del grupo no es suficiente, la propiedad real del usuario tiene que cambiar.
En ese caso, creo que su mejor opción es el trabajo cron con el indicador chown -R, como mencionó Pandya. Póngalo en un cron para que se ejecute cada minuto o cada cinco minutos.
Si puede explicar cómo sus usuarios están usando esto, puede haber una mejor solución.
ACL puede ayudarlo a obtener un control de grano más fino sobre quién tiene permitido hacer qué, no cambiará automáticamente la propiedad real del archivo por usted. Creo que necesita obtener una vista más elevada y evaluar / rediseñar su solución sobre esa base.
fuente
Puede usar inotify-tools y escribir un script bash simple como el siguiente. Inotify mantendrá su ojo en el directorio web y hará algo cada vez que ocurra un evento como la creación de directorios dentro del directorio web. Hay muchos eventos existentes. Puede buscarlo en Google o puede haber buscado en este sitio
fuente