Establecer un propietario predeterminado "automáticamente" requeriría un directorio que se setuid
comportara como setgid
. Sin embargo, si bien esto se puede configurar en FreeBSD, otros sistemas UNIX y Linux simplemente ignoran u+s
. Sin embargo, en su caso, puede haber otra solución.
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.
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...
- El grupo que controla el acceso al
group_dir
directorio es ourgroup
.
- Solo las personas del
ourgroup
grupo pueden acceder group_dir
.
user1
y user2
pertenecen a ourgroup
.
- La umask predeterminada es 0022.
... considere la siguiente configuración:
drwxrws--- root:ourgroup |- group_dir/
drwxr-sr-x user1:ourgroup |---- group_dir/user1_submission/
drwxr-sr-x user2:ourgroup |---- group_dir/user2_submission/
-rw-r--r-- user2:ourgroup |-------- group_dir/user2_submission/README
Aquí, supongamos que cada elemento fue creado por su propietario.
Ahora, en esta configuración:
- Todos los directorios pueden ser navegados libremente por todos en
ourgroup
. Cualquier persona del grupo puede crear, mover, eliminar archivos en cualquier lugar dentro group_dir
(pero no más profundo).
- Cualquier persona que no esté adentro
ourgroup
será bloqueada group_dir
y, por lo tanto, no podrá manipular nada debajo de ella. Por ejemplo, user3
(que no es miembro de ourgroup
), no puede leer group_dir/user2_submission/README
(a pesar de que tiene r--
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:
$ setfacl -dRm u::rwX,g::rwX,o::0 group_dir/
Esta llamada establece:
rw(x)
Permisos predeterminados para el propietario.
rw(x)
Permisos predeterminados para el grupo.
- Sin permisos por defecto para los demás. Tenga en cuenta que, dado que los demás no pueden acceder de
group_dir
todos modos, en realidad no importa cuáles son sus permisos debajo.
Ahora, si creo un elemento como user2
:
$ touch group_dir/user2_submission/AUTHORS
$ ls -l group_dir/user2_submission/AUTHORS
rw-rw---- user2:ourgroup group_dir/user2_submission/AUTHORS
Con esta ACL en su lugar, podemos intentar reconstruir nuestra estructura anterior:
drwxrws---+ root:ourgroup |- group_dir/
drwxrws---+ user1:ourgroup |---- group_dir/user1_submission/
drwxrws---+ user2:ourgroup |---- group_dir/user2_submission/
-rw-rw----+ user2:ourgroup |-------- group_dir/user2_submission/README
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
eliminar user2_submission
(ya que tiene -w-
permiso para group_dir
):
$ chmod +t group_dir/
Ahora, si user1
intenta eliminar user2
el directorio, obtendrá un encantador Operation not permitted
. Sin embargo, tenga en cuenta que si bien esto evita modificaciones en la estructura del directorio group_dir
, los archivos y directorios que se encuentran debajo todavía son accesibles:
user1@host $ rm -r user2_submission
Operation not permitted
user1@host $ cat /dev/null > user2_submission/README
user1@host $ file user2_submission/README
user2_submission/README: empty (uh-oh)
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 ...
$ chown g= user2_submission/ -R
or
$ chgrp nobody user2_submission -R
... 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.