Сделать все новые файлы в каталоге доступным для группы

131

Предположим, у меня есть два пользователя: Алиса и Боб, группа GROUPNAME и папка foo, оба пользователя являются членами GROUPNAME (используют Linux и ext3).

Если я сохраню как пользователь Алисе файл под foo, разрешения являются: -rw-r--r-- Alice Alice. Однако возможно ли добиться того, чтобы у каждого файла, сохраненного в некотором подкаталоге, fooбыли права -rwxrwx--- Alice GROUPNAME(например, владелец Алиса, группа GROUPNAME)?

ученик
источник

Ответы:

91

Вы можете контролировать назначенные биты разрешения с umask, а группа, сделав каталог setgid в GROUPNAME.

$ umask 002            # allow group write; everyone must do this
$ chgrp GROUPNAME .    # set directory group to GROUPNAME
$ chmod g+s .          # files created in directory will be in group GROUPNAME

Обратите внимание, что вы должны сделать chgrp/ chmodдля каждого подкаталога; он не распространяется автоматически (то есть ни существующие, ни впоследствии созданные каталоги в каталоге setgid не будут setgid , хотя последние будут в группе GROUPNAME).

Также обратите внимание, что umaskэто атрибут процесса, который применяется ко всем файлам, созданным этим процессом и его дочерними элементами (которые наследуют umaskдействующий родительский элемент в данный fork()момент времени). Пользователям может потребоваться установить это ~/.profile, и им, возможно, придется остерегаться вещей, не связанных с вашим каталогом, для которых требуются различные разрешения. Модули могут быть полезны, если вам нужны разные настройки при выполнении разных задач.

Вы можете контролировать вещи немного лучше, если можете использовать POSIX ACL; должна быть возможность указать маску разрешений и группу и обеспечить их разумное распространение. Однако поддержка ACL для POSIX несколько переменная.

geekosaur
источник
6
Подкаталоги, созданные после установки setgid в родительском каталоге, будут автоматически установлены setgid.
Arrowmaster
2
@Arrowmaster: Возможно, в некоторых системах, но не во всех; Я тестировал на OSX, и он не распространяется, по крайней мере, для не-root.
geekosaur
2
Хорошо в Debian (и я предполагаю, что большинство других дистрибутивов Linux) распространяют setgid и имя группы.
Arrowmaster
3
В OS X бит setgid в каталоге просто игнорируется; новым файлам и каталогам всегда присваивается группа, в которой они находятся.
Джон Флатнесс
Также возможно, что файлы, скопированные или перемещенные в foo (используя cp или mv), автоматически получат нужные разрешения ( -rwxrwx--- A G)?
ученик
106

Если это вообще возможно, используйте списки контроля доступа (ACL) .

В Linux убедитесь, что используемая вами файловая система поддерживает ACL (большинство файловых систем unix поддерживают). Возможно, вам потребуется изменить параметры монтирования, чтобы включить списки ACL: для ext2 / ext3 / ext4 вам необходимо aclявно указать опцию монтирования, поэтому запись /etc/fstabдолжна выглядеть следующим образом /dev/sda1 / ext4 errors=remount-ro,acl 0 1. Запустите, mount -o remount,acl /чтобы активировать ACL без перезагрузки. Также установите инструменты командной строки ACL getfaclи setfacl, как правило, предоставляются в виде пакета acl.

Теперь, когда однократная установка завершена, измените ACL каталога, чтобы дать группе разрешение на запись и сделать эти разрешения унаследованными вновь созданными файлами. Под Linux:

setfacl -d -m group:GROUPNAME:rwx /path/to/directory
setfacl -m group:GROUPNAME:rwx /path/to/directory

Если списки управления доступом не вариант, сделать каталог , принадлежащий группе GROUPNAME, и установить права доступа к 2775 или 2770: chmod g+rwxs /path/to/directory. sЗдесь означает setgid бит; для каталога это означает, что файлы, созданные в этом каталоге, будут принадлежать группе, которой принадлежит каталог.

