Установка нескольких групп в качестве владельцев каталогов

31

На моем сервере у меня есть каталог /srv/svn.

Можно ли, например devFirmA, установить для этого каталога несколько владельцев групп , devFirmBи devFirmC?

Дело в том, что я хочу, чтобы subversionуправление версиями управляло несколькими пользователями по нескольким репозиториям, и я не знаю, как объединить /srv/svn , корневой каталог репозиториев, разрешения. У меня есть, например, три фирмы FirmA, FirmBи FirmC. Теперь, внутри /srv/svnя создал три директории, FirmA, FirmB, FirmCи в них я создал хранилище для каждого проекта , и теперь я не знаю , как установить схему разрешения , так как все elementes внутри /srv/svnнаходятся в собственности root:root, которые не в порядке, или я неправильно?

KernelPanic
источник
1
Группы фирм имеют доступ к файлам друг друга? Или они совершенно разные, кроме общего родительского каталога?
JM Becker
Группа фирм @TechZilla НЕ ДОЛЖНА иметь доступ к файлам друг друга, ДОЛЖНА быть разделена, только у меня должен быть доступ ко всем каталогам.
KernelPanic
Хорошо, я отправил правильный ответ, вы не должны использовать ACL для этого. Они являются последним средством, эта проблема все еще очень распространена.
Дж. М. Беккер

Ответы:

16

Это чрезвычайно распространенная проблема, если я правильно ее понимаю и постоянно с ней сталкиваюсь. Если бы я использовал ACL для каждой тривиальной проблемы группировки, у меня было бы множество неуправляемых систем. Они используют лучшие практики, когда вы не можете сделать это иначе, не для этой ситуации. Это метод, который я очень настоятельно рекомендую.

Сначала вам нужно установить значение umask на 002, чтобы группа могла поделиться с собой. Я обычно создаю файл вроде /etc/profile.d/firm.sh, а затем добавляю тестовую команду с помощью umask.

[ $UID -gt 10000 ] && umask 002

Затем вам нужно установить каталоги для соответствующих групп,

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

Наконец, вам нужно правильно установить бит SGID, чтобы группа всегда оставалась той, которую вы установили. Это предотвратит установку записанного файла в GID автора.

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

Теперь, наконец, если вы хотите предотвратить доступ к каталогам со стороны других пользователей.

chmod 2770 /srv/svn/FirmA
chmod 2770 /srv/svn/FirmB
chmod 2770 /srv/svn/FirmC
Дж. М. Беккер
источник
2
Предупреждение: это должно работать, но удаляет бит разрешения на выполнение для всех файлов. Это нормально, если ваше дерево каталогов содержит только документы. Если он содержит исполняемые файлы, это предотвратит выполнение, что может испортить ваши настройки.
Стефан Гурихон
1
Это также может быть хорошей идеей, но не отвечает на вопрос вообще.
выступление
Это, как описано, разделяет только три папки, так что только члены каждой фирмы могут изменять только свои соответствующие файлы - это не дает 'svn' доступ, который ему необходим.
Рич Р
Это очень близко, хотя. Чего не хватает, чтобы дать вам доступ ко всем группам. Добавьте этот шаг, предполагая, что ваш логин svnadmin: sudo usermod -a -G FirmA,FirmB,FirmC svnadmin Это добавит svnadminко всем этим группам. Поскольку для файлов во всех этих группах включена «групповая запись» ( chmod 664сделали это), вы, кроме firmX, будете единственными создателями файлов, принадлежащих firmX.
Богатый р
1
Лучше - измените разрешения, чтобы добавить / вычесть то, что вы хотите добавить / вычесть - например, сделатьfind /srv/svn/FirmA -type f -print0 | xargs -0 chmod ug+rw,o+r,o-wx
богатые р
25

Вы можете иметь только одну группу в качестве владельца .

Однако, используя списки контроля доступа, вы можете определить разрешения для других групп.

Проверьте, установлен ли у вас ACL, выдав команду getfacl. Если в вашей системе не установлен ACL, установите инструменты командной строки, которые входят в aclпакет :sudo apt-get install acl

С getfaclего помощью вы можете прочитать информацию ACL о каталоге или другом файле, а также setfaclможете добавить группы в файл.

Например:

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

Добавление группы devFirmBс г EAD, ш Rite, е х ecute разрешения на доступ к каталогу /srv/svn.

Если вы также хотите, чтобы файлы, созданные в этом каталоге, принадлежали нескольким группам, установите ACL в качестве ACL по умолчанию. Запись Xв группе по умолчанию означает «разрешить выполнение, если исполняется владельцем (или кем-либо еще)».

setfacl -m g:devFirmB:rwx /srv/svn/  
setfacl -d -m g:devFirmB:rwX /srv/svn/  
jcbermu
источник
6

Невозможно иметь файл, принадлежащий нескольким группам Linux с традиционными разрешениями Unix. (Тем не менее, это возможно с ACL .)

Но вы можете использовать следующий обходной путь и создать новую группу (например, вызываемую devFirms), которая будет включать всех пользователей групп devFirmA, devFirmBи devFirmC.
Вы создаете новые группы пользователей с:

sudo addgroup NEWGROUPNAME

Во-первых, вам может потребоваться установить id-utilsкоманду lid-com:

sudo apt-get install id-utils

Затем вы можете запустить следующую строку кода, чтобы легко скопировать всех пользователей SOURCEGROUPв TARGETGROUP. Конечно, вы должны выполнить команду один раз для каждой группы, которую вы хотите скопировать. Не забудьте заменить заглавные буквы на названия групп.

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

Так что в вашем случае вам нужно будет выполнить команду (все строки сразу):

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

Обратите внимание, что эти команды копируют только всех пользователей, которые являются текущими членами исходных групп. Каждый пользователь, который будет добавлен позже, также должен быть добавлен вручную в вашу общую группу с помощью adduserкоманды. Просто замените заглавные заполнители еще раз фактическим именем пользователя и группы ( devFirms):

sudo adduser NEWUSER TARGETGROUP

Спасибо Джастину Этье за его ответ в Unix & Linux.SE: Добавить всех пользователей одной группы в другую группу?

Byte Commander
источник
@ Жиль, как вы думаете, ваша схема будет работать для нескольких хранилищ сервера Subversion с несколькими пользователями, как в моем обновлении вопроса?
KernelPanic
2

Нет, это невозможно.

Каждый файл (а также каталоги) может иметь только одного пользователя и одну группу.

Уве Плонус
источник
6
Было бы неплохо обеспечить альтернативный подход для получения того же или аналогичного результата.
Byte Commander
2

Чтобы предоставить разные права нескольким группам или пользователям, используйте следующие команды (проверено на RHEL 6 и 7):

Чтобы сделать нового владельца группы:

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

Чтобы проверить текущие настройки ACL:

getfacl <directory_name>
Mr.H
источник
Протестировано, работает на Ubuntu 16.04.3 тоже
Дмитрий