Я знайшов цей приклад під назвою: 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-------
ака 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()
системний виклик з дозволами за замовчуванням 0777
( rwxrwxrwx
). На цей раз за допомогою umask з 022
наступних дозволів видалено ( ----w--w-
), тому нам залишається 0755 ( rwxr-xr-x
), коли створені каталоги.
приклад 3 (Застосування ACL за замовчуванням)
Тепер давайте створимо каталог і продемонструємо, що відбувається, коли до нього застосовано ACL за замовчуванням разом з файлом всередині нього.
$ mkdir acldir
$ sudo strace -s 128 -fvTttto luv setfacl -m d: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::r-x #effective:r-x
mask::rwx
other::r-x
default:user::rwx
default:user:nginx:rwx #effective:rwx
default:group::r-x #effective:r-x
default:mask::rwx
default:other::r-x
Тепер створимо файл 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::r-x #effective:r--
mask::rw-
other::r--
Зверніть увагу на маску, mask::rw-
. Чому це не mask::rwx
так, як було створено каталог?
Перевірте luvly
файл журналу, щоб побачити, які дозволи за замовчуванням використовувались для створення файлу:
$ 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 або маска та ACL.
- Довідники можуть отримати дозволи на виконання, але це залежить від того, як встановлено поле маскування.
- Єдиний спосіб встановити дозволи на виконання файлу, який знаходиться під дозволом ACL - це встановити їх вручну за допомогою
chmod
.
Список літератури
mask::rw-
. Але це насправді не ваше питання, правда?