LinuxでACLとマスクというタイトルのこの例を見つけました。この記事では、次の例を示します。これらの例は、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
)でシステムコールを呼び出したことがわかります。今回は022
、以下の権限のumask が削除されている(----w--w-
)ためrwxr-xr-x
、ディレクトリが作成されたときは0755()のままです。
例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
です。
参考文献
mask::rw-
ます。しかし、それは本当にあなたの質問ではありませんよね?