Установка разных ACL для каталогов и файлов

15

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

Все, кто имеет доступ к этой папке, входят в одну группу, так что это не проблема.

Я смотрел на это через ACL без изменения всех пользовательских масок и тому подобного. Вот мои текущие призывы:

setfacl -Rdm g:mygroup:rwx share_name
setfacl -Rm g:mygroup:rwx share_name

Моя проблема в том, что, хотя я хочу, чтобы все вновь созданные подкаталоги были rwx, я хочу, чтобы только недавно созданные файлы были rw.

У кого-нибудь есть лучший метод для достижения желаемого конечного результата? Есть ли способ установить списки ACL для каталогов отдельно от файлов, в аналогии с chmod +xvs. chmod +X?

Благодарность

Дюрандаль
источник

Ответы:

12

Как указывает Жиль, setfaclразрешения по умолчанию определяют максимальные разрешения, в основном заменяя umask. Таким образом, вновь созданные файлы будут существовать, rwесли только приложение, создавшее файл, не запросит его для запуска.

$ mkdir test
$ touch test/oldfile
$ getfacl test/oldfile
# file: test/oldfile
# owner: myuser
# group: myuser
user::rw-
group::r--
other::r--

$ setfacl -m d:g:mygroup:rwx test
$ touch test/newfile
$ getfacl test/newfile
# file: test/newfile
# owner: myuser
# group: myuser
user::rw-
group::r-x                         #effective:r--
group:mygroup:rwx                  #effective:rw-
mask::rw-
other::r--

Обратите внимание на эффективную химическую завесу выше. (Есть только несколько программ, которые попросят установить бит выполнения для файлов, которые он создает, например, gccдля исполняемых файлов, и cpесли копируемый файл был исполняемым.)

Или вы имели в виду, что первая команда setfacl работала так, как вы хотели, а вторая - нет? Другими словами, вы хотите исправить разрешения для старых файлов, убедиться, что каталоги можно обойти, не предоставляя другим обычным файлам разрешения на выполнение?

Моя версия setfaclпозволяет Xименно так, как вы хотите, например:

setfacl g:mygroup:rwX

$ setfacl --version
setfacl 2.2.49
$ rm -r test
$ mkdir test
$ mkdir test/olddir
$ touch test/oldfile
$ find test -ls
107513    4 drwxr-xr-x   3 myuser    myuser        4096 Dec 22 01:56 test
107539    0 -rw-r--r--   1 myuser    myuser           0 Dec 22 01:56 test/oldfile
107529    4 drwxr-xr-x   2 myuser    myuser        4096 Dec 22 01:56 test/olddir
$ setfacl -Rm g:somegroup:rwx test
$ find test -ls
107513    4 drwxrwxr-x   3 myuser    myuser        4096 Dec 22 01:56 test
107539    0 -rw-rwxr--   1 myuser    myuser           0 Dec 22 01:56 test/oldfile
107529    4 drwxrwxr-x   2 myuser    myuser        4096 Dec 22 01:56 test/olddir
$ rm -r test
$ mkdir test
$ mkdir test/olddir
$ touch test/oldfile
$ setfacl -Rm g:somegroup:rwX test
$ find test -ls
107513    4 drwxrwxr-x   3 myuser    myuser        4096 Dec 22 01:56 test
107539    0 -rw-rw-r--   1 myuser    myuser           0 Dec 22 01:56 test/oldfile
107529    4 drwxrwxr-x   2 myuser    myuser        4096 Dec 22 01:56 test/olddir

Если ваша версия setfaclне поддерживает это, почему бы не использовать find?

перезаписать разрешения, установив для них rw для файлов и rwx для dirs

$ find . \( -type f -exec setfacl -m g:mygroup:rw '{}' ';' \) \
      -o \( -type d -exec setfacl -m g:mygroup:rwx '{}' ';' \)

установить разрешения ACL mygroup на основе существующих разрешений группы

$ find . \( -perm -g+x -exec setfacl -m g:mygroup:rw '{}' ';' \) \
      -o \( -exec setfacl -m g:mygroup:rwx '{}' ';' \)

Возможно, вы захотите проверить, что маска группы предоставляет действующие разрешения. Если нет, вам придется запустить это тоже:

$ find . -type d -exec chmod g+rwX '{}' ';'
Mikel
источник
4

Для будущих читателей, чтобы использовать setfaclсуществующие файлы / папки без добавления исполняемого бита в ваши файлы, решение - это часть ответа @ Mikel :

Моя версия setfacl позволяет X точно так, как вы хотите, например:

setfacl g:mygroup:rwX

Соответствующая выдержка из setfaclдокументации :

Поле perms представляет собой комбинацию символов, которые обозначают разрешения: чтение (r), запись (w), выполнение (x), выполнение только в том случае, если файл является каталогом или уже имеет разрешение на выполнение для некоторого пользователя (X) .

Эрик Купманс
источник
2

Насколько я понимаю, Linux ACL setfacl -Rdm g:mygroup:rwx share_nameделает именно то, что вы хотите. Эксперимент:

umask 007
mkdir foo
chgrp mygroup foo
chmod 2700 foo
setfacl -d -m group:mygroup:rwx foo
setfacl -m group:mygroup:rwx foo
touch foo/data
echo '#!/bin/ls' >foo/exec
chmod +x foo/exec

Тогда как другой пользователь в группе mygroup:

$ cat foo/*
#!/bin/ls
#!/bin/ls
$ ./foo/data
ash: ./foo/data: Permission denied
$ ./foo/exec
./foo/exec

В чем дело?

$ getfacl foo/data
# file: foo/data
# owner: myuser
# group: mygroup
user::rw-
group::---
group:mygroup:rwx                 #effective:rw-
mask::rw-
other::---

Действующий ACL для mygroupявляется результатом и содержит ACL_GROUPзапись для mygroup( rwx) с записью ACL_MASK ( rw-).

Человек страница ACL (5) объясняет расчет это в разделе «алгоритмы доступа проверки». Это не объясняет, как ACL_MASKгенерируются записи, но на практике кажется, что все происходит правильно.

Жиль "ТАК - перестань быть злым"
источник