Definindo vários grupos como proprietários de diretório

28

No meu servidor, eu tenho o diretório /srv/svn .

É possível definir esse diretório para ter várias propriedades de grupo, por exemplo, devFirmA , devFirmB e devFirmC ?

O ponto é, eu quero subversion controle de versão gerenciar vários usuários em vários repositórios e eu não sei como mesclar /srv/svn , o diretório raiz de repositórios, permissões. Eu tenho, por exemplo, três firmas, FirmA , FirmB e FirmC . Agora, dentro de /srv/svn eu criei três diretórios, FirmA , FirmB , FirmC e dentro deles eu criei repositório para cada projeto e agora eu não sei como estabelecer esquema de permissão já que todos os elementes dentro /srv/svn são de propriedade de root:root , o que não é correto ou estou errado?

    
por KernelPanic 10.04.2015 / 13:18

5 respostas

12

Este é um problema extremamente comum, se eu o entendi com precisão, e eu o encontro constantemente. Se eu usasse ACLs para cada problema de agrupamento trivial, eu teria toneladas de sistemas não gerenciáveis. Eles são apenas a melhor prática quando você não pode fazer isso de outra maneira, não para essa situação. Este é o método que recomendo vivamente.

Primeiro você precisa definir sua umask como 002, isso é para que um grupo possa compartilhar consigo mesmo. Eu costumo criar um arquivo como /etc/profile.d/firm.sh e, em seguida, adicionar um comando de teste com o umask.

[ $UID -gt 10000 ] && umask 002

Em seguida, você precisa definir os diretórios para seus respectivos grupos,

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

Finalmente, você precisa definir o bit SGID corretamente, para que o grupo permaneça sempre no mesmo que você definiu. Isso impedirá que um arquivo escrito seja definido para o GID do gravador.

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

Agora, finalmente, se você quiser impedir que os diretórios sejam acessados por outros usuários.

chmod 2770 /srv/svn/FirmA
chmod 2770 /srv/svn/FirmB
chmod 2770 /srv/svn/FirmC
    
por 21.04.2015 / 22:02
22

Você só pode ter um grupo como proprietário .

No entanto, usando listas de controle de acesso você pode definir permissões para outros grupos.

Verifique se você tem o ACL instalado emitindo o comando getfacl .  Se o seu sistema não tiver o ACL instalado, instale as ferramentas de linha de comando que estão no acl package com: sudo apt-get install acl

Com getfacl você pode ler as informações da ACL de um diretório ou outro arquivo, e com setfacl você pode adicionar grupos a um arquivo.

Por exemplo:

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

Adiciona o grupo devFirmB com as permissões r ead, w rite e x ecute no diretório /srv/svn .

Se você também quiser que os arquivos criados nesse diretório sejam de propriedade de vários grupos, defina a ACL como a ACL padrão. O X na entrada do grupo padrão significa “permitir a execução se executável pelo proprietário (ou qualquer outra pessoa)”.

setfacl -m g:devFirmB:rwx /srv/svn/  
setfacl -d -m g:devFirmB:rwX /srv/svn/  
    
por 10.04.2015 / 13:36
4

Não é possível ter um arquivo pertencente a vários grupos do Linux com permissões tradicionais do Unix. (Contudo, é possível com o ACL .)

Mas você pode usar a seguinte solução alternativa e criar um novo grupo (por exemplo, chamado devFirms ), que incluirá todos os usuários dos grupos devFirmA , devFirmB e devFirmC .
Você cria novos grupos de usuários com:

sudo addgroup NEWGROUPNAME

Primeiro, você pode ter que instalar o id-utils para obter o lid -command:

sudo apt-get install id-utils

Em seguida, você pode executar a seguinte linha de código para copiar facilmente todos os usuários de SOURCEGROUP para TARGETGROUP . Claro que você tem que executar o comando uma vez para cada grupo que você deseja copiar. Não se esqueça de substituir os espaços reservados com os nomes reais dos grupos.

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

Então, no seu caso, você teria que executar o comando (todas as linhas de uma só 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

Observe que esses comandos apenas copiam todos os usuários que são membros atuais dos grupos de origem. Todos os usuários adicionados posteriormente terão também que ser adicionados manualmente ao seu grupo comum com o comando adduser . Basta substituir novamente os espaços reservados com o nome real do usuário e do grupo ( devFirms ):

sudo adduser NEWUSER TARGETGROUP

Agradecimentos a Justin Ethier por sua resposta em Unix&Linux.SE: adiciona todos os usuários de um grupo a outro grupo?

    
por 10.04.2015 / 14:11
2

Não, isso não é possível.

Cada arquivo (e também os diretórios) só pode ter um usuário e um grupo.

    
por 10.04.2015 / 13:36
2

Para fornecer direitos diferentes a vários grupos ou usuários, use os seguintes comandos (testados no RHEL 6 e 7):

Para criar um novo proprietário do grupo:

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

Para verificar as configurações atuais de acl:

getfacl <directory_name>
    
por 20.01.2016 / 08:31