Как сделать так, чтобы разрешение нового файла наследовало от родительского каталога?

85

У меня есть каталог под названием data. Затем я запускаю скрипт под идентификатором пользователя «робот». робот пишет в dataкаталог и обновляет файлы внутри. Идея в том, dataчто я и робот открыты для обновления.

Поэтому я настроил группу прав и владельцев следующим образом

drwxrwxr-x  2 me robot-grp 4096 Jun 11 20:50 data

где и я, и робот принадлежит к «robot-grp». Я изменяю разрешение и группу владельцев рекурсивно, как родительский каталог.

Я регулярно загружаю новые файлы в dataкаталог, используя rsync. К сожалению, новые загруженные файлы не наследуют разрешения родительского каталога, как я надеюсь. Вместо этого это выглядит так

-rw-r--r-- 1 me users       6 Jun 11 20:50 new-file.txt

Когда робот пытается выполнить обновление new-file.txt, происходит сбой из-за отсутствия разрешения на доступ к файлу.

Я не уверен, поможет ли установка umask. В любом случае новые файлы на самом деле не следуют этому.

$ umask -S
u=rwx,g=rx,o=rx

Я часто путаюсь с разрешением файла Unix. У меня даже есть правильный план? Я использую Debian Lenny.

Вай Ип Тунг
источник

Ответы:

53

Вы не хотите менять umask по умолчанию для вашей системы, это угроза безопасности. Параметр sticky bit будет работать до некоторой степени, но лучше использовать ACL. Это проще, чем вы думаете. Проблема с базовыми ACL состоит в том, что они не являются рекурсивными по умолчанию. Если вы установите ACL для каталога, то только файлы внутри этого каталога наследуют ACL. Если вы создаете подкаталог, он не получает родительский ACL, если ACL не установлен для рекурсии.

Во-первых, убедитесь, что ACL включены для тома, на котором находится каталог. Если у вас есть tune2fs, вы можете выполнить следующее:

# tune2fs -l /dev/sda1 | grep acl
Default mount options:    user_xattr acl

Если у вас нет tune2fs, то изучите fstabs:

# cat /etc/fstab 
/dev/system/root        /                       ext3    defaults        1 1
/dev/system/home        /home                   ext3    defaults        1 2
/dev/storage/data       /data                   ext3    defaults        1 2
LABEL=/boot             /boot                   ext3    defaults        1 2

Четвёртый столбец, который говорит «по умолчанию», означает, что в моей системе (CentOS 5.5) ACL включены. Если вы сомневаетесь, оставьте его по умолчанию. Если вы пытаетесь установить ACL , и это ошибки из, вернитесь назад и добавьте параметр аКЛ в / и т.д. / Fstab сразу после дефолтов: defaults,acl.

Из того, что я понимаю, вы хотите, чтобы у всех в группе пользователей был доступ на запись в каталог данных. Это достигается следующим:

setfacl -Rm g:users:rwX,d:g:users:rwX data/
churnd
источник
Я использовал эту команду, но это не решило мою проблему, как я могу отменить эту команду, пожалуйста?
Итай Ганот
Сделал трюк на Ubuntu с sudo setfacl -Rm g:users:rwX,d:g:users:rwX /var/www/logs_or_something. Возникла проблема с тестами PHPUnit. После создания лог-файлов из запущенных тестов пользователь apache www-dataне смог их записать / прочитать.
s3m3n
2
@Itai Ganot - согласно setfaclстранице руководства , -bили --remove-allудаляет расширенные ACL.
jww
Итак, вы бы просто добавить setfacl -Rm g:users:rwX,d:g:users:rwX data/в конце /etc/fstab?
425
@ Пина нет. единственное изменение, которое вы вносите в / etc / fstab, это изменение defaultsна defaults,acl. setfaclэто команда, которую вы должны запустить из терминала. data/должен быть заменен путем к каталогу, который вы хотите изменить.
Сегфо
32

Пометка каталога setgid ( g+s) заставит новые файлы наследовать групповое владение каталогом, но -gопция rsync попытается переопределить это.

Игнасио Васкес-Абрамс
источник
11
Бит setgid заставляет созданные файлы наследовать группу /, если человек, создавший новый файл, является членом этой группы; если создатель является владельцем, но не членом группы, или каталог доступен для записи всем, бит setgid ничего не сделает. И umask для всех пользователей, создающих файлы, все еще должен быть установлен, чтобы разрешить соответствующий групповой доступ.
dannysauer
1
@dannysauer "если создатель является владельцем, но не членом группы ... бит setgid ничего не сделает" - спасибо. Имеет смысл сейчас - но без обратной связи от rsync задавался вопросом, почему это не работает.
user12345
4

Другие ответы применимы в общем случае, но, как вы упомянули, что rsync является источником проблемы, вам может потребоваться просто настроить его вызов.

Для начала, популярный -aфлаг делает rsync разрешения на копирование; использовать -rвместо -aили добавить -no-p(для синхронизации без разрешения) и -no-g(для синхронизации группы). Также rsync поддерживает --chmodфлаг для изменения прав доступа к вновь создаваемым файлам.

МБк
источник
3

Ваш umask не подходит для разрешений, которые вы хотите. Вам нужен umask 002. В настоящее время у вас есть umask 022. Кроме того, комментарий о создании setgid каталога правильный, но я не уверен, хотите ли вы изменить принадлежность файловой группы или нет.

Права доступа к файлам Unix на самом деле очень простая модель. Я нахожу ACL полностью запутывающими себя. :-)

всевозможный
источник
4
«Права доступа к файлам Unix на самом деле очень простая модель. Я нахожу, что списки ACL полностью меня смущают». - Я как бы чувствую обратное (но +1 в любом случае). ACL (и Allow / Deny ACE) просты, а разрешения Unix не имеют смысла. Но это от парня, который страдает от установки Postfix / Dovecot / Clam / SpamAssassin.
августа