У меня есть некоторые 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: r-x. Как мне указать это намерение с помощью 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--
Что ж, но ваш пример делает именно то, что вы хотите;)
Посмотрите на вторую:
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--
Важная строка:
user:apache:r-x #effective:r--
Несмотря на то, что для acl установлено значение r-x, для файлов это фактически r--. Это из-за маски.
И маска всегда будет только rw- для файлов, если пользователь создал ее с правами rw- для пользователя. (Я не уверен на 100%, но маска не может быть менее строгой, чем базовые разрешения).
Таким образом, вы получаете r-- для файлов и r-x для каталогов.
Поскольку созданные каталоги будут иметь user: r-x -> маска будет r-x -> эффективное разрешение будет r-x.
Для файлов: у них будет r - поэтому маска будет r - и эффективные разрешения для ACL также будут r--. (Если вы создадите файл и предоставите ему права доступа user :: r-x, тогда маска будет изменена, и пользователи из acl также получат x)
К сожалению, это просто невозможно сделать с ACL Linux. Это правда, что маска будет делать именно то, что вы хотите, с точки зрения эффективных разрешений. Но в следующий раз, когда вы выполните операцию по пересчету маски прав, бац, все ваши файлы станут исполняемыми.
С таким же успехом вы можете просто смириться с тем, что все файлы в ACL будут исполняемыми. На самом деле это просто удобство, а не функция безопасности, и пока вы не помещаете эти папки в свой $ PATH, это не должно быть проблемой. Если вас это по-прежнему беспокоит, единственный выбор - поместить папки, контролируемые ACL, в файловую систему, смонтированную без возможности выполнения.
-d (или --default) используется для установки значений по умолчанию в каталоге, чтобы все, что создано в нем, наследовало перма (как вы, кажется, делаете).
Вот краткий обзор. http://www.vanemery.com/Linux/ACL/linux-acl.html#default
Невозможно, чтобы файлы имели одно значение по умолчанию, а каталоги имели другое значение по умолчанию.
Вы можете запустить сценарий из cron, который каждую минуту выполняет setfacl для всех каталогов, хотя это далеко не идеальное решение.
найти / путь / к / верх / каталог -тип d -exec setfacl -dm u: apache: rx {} \;
или
найти / путь / к / верх / каталог -тип d | xargs setfacl -dm u: apache: rx
это сообщение о ACL и масках действительно помогло мне понять, как делать то, что я хочу, и почему.
Недостаток моего понимания заключался в том, что при создании файла ядро использует набор разрешений по умолчанию 0666 и для новых каталогов 0777. Таким образом, по умолчанию для каталогов будет установлен бит выполнения (перемещения).
Маска ACL - это, по сути, способ установить umask
на уровне каталога / файла / пользователя.