Конфликты между ACL и umask
У меня есть каталог, который может быть прочитан и записан парой групп Unix. Это достигается с помощью ACL. Давайте предположим, что я сделал это так:
mkdir /tmp/test
setfacl -d -m g:group1:rwx /tmp/test
Прекрасно работает, вся группа (и другие группы, которые я добавляю вот так) может читать / писать в этот каталог. НО есть одно исключение: когда кто-то создает подпапку с помощью mkdir -p
затем этот каталог создается с разрешениями unix 0755, потому что значение umask по умолчанию - 022. Это приводит к проблеме, из-за которой другие пользователи группы больше не могут писать в эту подпапку, поскольку ACL теперь выглядит следующим образом:
group:group1:rwx #effective:r-x
По какой-то причине этого не происходит при использовании "mkdir" (без аргумента -p). Одним из решений является установка значения umask на 002, но это действительно плохо, поскольку это также влияет на файлы и каталоги, созданные вне каталогов, контролируемых ACL, и эти файлы не должны быть доступны для записи группой по умолчанию.
Поэтому мне интересно, есть ли другая возможность решить эту проблему. Было бы идеально иметь возможность полностью отключить / проигнорировать старые разрешения в стиле Unix для каталога, управляемого ACL. Или отключите этот "эффективный ACL" материал. Это возможно? Или есть другой способ решить проблему с неперезаписываемыми каталогами, вызванную такими программами, как "mkdir -p"? В конце я хочу каталог, который полностью (и рекурсивно) читается и записывается в соответствии с настроенными мной ACL, и это никогда не должно изменяться (только путем изменения самих ACL).
Примечание: для воспроизведения проблемы:
$ mkdir /tmp/test
$ setfacl -d -m g:group1:rwx /tmp/test
$ umask 0022
$ mkdir /tmp/test/aa
$ mkdir -p /tmp/test/bb
$ ls -log /tmp/test
drwxrwxr-x+ 2 4096 Mar 9 23:38 aa
drwxr-xr-x+ 2 4096 Mar 9 23:38 bb
$ getfacl /tmp/test/bb | grep ^group:group1
group:group1:rwx #effective:r-x
3 ответа
Это ошибка с GNU mkdir
: http://savannah.gnu.org/bugs/?19546 Нет способа отключить традиционные разрешения Unix. поскольку mkdir
работает, вы могли бы написать функцию оболочки, которая переопределяет mkdir
, В функции оболочки ищите -p
в аргах и запустить серию без использования р mkdir
вместо.
Многие системы на базе Linux сейчас используют umask 0002 с частными группами пользователей, поэтому эта проблема не возникает.
Это была ошибка с GNU mkdir
( # 14371), это было исправлено в coreutils 8.22.
- затронуты: затронуты Debian Wheezy 7, RHEL/CentOS 5 и 6 (и, вероятно, Ubuntu Trusty 14.04)
- не затронуты: Debian 8 Jessie, RHEL/CentOS 7 (и, вероятно, Tbuntu Utopic 14.10)
Есть несколько обходных путей.
Обходной путь № 1: обертка (уже предложено Марком Вагнером)
Поскольку mkdir работает, вы можете написать функцию оболочки, которая переопределяет mkdir (или скрипт /usr/local/bin/mkdir, как обычно до /bin). Этот скрипт ищет -p в аргументах, а затем рекурсивно вызывает mkdir без "-p".
Обходной путь № 2: Umask 0002
Если вы можете контролировать скрипт, который вызывает mkdir, вы можете установить маску перед вызовом mkdir:
(umask 0002 ; mkdir -p /path/to/dir)
Ваши другие вопросы:
Поэтому мне интересно, есть ли другая возможность решить эту проблему. Было бы идеально иметь возможность полностью отключить / проигнорировать старые разрешения в стиле Unix для каталога, управляемого ACL.
Нет, для совместимости требуются разрешения, также прочитайте. Почему chmod(1) в группе влияет на маску ACL?
Или отключите этот "эффективный ACL" материал.
нет
Вы пытались установить бит setgid в директории, содержащей? Это должно обеспечить одинаковые разрешения для всех новых файлов и каталогов в нем.