Как в linux назначить права по умолчанию для каталога и всех создаваемых, копируемых и переносимых файлов и каталогов в нем?
Имеется машина под управлением GNU/Linux Debian Sid. На ней настроена авторизация доменных пользователей Windows. Все доменные пользователи включены в группу «пользователи домена».
Имеется каталог «ShareFolder» (доступ для «пользователи домена» — rwx), на который созданы симлинки в домашние каталоги пользователей (и всех новых через /etc/skel). Так же этот каталог расшарен Samba как «Общие документы» (valid user = «@пользователи домена»).
В настройках Samba для шары указанны параметры:
[Общие документы] comment = Общие документы vt-4 path = /var/ShareFolder read only = no create mask = 0660 directory mask = 0770 force group = "пользователи домена" valid users = "@пользователи домена"
То есть, что бы там пользователи не делали в шаре, все данные будут доступны по правам. Но, локальные пользователи таких настроек не имеют и могут создать каталог/файл, который не будет доступен другим пользователям ни локально, ни через шару.
Собственно вопрос в том, как реализовать «create mask» и «directory mask» для локальных пользователей?
- ACL — назначить по умолчанию для каталога «ShareFolder» группу «пользователи домена» и «mask» значения rwx.
Но, тогда все файлы будут с правами на исполнение, а это не очень хорошо. - fstab — перенести «ShareFolder» куда-нибудь и на его место смонтировать его же, но с umask=0 0 7.
Только вот не у всех пользователей первичная группа «пользователи домена». Да и распространяется это только на создаваемые файлы. - cifs — смонтировать шару по аналогии с предыдущем вариантом.
Пока наиболее «чистый» результат на выходе, но уж больно много посредников. - pam — не уверен, но если в
/etc/pam.d/common-session
/etc/pam.d/common-session-noninteractive
добавить «session optional pam_umask.so umask=0007», то даже при копировании будут меняться права. Но это глобальная опция и как заставить ее работать исключительно для одного каталога неясно.
Linux наследование прав при копировании
Как изменяются права доступа при копировании и перемещении файла.
- кто копирует (перемещает) файлы, root или обычный юзер
- какие программы и с какими ключами при этом используются
- копируется файл «на пустое место» или там уже существует файл с таким именем
Тем не менее, попробуем найти несколько общих правил, определяющих — какие права доступа могут получится в результат.
Во-первых, при копировании (например, командой cp ) создается новый файл, а при перемещении (например, командой mv ) меняется только место расположения файла (и, возможно, имя).
Поэтому, если «рядовой юзер» копирует файл, то действуют все те же правила, что и при создании файла. То есть, владельцем копии становится юзер, который ее создал, группа «наследуется» от директории, а сами права доступа определяются параметром umask.
Строго говоря, если копирование делает root, то эти правила действуют и для него (то есть, владельцем полученной копии будет root , группа будет взята от директории, а права выставятся в соответствии с umask ). Однако, root может изменить поведение команды cp . У этой команды есть ключ ( -p — сохранять p ermissions) который означает, что надо сохранить все атрибуты (владельца, группу и permissions) при копировании.
Обычный же юзер, даже используя ключ -p не сможет сохранить владельца и группу, но получит permissions такие же как у оригинального файла. К тому же биты suid и sgid при этом также «сбрасываются».
Существует еще одна ситуация, когда при копировании сохраняются все атрибуты доступа. Это происходит, когда в «месте назначения» файл с таким именем уже существует. Собственно, в этом случае файл не создается, а только замещается его содержимое. Поэтому, даже если эту операцию проделает обычный юзер (естественно, для этого надо, чтобы ему было разрешено писать в существующий файл), все атрибуты, в том числе владелец и группа сохранятся. Правда, биты suid и sgid все равно «сбросятся».
А вот при перемещении файла все атрибуты сохраняются (даже «опасные» биты suid и sgid ). Однако, не забудьте, что для того, чтобы обычный юзер смог переместить чужой файл, он должен иметь право записи и в ту директорию, куда файл переносится и в ту, откуда он переносится (поскольку, там запись о файле должна быть удалена). Такие ситуации в нормальной системе, как правило, не встречаются.
Наследование прав на файлы и папки в Linux
На самом деле, речь в этой статье пойдёт не только о наследовании прав на файлы и каталоги в операционных системах семейства Linux. Однако наследование прав доступа будет первой и основной темой, которая будет здесь затронута.
Многие пользователи Windows в курсе, как работает система наследования прав. Суть её в том, что пользователи и группы будут иметь те же права на файлы и каталоги, которые они имели по отношению к родительскому каталогу. В Linux механизм наследования работает схожим образом и называется «правами по умолчанию». Несмотря на своё название, права по умолчанию вовсе не задаются автоматически. Их нужно прописать отдельно. Для примера используем каталог пользователя test:
setfacl -d -m u::rwx,g::r-x,o::r-x /home/test/
-d указывает, что команда задаёт права по умолчанию, -m на редактирование прав.
Как видим на скриншоте, использование команды getfacl показало, что в свойствах каталога появились строчки, начинающиеся с default . Именно они и говорят нам о правах по умолчанию для владельца, ассоциированной группы и всех остальных. Не будем забывать, что ACL дозволяет установку прав доступа для отдельных пользователей и групп. Воспользуемся данной возможностью:
setfacl -d -m u:tux:rwx /home/test
Этой командой мы дали пользователю tux те же права по умолчанию, что и у владельца каталога.
Для удаления прав по умолчанию используется команда
Если нужно удалить права по умолчанию и в подкаталогах, то добавьте ключ -R , указывающий на рекурсивное действие:
Кроме наследования прав есть и другие особенности ACL, которые будет полезно рассмотреть. Первым делом рассмотрим сохранение (или нет) ACL-прав при операциях над файлами и папками:
- перемещение файлов и каталогов сохраняет ACL-доступы;
- копирование файлов и каталогов не сохраняет ACL-доступы, если не использован ключ -p ;
- архивирование и распаковка должны проводиться утилитой star (вместо tar).
Как видим, логика операций здесь довольно проста.
Другой интересной возможностью в работе с ACL-правами доступа будут так называемые автоматические операции.
Первой из таких операций является перенос ACL-прав. Это значит, что мы снимаем ACL-права с одного объекта и придаём их другому. Ранее мы рассматривали файл file_test в каталоге /home/test/. Перенесём ACL-доступы с него на файл file_test2 командой
getfacl /home/test/file_test | setfacl --set-file=- /home/test/file_test2
На скриншоте выше можно наблюдать права на файл file_test2 до и после применения команды по переносу ACL-прав.
Если же нужно не перенести, а скопировать ACL-права с одного объекта на другой, то здесь поможет другая команда:
getfacl /home/test/file_test | setfacl -M- /home/test/file_test2
Эта команда не заменит права, как предыдущая, а добавит их к уже существующим.
Еще одним неплохим приемом может стать копирование ACL-прав на каталог в права по умолчанию этого же каталога. По сути, это то же самое, что мы провернули в начале статьи. Вот только тогда мы могли задать любые другие права по умолчанию. А вот если нам надо именно скопировать текущие права, то будет проще воспользоваться следующей командой:
getfacl --access /home/test/dir1/ | setfacl -d -M- /home/test/dir2/
Здесь dir1 и dir2 являются каталогами, между которыми мы копируем права по умолчанию.