Как по-разному установить ACL по умолчанию для каталогов и файлов

10

У меня есть некоторые списки ACL, определенные в каталоге как:

# owner: root
# group: root
user::rwx
group::r--
mask::r-x
other::r--
default:user::r--
default:group::r--
default:mask::r-x
default:other::r--

Я хотел бы, чтобы любые новые файлы, созданные в этой папке, были u: apache: r--, а любые новые каталоги - u: apache: rx. Как мне указать это намерение, используя ACL?

Я попробовал, -dm u:apache:rXи это, кажется, не делает ничего другого по сравнению с простоrx

overt htdocs # getfacl .
# file: .
# owner: root
# group: root
user::rwx
user:apache:r--
group::r--
mask::r-x
other::r--
default:user::r--
default:user:apache:r--
default:group::r--
default:mask::r--
default:other::r--

overt htdocs # setfacl -dm u:apache:rx .
overt htdocs # touch blah.txt
overt htdocs # getfacl blah.txt
# file: blah.txt
# owner: root
# group: root
user::r--
user:apache:r-x                 #effective:r--
group::r--
mask::r--
other::r--

overt htdocs # rm blah.txt
overt htdocs # setfacl -dm u:apache:rX .
overt htdocs # touch blah.txt
overt htdocs # getfacl blah.txt
# file: blah.txt
# owner: root
# group: root
user::r--
user:apache:r-x                 #effective:r--
group::r--
mask::r--
other::r--

Разрешение с большой буквы X кажется полезным только для установки текущих разрешений, а не для установки разрешений по умолчанию:

overt htdocs # setfacl -x u:apache blah.txt
overt htdocs # getfacl blah.txt
# file: blah.txt
# owner: root
# group: root
user::r--
group::r--
mask::r--
other::r--

overt htdocs # setfacl -m u:apache:rX blah.txt
overt htdocs # getfacl blah.txt
# file: blah.txt
# owner: root
# group: root
user::r--
user:apache:r--
group::r--
mask::r--
other::r--
joshperry
источник

Ответы:

7

Хорошо, но ваш пример делает именно то, что вы хотите;)

Посмотрите на второй:

overt htdocs # setfacl -dm u: apache: rx.
overt htdocs # touch blah.txt
overt htdocs # getfacl blah.txt
# file: blah.txt
# владелец: root
# группа: корень
Пользователь :: r--
пользователь: apache: rx #effective: r--
группа :: r--
Маска :: r--
другое :: r--

Важная строка:

user:apache:r-x #effective:r--

Несмотря на то, что для acl установлено значение rx, для файлов это фактически r--. Это из-за маски.

И маска всегда будет только для файлов, если пользователь создал ее с правами доступа для пользователя. (Я не уверен на 100%, но маска не может быть менее строгой, чем основные разрешения).

Таким образом, вы получаете r-- для файлов и rx для каталогов.
Поскольку созданные каталоги будут иметь пользователя: rx -> mask будет rx -> эффективное разрешение будет rx.
Для файлов: у них будет r--, поэтому маска будет r--, а эффективные разрешения для ACL будут тоже r--. (Если вы создадите файл и дадите ему права user :: rx, то маска будет изменена, и пользователи из acl получат и x)

шелк
источник
Полностью пропустил #effectiveтекст! Спасибо за объяснение того, как маски влияют на эффективные разрешения.
Джошперри
2

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

Вы также можете смириться с тем, что все файлы в ACL будут исполняемыми. Это на самом деле просто удобство, а не функция безопасности, и до тех пор, пока вы не поместите эти папки в $ PATH, это не должно быть проблемой. Если это по-прежнему вас беспокоит, единственный вариант - поместить управляемые ACL папки в файловую систему, смонтированную без опции execute.

Rashkae
источник
1

-d (или --default) используется для установки значений по умолчанию в каталоге, чтобы созданные в нем объекты наследовали привилегии (как вы, похоже, делаете).

Вот краткий обзор. http://www.vanemery.com/Linux/ACL/linux-acl.html#default

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

Вы можете запустить скрипт из cron, который выполняет setfacl для всех папок каждую минуту - хотя это не идеальное решение.

find / path / to / top / dir -type d -exec setfacl -dm u: apache: rx {} \;

или

find / path / to / top / dir -type d | xargs setfacl -dm u: apache: rx

aspitzer
источник
1

Этот пост о ACL и Масках действительно помог мне понять, как делать то, что я хотел, и почему.

Недостающая часть моего понимания состояла в том, что при создании файла ядро ​​использует набор разрешений по умолчанию 0666 и для новых каталогов 0777. Таким образом, по умолчанию в каталогах будет установлен бит выполнения (traverse).

Маска ACL - это в основном способ установки umaskна уровне каталога / файла / пользователя.

joshperry
источник