web-dev-qa-db-ja.com

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

すべてのディレクトリがすべてのディレクトリをrwxできるように、また新しく作成されたすべてのファイルがrwになるように、ファイル共有のデフォルトのアクセス許可を設定したいと思います。

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

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

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

私の問題は、新しく作成されたすべてのサブディレクトリrwxにしたいが、新しく作成されたfilesだけをrw

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

ありがとう

15
durandal

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に、ディレクトリの場合は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 '{}' ';'
12
Mikel

今後の読者のために、ファイルに実行可能ビットを追加せずに既存のファイル/フォルダーでsetfaclを使用するには、解決策は @ Mikelの回答のこの部分です

私のバージョンのsetfaclでは、Xを望みどおりに使用できます。例:

setfacl g:mygroup:rwX

setfaclのドキュメントからの関連する抜粋

Permsフィールドは、アクセス許可を示す文字の組み合わせです。読み取り(r)、書き込み(w)、実行(x)、ファイルがディレクトリであるか、すでに実行許可を持っている場合にのみ実行します一部のユーザー(X)の場合。

5
Erik Koopmans

私が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::---

mygroupの有効なACLは、mygrouprwx)のACL_GROUPエントリとACL_MASKエントリ(rw-)のAND処理の結果です。 。

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