Вам также необходимо установить Алиса и Боб Umask , чтобы сделать все свои файлы группы перезаписываемые по умолчанию. Значение umask по умолчанию в большинстве систем - 022, что означает, что файлы могут иметь все разрешения, кроме записи по группам и других. Измените это на 002, что означает запретить только разрешение на запись другим. Обычно вы устанавливаете эту настройку в вашем ~/.profile:

umask 002    # or 007 to have files not readable by others
жилль
источник
6
+1 - очень подробный ответ. Я никогда не знал, что можно перемонтировать / на лету. Хорошо знать.
Boehj
1
Эта команда setfacl -d не работает для меня, потому что файлы, содержащиеся в этом каталоге, имеют маску r--, которая отменяет любые разрешения на запись. Хотелось бы помочь. См. Unix.stackexchange.com/questions/71743/…
Бен Макканн,
2
@its_me Q1: я показываю mountкоманду с remountопцией, поэтому она не используется fstab. Наличие aclдвойного означает, что файловая система уже смонтирована с aclопцией, и это безвредно. кстати, по acl умолчанию для ext4 в последних ядрах (патч был еще совсем новым, когда я писал этот ответ). Q2: вы можете запускать команды в любом порядке.
Жиль
1
@its_me Да, ваше понимание верно, просто не имеет значения, в каком порядке вы добавляете записи
Gilles
8
Вы должны улучшить ответ, а не использовать GROUPNAMEего G, чтобы сделать его более понятным
knocte
24

Этот вопрос хорошо подходит для Linux acl. Поскольку вы не указали свою ОС, я буду считать Linux следующим. Вот пример сеанса.

Я не знаю действительно хорошего aclучебника, но вы могли бы сделать хуже, чем http://www.vanemery.com/Linux/ACL/linux-acl.html

Обратите внимание, что по умолчанию aclведет себя как локальный umask. Поскольку, по крайней мере, в Linux, маски umask применяются глобально, я знаю, что это единственный способ получить эффект локального маски umask. По какой-то причине это малоизвестная особенность. В сети полно людей, спрашивающих о локальном переопределении umask, но почти никто, кажется, не думает об использовании acl.

Также обратите внимание, что вам нужно смонтировать раздел, в котором вы работаете с aclподдержкой, например.

/dev/mapper/debian-acl /mnt/acl        ext3    defaults,acl        0       2

Сессия следует:

/mnt/acl$ mkdir foo
/mnt/acl$ getfacl foo
# file: foo
# owner: faheem
# group: faheem
user::rwx
group::r-x
other::r-x

Установите группу, fooчтобы быть staff, и установите ACL группы и пользователя, fooчтобы rwx.

/mnt/acl$ chgrp staff foo
/mnt/acl$ setfacl -R -m u::rwx,g::rwx foo
/mnt/acl$ getfacl foo
# file: foo
# owner: faheem
# group: staff
user::rwx
group::rwx
other::r-x

Установите также acls по умолчанию для пользователя и группы rwx. Это определяет разрешения, от которых наследуются файлы и каталоги foo. Таким образом, все файлы и каталоги, созданные в foo, будут иметь групповые разрешения rw.

/mnt/acl$ setfacl -d --set u::rwx,g::rwx,o::- foo
/mnt/acl$ getfacl foo
# file: foo
# owner: faheem
# group: staff
user::rwx
group::rwx
other::r-x
default:user::rwx
default:group::rwx
default:other::---

Теперь создайте несколько файлов в fooкачестве пользователей faheemи john.

/mnt/acl$ cd foo
/mnt/acl/foo$ touch bar

# switch to user john for this next command.

/mnt/acl/foo$ touch baz

Список файлов. Обратите внимание, что как файлы, принадлежащие, так faheemи файлы, принадлежащие им john, создаются с правами группы rw.

/mnt/acl/foo$ ls -la
total 3
drwxrwxr-x+ 2 faheem staff  1024 May  9 01:22 .
drwxr-xr-x  4 faheem faheem 1024 May  9 01:20 ..
-rw-rw----  1 faheem faheem    0 May  9 01:20 bar
-rw-rw----  1 john   john      0 May  9 01:22 baz
Фахим Митха
источник