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

31

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

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

O ponto é que eu quero subversioncontrolar a versão, gerenciar vários usuários em vários repositórios e não sei como mesclar /srv/svn , o diretório raiz dos repositórios, permissões. Eu tenho, por exemplo, três empresas FirmA, FirmBe FirmC. Agora, dentro /srv/svnEu criei três diretórios, FirmA, FirmB, FirmCe dentro deles eu criei repositório para cada projeto e agora eu não sei como estabelecer esquema de permissão uma vez que todos elementes interior /srv/svnsão de propriedade root:root, que não é ok, ou sou eu errado?

KernelPanic
fonte
1
Os grupos de empresas acessam os arquivos uns dos outros? Ou eles são completamente separados, exceto o compartilhamento de um diretório pai?
JM Becker
O grupo de empresas @TechZilla NÃO DEVE acessar os arquivos uns dos outros, deve DEVER ser separado, apenas eu devo ter acesso a todos os diretórios.
KernelPanic
OK, postei a resposta correta, você não deve usar ACLs para isso. Eles são uma opção de último recurso, esse problema ainda é muito comum.
JM Becker

Respostas:

16

Esse é um problema extremamente comum, se eu o entender com precisão, e o encontro constantemente. Se eu usasse ACLs para todos os problemas triviais de agrupamento, teria toneladas de sistemas incontroláveis. Eles estão usando as melhores práticas quando você não pode fazê-lo de outra maneira, não nesta situação. Este é o método que eu recomendo fortemente.

Primeiro, você precisa definir seu umask como 002, para que um grupo possa compartilhar consigo mesmo. Normalmente, crio um arquivo como /etc/profile.d/firm.shoe adiciono 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 sempre permaneça no que você definiu. Isso impedirá que um arquivo gravado seja definido como 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ê deseja 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
JM Becker
fonte
2
Aviso: isso deve funcionar, mas remove o bit de permissão de execução em todos os arquivos. Não há problema se a árvore de diretórios tiver apenas documentos. Se ele contiver arquivos executáveis, isso impedirá a execução, o que pode arruinar sua instalação.
Stéphane Gourichon
1
Essa também pode ser uma boa idéia, mas não responde à pergunta.
ceving 13/09/17
Como descrito, apenas particiona as três pastas para que apenas os membros de cada empresa possam modificar apenas seus respectivos arquivos - ele não dá ao 'svn' o acesso necessário.
rich p
Isto é muito próximo. O que está faltando é dar -lhe acesso a todos os grupos. Adicione esta etapa, supondo que seu login seja svnadmin: sudo usermod -a -G FirmA,FirmB,FirmC svnadmin Isso será adicionado svnadmina todos esses grupos. Como os arquivos em todos esses grupos têm a opção 'gravação em grupo' ativada (você chmod 664fez isso), você e o firmX serão os únicos gravadores de arquivos pertencentes ao firmX.
rich p
1
Melhor - altere as permissões para adicionar / subtrair o que você deseja adicionar / subtrair - por exemplo, dofind /srv/svn/FirmA -type f -print0 | xargs -0 chmod ug+rw,o+r,o-wx
rich p
25

Você pode ter apenas um grupo como proprietário .

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

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

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

Por exemplo:

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

Adiciona o grupo devFirmBcom r ead, w rito, e x permissões ecute para o diretório /srv/svn.

Se você também deseja que os arquivos criados nesse diretório sejam de propriedade de vários grupos, defina a ACL como a ACL padrão. A Xentrada do grupo padrão significa "permitir 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/  
jcbermu
fonte
6

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

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

sudo addgroup NEWGROUPNAME

Primeiro, você pode precisar instalar id-utilspara obter o lidcomando:

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 SOURCEGROUPpara TARGETGROUP. É claro que você deve executar o comando uma vez para cada grupo que deseja copiar. Não se esqueça de substituir os marcadores com letras maiúsculas pelos nomes reais dos grupos.

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

Portanto, no seu caso, você teria que executar o comando (todas as linhas de uma 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 copiam apenas todos os usuários que são membros atuais dos grupos de origem. Todo usuário adicionado posteriormente também precisará ser adicionado manualmente ao seu grupo comum com o addusercomando Apenas substitua mais uma vez os espaços reservados maiúsculos pelo nome real do usuário e do grupo ( devFirms):

sudo adduser NEWUSER TARGETGROUP

Agradecemos a Justin Ethier por sua resposta no Unix e Linux.SE: Adicionar todos os usuários de um grupo a outro grupo?

Byte Commander
fonte
@Gilles, seu esquema funcionaria para vários repositórios do servidor Subversion com vários usuários, como na minha atualização de pergunta?
KernelPanic
2

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

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

Uwe Plonus
fonte
6
Fornecer uma abordagem alternativa para obter o mesmo resultado ou um resultado semelhante seria bom.
Byte Commander
2

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

Para tornar o 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 da ACL:

getfacl <directory_name>
Mr.H
fonte
Testado, funciona também no Ubuntu 16.04.3
Dmitry