Назад | Перейти на главную страницу

Конфликты между 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

Это ошибка gnu mkdir: http://savannah.gnu.org/bugs/?19546 Невозможно отключить традиционные разрешения Unix. поскольку mkdir работает, вы можете написать функцию оболочки, которая переопределяет mkdir. В функции оболочки найдите -p в аргументах и ​​запустите серию не-p-using mkdirs вместо этого.

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