LinuxのACLを設定してみよう (3) ACLマスク

LinuxのACLを設定してみよう (3) ACLマスク

2016.03.02

前々回「LinuxのACLを設定してみよう (1) ACLの概要」ではACLの設定と確認の基本操作をご紹介し、前回「LinuxのACLを設定してみよう(2) デフォルトACL」ではデフォルトACLについてご紹介しました。今回の「LinuxのACLを設定してみよう (3)」では、ACLマスクについてご紹介します。前々回、前回と合わせて読んでいただけるとより分かりやすくなるかと思います。

ACLマスク

ACLマスク とは、その ファイルの最大パーミッション を表現します。ACLで許可されていないパーミッションは、設定されたとしても有効にすることはできません。
このACLマスクを使用することで、ファイルに設定されたパーミッションを一括で制御することができます。知っておくと便利な機能のひとつなので、ここでご紹介していきます。

ACLマスクの確認

まずは、ACLマスクを確認する方法からご紹介します。以下のようなACLがすでに設定されているファイルがあるとします( ACL が設定されているかは、第1フィールドの末尾に + が表示されるかで確認できます)。


ACLマスクはACL内容を確認するのと同じ getfaclコマンド で確認します。ファイルに getfacl を実行した結果が以下です。
ACLマスクは、「mask::rw-」 の行で確認できます。以下の結果ではACLマスクは「rw-」となります。ACLマスクの値が 「rw-」 なので、このファイルの最大パーミッションは 「rw-」 となります。では最大パーミッションがどのように設定に影響を及ぼすのか、実際にACLを変更してみます。

ACLマスクの変更

では、ACLマスクの変更方法についてご紹介します。ACLマスクを変更する場合は、ACLを変更する場合と同じ setfaclコマンド を使用します。setfaclコマンドに、設定変更の -m オプションを指定し、「mask::パーミッション」 あるいは 「m::パーミッション」 と続けます。パーミッション部分にACLマスクにする値を「rwx」の形式で指定してください。最後に対象とするファイル名を指定して完了です。以下の例では、ACLマスクに「r」のみを設定しています。

では、設定を確認してみます。ファイルにgetfaclを実行した結果が以下です。

まず注目するべき項目が 「mask::r–」 の行です。ACLマスクの値が、「r–」 に変更されています。
次に注目するべき項目が 「user:alice:rw-   #effective:r–」 の行です。先ほどまでは「#effective:r–」項目が表示されていなかったはずです。この「#effective:r–」という項目は、実際に適用される有効な値を表現します。
この場合aliceユーザには、「#effective」で表示されている「r」のみが許可されます。ではなぜ、「user:alice:rw-」と設定したのに「#effective:r–」となってしまったのでしょうか。
理由は ACLマスクの値 です。ACLマスクはファイル内の最大パーミッションを表すので、ACLマスクで許可されていない値は設定したとしても、有効にはなりません。そのため、設定は「user:alice:rw-」であっても、ACLマスクは「mask::r–」と「r」しか許可していないので、「#effective:r–」と表示されているよう「r」しか有効になっていないのです。

ACLマスクの使い方

どのような場面でACLマスクを設定すれば良いでしょうか。一挙にパーミッションの制御をしたいときにACLマスクはとても便利です。以下のような、複数のユーザやグループにACLが設定されているファイルがあったとします。

例えば、これからこのファイルを使用するので、これ以上は誰にも書き込んで欲しくないと思いました。これを実現するには、設定されているファイルの書き込みのパーミッション「w」を許可しないように変更することが一番の方法です。でもこれだけのACLが設定されているのをひとつずつ「w」がないパーミッションに指定し直すのは、とても手間がかかります。
このような場合にACLマスクを設定し直すと便利です。例えば、以下のようにACLマスクから「w」を除きます。

すると、「w」が設定されていたユーザやグループも一挙に「w」が許可されないようになりました。また改めてみんなにファイルに書き込んでもらいたいとします。その場合、以下のようにACLマスクで「w」を許可します。
すると元々書き込みが許可されていたユーザやグループは「w」が有効になりました。このように、設定されているACLを一挙に制御する場合にACLマスクは役立ちます。

ACLマスクの注意点(1)

ACLを設定する場合にはsetfaclコマンドを使用しますが、デフォルトで ACLマスクの自動更新のオプション を含んでいます。そのためACLの設定を追加すると、その設定内容がすべて有効になるようにACLマスクも自動的に変更されます。例えば、以下のように変更されます。


反対にACLの設定時、ACLマスクを自動更新されないようするには「-n」オプションを指定します。例えば、以下のように実行します。

ACLマスクの注意点(2)

通常パーミッションを確認する場合「ls -l」を実行します。その結果の第1フィールドは「ファイルタイプ」「所有者パーミッション「グループパーミッション」「その他パーミッション」と読み取ります。
実はACLが設定されたファイルに「ls -l」を実行した場合は少し意味が変わります。
「ファイルタイプ」「所有者パーミッション」「ACLマスク」「その他パーミッション」 となります。本来 「グループパーミッション」 となるところが「ACLマスク」で表示されます。
また通常グループのパーミッションを変更する場合は「chmod g+rwx file」などと指定しますが、chmodコマンドは先ほどの「グループパーミッション」部分を変更するため、ACLが設定され「ACLマスク」に置き換わっているファイルの場合は、ACLマスクが変更されるだけです。グループパーミッションは変更されません。


グループパーミッションを変更したい場合にも、setfacl を使って設定する必要があります。ファイルのグループパーミッションを変更する場合には「setfacl -m g::rwx」 と指定します。


ここは、特に間違えやすいので気をつけてください。ACLが設定されたファイルは基本的にsetfaclコマンドを使って設定します。ファイルの所有者は「setfaclm -m u::rwx file1」、その他のユーザは「setfacl -m o::rwx file1」となります(ただしこれらはchmodを使っても指定は可能です)。

まとめ

前々回のACLの基本設定、前回のデフォルトACLの設定 に引き続き、ACLマスクの設定と確認方法についてご紹介しました。ACLマスクを操作することで、ファイル内のパーミッションを一気に制御することが可能です。特に複数のACLが設定されたファイルなどでは非常に便利な機能です。良かったら設定してみてください。

以上、ありがとうございました。

記事は、予告なく変更または削除される場合があります。
記載された情報は、執筆・公開された時点のものであり、予告なく変更されている場合があります。
また、社名、製品名、サービス名などは、各社の商標または登録商標の場合があります。