Establecer múltiples grupos como propietarios de directorios

31

En mi servidor tengo directorio /srv/svn.

¿Es posible configurar este directorio para tener múltiples propietarios de grupos, por ejemplo devFirmA, devFirmBy devFirmC?

El punto es que quiero subversioncontrolar el control de versiones de múltiples usuarios en múltiples repositorios y no sé cómo fusionar /srv/svn , el directorio raíz de repositorios, los permisos. Tengo, por ejemplo, tres empresas FirmA, FirmBy FirmC. Ahora, en el interior /srv/svnHe creado tres directorios, FirmA, FirmB, FirmCy dentro de ellos he creado repositorio para cada proyecto y ahora no sé cómo establecer esquema de permisos ya que todos los elementes interior /srv/svnson propiedad de root:root, lo que no está bien, o soy yo ¿incorrecto?

Panico kernel
fuente
1
¿Los grupos de empresas acceden a los archivos de los demás? ¿O están completamente separados, aparte de compartir un directorio principal?
JM Becker
@TechZilla firm group NO DEBE acceder a los archivos de los demás, DEBE estar separado, solo debo tener acceso a todos los directorios.
KernelPanic
OK, publiqué la respuesta correcta, no debes usar ACL para esto. Son una opción de último recurso, este problema sigue siendo muy común.
JM Becker

Respuestas:

16

Este es un problema extremadamente común, si lo entiendo con precisión y lo encuentro constantemente. Si usara ACL para cada problema de agrupación trivial, tendría toneladas de sistemas inmanejables. Están utilizando la mejor práctica cuando no puede hacerlo de otra manera, no para esta situación. Este es el método que recomiendo encarecidamente.

Primero debe configurar su umask en 002, esto es para que un grupo pueda compartir consigo mismo. Por lo general, creo un archivo como /etc/profile.d/firm.shy luego agrego un comando de prueba con la umask.

[ $UID -gt 10000 ] && umask 002

A continuación, debe configurar los directorios en sus respectivos grupos,

chgrp -R FirmA /srv/svn/FirmA 
chgrp -R FirmB /srv/svn/FirmB
chgrp -R FirmC /srv/svn/FirmC

Finalmente, debe establecer el bit SGID correctamente, por lo que el grupo siempre se mantendrá en el que configuró. Esto evitará que un archivo escrito se establezca en el GID del escritor.

find /srv/svn/FirmA -type d -print0 | xargs -0 chmod 2775
find /srv/svn/FirmB -type d -print0 | xargs -0 chmod 2775
find /srv/svn/FirmC -type d -print0 | xargs -0 chmod 2775

find /srv/svn/FirmA -type f -print0 | xargs -0 chmod 664
find /srv/svn/FirmB -type f -print0 | xargs -0 chmod 664
find /srv/svn/FirmC -type f -print0 | xargs -0 chmod 664

Ahora, finalmente, si desea evitar que otros usuarios accedan a los directorios.

chmod 2770 /srv/svn/FirmA
chmod 2770 /srv/svn/FirmB
chmod 2770 /srv/svn/FirmC
JM Becker
fuente
2
Advertencia: esto debería funcionar pero elimina el bit de permiso de ejecución en todos los archivos. Esto está bien si su árbol de directorios solo contiene documentos. Si contiene archivos ejecutables, esto evitará la ejecución, lo que puede arruinar su configuración.
Stéphane Gourichon
1
Esta podría ser también una buena idea, pero no responde a la pregunta en absoluto.
ceving
Esto, como se describe, solo divide las tres carpetas para que solo los miembros de cada empresa puedan modificar solo sus respectivos archivos; no le da a 'svn' el acceso que necesita.
rico p
Sin embargo, esto está muy cerca. Lo que falta es dar que el acceso a todos los grupos. Agregue este paso, suponiendo que su inicio de sesión sea svnadmin: sudo usermod -a -G FirmA,FirmB,FirmC svnadmin Esto se agregará svnadmina todos estos grupos. Dado que los archivos en todos estos grupos tienen habilitada la 'escritura grupal' ( chmod 664hizo esto), usted, más firmX, serán los únicos escritores de archivos propiedad de firmX.
rico p
1
Mejor: cambie los permisos para sumar / restar lo que desea sumar / restar, por ejemplo, hacerfind /srv/svn/FirmA -type f -print0 | xargs -0 chmod ug+rw,o+r,o-wx
rico p
25

