ディレクトリとファイルに異なるACLを設定する


15

誰もがrwxすべてのディレクトリにアクセスできるように、また新しく作成されたすべてのファイルがrw

この共有にアクセスしている全員が同じグループに属しているため、これは問題になりません。

ユーザーのすべてのumaskなどを変更せずに、ACLを使用してこれを行うことを検討しました。現在の私の呼び出しは次のとおりです。

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

私の問題は、新しく作成されたすべてのサブディレクトリrwx欲しいのに対して、新しく作成されたファイルだけが欲しいということrwです。

誰かが私の希望する最終結果を達成するためのより良い方法を持っていますか?chmod +xvs と同様の方法で、ファイルとは別にディレクトリにACLを設定する方法はありますchmod +Xか?

ありがとう

回答:


12

Gillesが指摘しているように、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コマンドは希望どおりに機能していたが、2番目のコマンドはそうではなかったということですか?つまり、他の通常のファイルに実行許可を与えることなく、ディレクトリがトラバース可能であることを確認して、古いファイルの許可を修正しようとしていますか?

私のバージョンはあなたが望むように正確に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、dirsの場合はrwxに設定します

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

既存のグループ権限に基づいてmygroup 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フィールドは、アクセス許可を示す文字の組み合わせです:読み取り(r)、書き込み(w)、実行(x)、ファイルがディレクトリであるか、すでにユーザー(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はmygroupand'ingの結果であるACL_GROUPため、エントリmygrouprwxACL_MASKエントリとを() rw-)。

ACL(5)のmanページには、「アクセス・チェック・アルゴリズム」の下での計算にこれを説明しています。ACL_MASKエントリの生成方法については説明しませんが、実際には正しいことが起こるようです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.