Встановлення різних ACL-файлів для каталогів та файлів


15

Я хочу встановити дозволи за замовчуванням для спільного використання файлів, щоб кожен мав rwxусі каталоги та щоб усі новостворені файли були rw.

Усі, хто має доступ до цієї акції, знаходяться в одній групі, тому це не хвилює.

Я розглядав це за допомогою ACL, не змінюючи всі користувацькі умаски та інше. Ось мої поточні виклики:

setfacl -Rdm g:mygroup:rwx share_name
setfacl -Rm g:mygroup:rwx share_name

Моя проблема полягає в тому , що в той час як я хочу , щоб все новостворені піддиректорії бути rwx, я тільки хочу новостворені файли , щоб бути rw.

Хтось має кращий метод досягти бажаного кінцевого результату? Чи є спосіб встановити ACL на каталоги окремо від файлів, аналогічно chmod +xпорівнянні з chmod +X?

Спасибі

Відповіді:


12

Як зазначає Жилль, setfaclдозволи за замовчуванням визначають максимальні дозволи, в основному замінюючи umask. Таким чином, новостворені файли будуть, rwякщо програма, яка створила файл, не попросила спеціально виконати його.

$ mkdir test
$ touch test/oldfile
$ getfacl test/oldfile
# file: test/oldfile
# owner: myuser
# group: myuser
user::rw-
group::r--
other::r--

$ setfacl -m d:g:mygroup:rwx test
$ touch test/newfile
$ getfacl test/newfile
# file: test/newfile
# owner: myuser
# group: myuser
user::rw-
group::r-x                         #effective:r--
group:mygroup:rwx                  #effective:rw-
mask::rw-
other::r--

Зверніть увагу на ефективні препарати вище. (Є лише кілька програм, які попросять встановити біт виконання файлів, які він створює, наприклад, gccдля виконуваних файлів і cpякщо файл, який копіюється, виконувався.)

Або ви мали на увазі, що перша команда setfacl працює так, як ви хотіли, а друга не була? Іншими словами, ви хочете виправити дозволи на старих файлах, переконуючись у тому, що каталоги можуть бути прохідними, не даючи іншим звичайним файлам дозволів на виконання?

Моя версія setfaclдозволює Xточно так, як ви хочете, наприклад:

setfacl g:mygroup:rwX

$ setfacl --version
setfacl 2.2.49
$ rm -r test
$ mkdir test
$ mkdir test/olddir
$ touch test/oldfile
$ find test -ls
107513    4 drwxr-xr-x   3 myuser    myuser        4096 Dec 22 01:56 test
107539    0 -rw-r--r--   1 myuser    myuser           0 Dec 22 01:56 test/oldfile
107529    4 drwxr-xr-x   2 myuser    myuser        4096 Dec 22 01:56 test/olddir
$ setfacl -Rm g:somegroup:rwx test
$ find test -ls
107513    4 drwxrwxr-x   3 myuser    myuser        4096 Dec 22 01:56 test
107539    0 -rw-rwxr--   1 myuser    myuser           0 Dec 22 01:56 test/oldfile
107529    4 drwxrwxr-x   2 myuser    myuser        4096 Dec 22 01:56 test/olddir
$ rm -r test
$ mkdir test
$ mkdir test/olddir
$ touch test/oldfile
$ setfacl -Rm g:somegroup:rwX test
$ find test -ls
107513    4 drwxrwxr-x   3 myuser    myuser        4096 Dec 22 01:56 test
107539    0 -rw-rw-r--   1 myuser    myuser           0 Dec 22 01:56 test/oldfile
107529    4 drwxrwxr-x   2 myuser    myuser        4096 Dec 22 01:56 test/olddir

Якщо ваша версія setfaclне підтримує це, чому б не використовувати find?

перезаписати дозволи, встановивши їх у rw для файлів та rwx для dirs

$ find . \( -type f -exec setfacl -m g:mygroup:rw '{}' ';' \) \
      -o \( -type d -exec setfacl -m g:mygroup:rwx '{}' ';' \)

встановлення дозволів ACL для моєї групи на основі наявних дозволів групи

$ find . \( -perm -g+x -exec setfacl -m g:mygroup:rw '{}' ';' \) \
      -o \( -exec setfacl -m g:mygroup:rwx '{}' ';' \)

Ви, ймовірно, захочете перевірити, чи маска групи забезпечує ефективні дозволи. Якщо ні, то вам також доведеться запустити це:

$ find . -type d -exec chmod g+rwX '{}' ';'

4

Для майбутніх читачів використовувати setfaclдля наявних файлів / папок без додавання виконуваного біта до своїх файлів рішенням є ця частина відповіді @ Mikel :

Моя версія setfacl дозволяє X точно так, як ви хочете, наприклад:

setfacl g:mygroup:rwX

Відповідний витяг із setfaclдокументації :

Поле perms - це комбінація символів, які вказують на дозволи: read (r), write (w), Execute (x), Execute only if the file is a directory or has has Executeзвод для деяких користувачів (X) .


2

Наскільки я розумію Linux ACL, setfacl -Rdm g:mygroup:rwx share_nameробить саме те, що ви хочете. Експеримент:

umask 007
mkdir foo
chgrp mygroup foo
chmod 2700 foo
setfacl -d -m group:mygroup:rwx foo
setfacl -m group:mygroup:rwx foo
touch foo/data
echo '#!/bin/ls' >foo/exec
chmod +x foo/exec

Потім як інший користувач у групі mygroup:

$ cat foo/*
#!/bin/ls
#!/bin/ls
$ ./foo/data
ash: ./foo/data: Permission denied
$ ./foo/exec
./foo/exec

Що відбувається?

$ getfacl foo/data
# file: foo/data
# owner: myuser
# group: mygroup
user::rw-
group::---
group:mygroup:rwx                 #effective:rw-
mask::rw-
other::---

Ефективний ACL для mygroupє результатом і'ing ACL_GROUPзапису для mygroup( rwx) з записом ACL_MASK ( rw-).

Основна сторінка acl (5) пояснює обчислення цього під "Алгоритмами перевірки доступу". Це не пояснює, як ACL_MASKстворюються записи, але на практиці, здається, трапляється правильна річ.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.