Конфликты между 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 в директории, содержащей? Это должно обеспечить одинаковые разрешения для всех новых файлов и каталогов в нем.

Другие вопросы по тегам