Как umask влияет на ACL?

Может ли кто-нибудь объяснить мне, как umask влияет на маску по умолчанию вновь созданных файлов, если ACL активированы? Есть ли документация об этом?

Пример:

 $ mkdir test_dir && cd test_dir $ setfacl -md:someuser:rwx -mu:someuser:rwx . # give access to some user $ getfacl . # file: . # owner: myUsername # group: myGroup user::rwx user:someuser:rwx group::--- mask::rwx other::--- default:user::rwx default:user:someuser:rwx default:group::--- default:mask::rwx default:other::--- $ umask # show my umask 077 $ echo "main(){}" > xc # minimal C program $ make x # build it cc xc -ox $ getfacl x # file: x # owner: myUsername # group: myGroup user::rwx user:someuser:rwx #effective:rw- group::--- mask::rw- other::--- по $ mkdir test_dir && cd test_dir $ setfacl -md:someuser:rwx -mu:someuser:rwx . # give access to some user $ getfacl . # file: . # owner: myUsername # group: myGroup user::rwx user:someuser:rwx group::--- mask::rwx other::--- default:user::rwx default:user:someuser:rwx default:group::--- default:mask::rwx default:other::--- $ umask # show my umask 077 $ echo "main(){}" > xc # minimal C program $ make x # build it cc xc -ox $ getfacl x # file: x # owner: myUsername # group: myGroup user::rwx user:someuser:rwx #effective:rw- group::--- mask::rw- other::--- по $ mkdir test_dir && cd test_dir $ setfacl -md:someuser:rwx -mu:someuser:rwx . # give access to some user $ getfacl . # file: . # owner: myUsername # group: myGroup user::rwx user:someuser:rwx group::--- mask::rwx other::--- default:user::rwx default:user:someuser:rwx default:group::--- default:mask::rwx default:other::--- $ umask # show my umask 077 $ echo "main(){}" > xc # minimal C program $ make x # build it cc xc -ox $ getfacl x # file: x # owner: myUsername # group: myGroup user::rwx user:someuser:rwx #effective:rw- group::--- mask::rw- other::--- по $ mkdir test_dir && cd test_dir $ setfacl -md:someuser:rwx -mu:someuser:rwx . # give access to some user $ getfacl . # file: . # owner: myUsername # group: myGroup user::rwx user:someuser:rwx group::--- mask::rwx other::--- default:user::rwx default:user:someuser:rwx default:group::--- default:mask::rwx default:other::--- $ umask # show my umask 077 $ echo "main(){}" > xc # minimal C program $ make x # build it cc xc -ox $ getfacl x # file: x # owner: myUsername # group: myGroup user::rwx user:someuser:rwx #effective:rw- group::--- mask::rw- other::--- по $ mkdir test_dir && cd test_dir $ setfacl -md:someuser:rwx -mu:someuser:rwx . # give access to some user $ getfacl . # file: . # owner: myUsername # group: myGroup user::rwx user:someuser:rwx group::--- mask::rwx other::--- default:user::rwx default:user:someuser:rwx default:group::--- default:mask::rwx default:other::--- $ umask # show my umask 077 $ echo "main(){}" > xc # minimal C program $ make x # build it cc xc -ox $ getfacl x # file: x # owner: myUsername # group: myGroup user::rwx user:someuser:rwx #effective:rw- group::--- mask::rw- other::--- по $ mkdir test_dir && cd test_dir $ setfacl -md:someuser:rwx -mu:someuser:rwx . # give access to some user $ getfacl . # file: . # owner: myUsername # group: myGroup user::rwx user:someuser:rwx group::--- mask::rwx other::--- default:user::rwx default:user:someuser:rwx default:group::--- default:mask::rwx default:other::--- $ umask # show my umask 077 $ echo "main(){}" > xc # minimal C program $ make x # build it cc xc -ox $ getfacl x # file: x # owner: myUsername # group: myGroup user::rwx user:someuser:rwx #effective:rw- group::--- mask::rw- other::--- 

Я бы ожидал mask:rwx . Фактически после установки umask например, 027 я получаю ожидаемое поведение.

Я нашел этот пример под заголовком: ACL и MASK в linux . В этой статье показаны следующие примеры, которые, я думаю, помогут понять, как ACL и umask взаимодействуют друг с другом.

Задний план