Solo puede tener un grupo como propietario .

Sin embargo, utilizando las listas de control de acceso puede definir permisos para otros grupos.

Verifique si tiene ACL instalado emitiendo el comando getfacl. Si su sistema no tiene ACL instalado, instale las herramientas de línea de comandos que se encuentran en el aclpaquete con:sudo apt-get install acl

Con getfaclusted puede leer la información de ACL de un directorio u otro archivo, y con setfaclusted puede agregar grupos a un archivo.

Por ejemplo:

setfacl -m g:devFirmB:rwx /srv/svn/  

Agrega el grupo devFirmBcon permisos r ead, w rite, e x ecute al directorio /srv/svn.

Si también desea que los archivos creados en ese directorio sean propiedad de varios grupos, configure la ACL como la ACL predeterminada. La entrada Xen el grupo predeterminado significa "permitir la ejecución si es ejecutable por el propietario (o cualquier otra persona)".

setfacl -m g:devFirmB:rwx /srv/svn/  
setfacl -d -m g:devFirmB:rwX /srv/svn/  
jcbermu
fuente
6

No es posible tener un archivo propiedad de varios grupos de Linux con permisos tradicionales de Unix. (Sin embargo, es posible con ACL ).

Pero puede utilizar la siguiente solución y crear un nuevo grupo (por ejemplo, llamado devFirms) que incluirá a todos los usuarios de los grupos devFirmA, devFirmBy devFirmC.
Crea nuevos grupos de usuarios con:

sudo addgroup NEWGROUPNAME

Primero, puede que tenga que instalar id-utilspara obtener el lidcomando:

sudo apt-get install id-utils

A continuación, puede ejecutar la siguiente línea de código para copiar fácilmente a todos los usuarios de SOURCEGROUPa TARGETGROUP. Por supuesto, debe ejecutar el comando una vez para cada grupo que desee copiar. No olvide reemplazar los marcadores de posición con mayúscula por los nombres de grupo reales.

for u in $(lid -g -n SOURCEGROUP); do sudo usermod -a -G TARGETGROUP $u; done

Entonces, en su caso, tendría que ejecutar el comando (todas las líneas a la vez):

sudo addgroup devFirms &&
for u in $(lid -g -n devFirmA); do sudo usermod -a -G devFirms $u; done &&
for u in $(lid -g -n devFirmB); do sudo usermod -a -G devFirms $u; done &&
for u in $(lid -g -n devFirmC); do sudo usermod -a -G devFirms $u; done

Tenga en cuenta que estos comandos solo copian a todos los usuarios que son miembros actuales de los grupos de origen. Cada usuario que se agregue más tarde también tendrá que agregarse manualmente a su grupo común con el addusercomando. Simplemente reemplace los marcadores de posición en mayúsculas con el nombre real del usuario y grupo ( devFirms):

sudo adduser NEWUSER TARGETGROUP

Gracias a Justin Ethier por su respuesta en Unix y Linux. SE: ¿Agregar todos los usuarios de un grupo a otro?

Byte Commander
fuente
@Gilles, ¿cree que su esquema funcionaría para los repositorios múltiples del servidor Subversion con múltiples usuarios como en mi actualización de la pregunta?
KernelPanic
2

No, esto no es posible.

Cada archivo (y también los directorios) solo puede tener un usuario y un grupo.

Uwe Plonus
fuente
66
Proporcionar un enfoque alternativo para obtener el mismo resultado o un resultado similar sería bueno.
Byte Commander
2

Para proporcionar diferentes derechos a múltiples grupos o usuarios, use los siguientes comandos (Probado en RHEL 6 y 7):

Para hacer un nuevo propietario del grupo:

setfacl -m g:<group_name>:<rights you want to give eg.rwx> -R <directory_name>

Para verificar la configuración actual de acl:

getfacl <directory_name>
Mr.H
fuente
Probado, también funciona en Ubuntu 16.04.3
Dmitry