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

12

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

Пример:

$ mkdir test_dir && cd test_dir
$ setfacl -m d:someuser:rwx -m u: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(){}" > x.c # minimal C program
$ make x # build it
cc     x.c   -o x
$ getfacl x
# file: x
# owner: myUsername
# group: myGroup
user::rwx
user:someuser:rwx           #effective:rw-
group::---
mask::rw-
other::---

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

jofel
источник
С umask 077 вы получите mask::rw-. Но это не совсем твой вопрос, верно?
SLM
@slm Это часть моего вопроса. Я хочу знать, как маска новых файлов зависит от umask. Я был довольно удивлен, что с 077 я получаю, mask::rw-а не mask::rwxкоторый был маской по умолчанию каталога.
Джофель
Хорошо, я обновляю свой ответ сейчас с примерами, которые должны помочь прояснить это. Дай мне пару минут.
SLM
Этот вопрос тесно связан.
Джофель

Ответы:

10

Я нашел этот пример под названием: 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 или mask & ACL.
  • Каталоги могут получать разрешения на выполнение, но это зависит от того, как установлено поле маскирования.
  • Единственный способ установить разрешения на выполнение для файла, который находится под разрешениями ACL, - это установить их вручную chmod.

Ссылки

SLM
источник
@jofel - дай мне знать, если это имеет смысл.
SLM
@ Спасибо большое за подробный ответ. Это приближает меня к моей реальной проблеме: разрешение группы в системном вызове chmod влияет на маску файла ( chmod("file",0760)-> mask:rw, chmod("file",0770)-> mask:rwx). Может быть, я должен начать новый вопрос об этом ...
Jofel
@jofel - да, это звучит как другой вопрос.
SLM
@ и я уже ответил здесь .
Джофель
«Когда файл создается в системе Linux, применяются разрешения по умолчанию 0666 ...» - ну, это не совсем верно, так как дело за созданием приложения.
ilkkachu
2

в целях безопасности операционная система Linux не допускает автоматического создания файла с битом выполнения. Это сделано для того, чтобы кибер-злоумышленники не могли записывать программы в такие файлы и выполнять их, если они получат доступ к вашему серверу. Это всего лишь мера предосторожности. Вам навсегда придется вручную установить бит выполнения для файлов после их создания с помощью утилиты chmod

Арни
источник