Когда файл создается в системе Linux, применяются разрешения 0666 по умолчанию, тогда как при создании каталога применяются разрешения 0777 по умолчанию.

пример 1 – файл

Предположим, мы установили наш umask в 077 и коснемся файла. Мы можем использовать strace чтобы увидеть, что на самом деле происходит, когда мы делаем это:

 $ umask 077; strace -eopen touch testfile 2>&1 | tail -1; ls -l testfile open("testfile", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3 -rw-------. 1 root root 0 Sep 4 15:25 testfile 

В этом примере мы видим, что системный вызов open() выполняется с разрешениями 0666, однако, когда umask 077 затем применяется ядром, следующие разрешения удаляются ( ---rwxrwx ), и мы остаемся с rw------- aka 0600.

пример – 2 каталог

Та же концепция может быть применена к каталогам, за исключением того, что вместо разрешений по умолчанию, равных 0666, это 0777.

 $ umask 022; strace -emkdir mkdir testdir; ls -ld testdir mkdir("testdir", 0777) = 0 drwxr-xr-x 2 saml saml 4096 Jul 9 10:55 testdir 

На этот раз мы используем команду mkdir . Затем команда mkdir системный вызов mkdir() . В приведенном выше примере мы видим, что команда mkdir называемая системным вызовом mkdir() с разрешениями defaul 0777 ( rwxrwxrwx ). На этот раз с umask 022 удаляются следующие разрешения ( ----w--w- ), поэтому при создании каталогов мы остаемся с 0755 ( rwxr-xr-x ).

Пример 3 (Применение ACL по умолчанию)

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

 $ mkdir acldir $ sudo strace -s 128 -fvTttto luv setfacl -md:u:nginx:rwx,u:nginx:rwx acldir $ getfacl --all-effective acldir # file: acldir # owner: saml # group: saml user::rwx user:nginx:rwx #effective:rwx group::rx #effective:rx mask::rwx other::rx default:user::rwx default:user:nginx:rwx #effective:rwx default:group::rx #effective:rx default:mask::rwx default:other::rx по $ mkdir acldir $ sudo strace -s 128 -fvTttto luv setfacl -md:u:nginx:rwx,u:nginx:rwx acldir $ getfacl --all-effective acldir # file: acldir # owner: saml # group: saml user::rwx user:nginx:rwx #effective:rwx group::rx #effective:rx mask::rwx other::rx default:user::rwx default:user:nginx:rwx #effective:rwx default:group::rx #effective:rx default:mask::rwx default:other::rx по $ mkdir acldir $ sudo strace -s 128 -fvTttto luv setfacl -md:u:nginx:rwx,u:nginx:rwx acldir $ getfacl --all-effective acldir # file: acldir # owner: saml # group: saml user::rwx user:nginx:rwx #effective:rwx group::rx #effective:rx mask::rwx other::rx default:user::rwx default:user:nginx:rwx #effective:rwx default:group::rx #effective:rx default:mask::rwx default:other::rx 

Теперь давайте создадим файл aclfile :

 $ strace -s 128 -fvTttto luvly touch acldir/aclfile # view the results of this command in the log file "luvly" $ less luvly 

Теперь получите разрешения для вновь созданного файла:

 $ getfacl --all-effective acldir/aclfile # file: acldir/aclfile # owner: saml # group: saml user::rw- user:nginx:rwx #effective:rw- group::rx #effective:r-- mask::rw- other::r-- 

Обратите внимание на маску, mask::rw- . Почему это не mask::rwx точно так же, как при создании каталога?

Проверьте файл luvly log, чтобы узнать, какие разрешения по умолчанию были использованы для создания файла:

 $ less luvly |grep open |tail -1 10006 1373382808.176797 open("acldir/aclfile", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3 <0.000060> 

Вот где это становится немного запутанным. Когда маска установлена ​​в rwx когда каталог был создан, вы ожидаете такого же поведения для создания файла, но это не сработает. Это связано с тем, что ядро ​​вызывает функцию open() со стандартными разрешениями 0666 .

Обобщить

  • Файлы не получат разрешения на выполнение (маскирование или действие). Не имеет значения, какой метод мы используем: ACL, umask, или mask & ACL.
  • Каталоги могут получить разрешения на выполнение, но это зависит от того, как установлено поле маскировки.
  • Единственный способ установить права выполнения для файла, который находится под правами ACL, – это вручную установить их с помощью chmod .

Рекомендации

  • acl man page