ACLマスクがLinuxでファイル権限を微調整する方法
ACLマスクは、Linux上のファイルに対して許可される最大権限を設定することができます。それらが何を意味するのか、そしてなぜそれらが非常に重要であるのかを見てみましょう。
重要なポイント
- アクセス制御リスト(ACL)マスクは、ACLを認識していないプログラムとの互換性を確保し、ACLエントリをPOSIX権限に変換します。
- ACLマスクは、所有ユーザー、グループ、または「その他」クラスではない任意のユーザーまたはグループオブジェクトに対して許可される最大の権限を表します。
- 新しいACLエントリを追加するとき、マスクは自動的に調整されて、すべての名前付きユーザーまたはグループに対して許可される最大の権限を反映します。
アクセスコントロールリスト(ACL)を使用していますが、マスクの概念について混乱していますか?あなたは一人ではありません。この重要な概念について、何であるかとLinuxファイルシステムの権限との相互作用を見てみましょう。
ACLマスクとは何ですか?
ACLマスクは、ACLに対応していないプログラムやユーティリティとの間で権限の相互運用性を確保する方法です。
ファイルやディレクトリのACLマスクは、所有ユーザー、グループ、または「その他」クラスに属さない任意のユーザーまたはグループオブジェクトに許可される最大の権限に相当します。別の言い方をすれば、ACLエントリをPOSIX権限に変換することで、後方互換性のためのものです。
この記事で扱う新しく作成されたファイル、mysupersecretfile.txtを見てみましょう:
ls -l mysupersecretfile.txt
そんな敏感な文書に対する権限はかなり簡単ですよね?
許可設定の後のドット(.)に注意してください。これはSELinuxコンテキストを示しており、ACLやACLマスクとは無関係です。
明確にするために、getfacl コマンドを使用してファイルの ACL エントリも確認しましょう:
getfacl mysupersecretfile.txt現在のACLエントリは、所有ユーザーおよびグループエントリがファイルの実際のPOSIX所有ユーザーおよび所有グループに直接マッピングされています。これは、拡張ACLエントリを持たないファイルには一般的であり、「最小ACL」と呼ばれています。
例えば、マネージャーというユーザーをこのファイルのACLエントリに読み取り権限で追加するリクエストを受け取ったとしましょう。これをsetfaclコマンドを使って達成します。そして、新しいACL権限をlsとgetfaclコマンドを使って確認しましょう:
setfacl -m u:manager:r mysupersecretfile.txt
ls -l mysupersecretfile.txt
getfacl mysupersecretfile.txt今、lsコマンドの権限エントリの横に「+」記号が表示されているのに気づくでしょう。これは、そのファイルに関連付けられたACLエントリがあることを示しています。
今、getfaclコマンドの出力にマスクの行が見えますか?マネージャユーザーの拡張ACLエントリに加えて、このマスクエントリが自動的に割り当てられました。これは必要であり、指定されたユーザーまたはグループオブジェクト(再度、オーナーユーザーおよび所有グループオブジェクトは除く)に対して許可される最大権限を示します。現在、読み取り権限は既存のマスクの読み取り権限に相当します。
さて、別のリクエストから契約者という別のユーザーをファイルのACLに追加しましょう。しかし、今回は彼らに読み取りと書き込みの権限を与える必要があります。それがマスクにどのように影響するか見てみましょう:
setfacl -m u:contractor:rw mysupersecretfile.txt
getfacl mysupersecretfile.txt今、マネージャー (r) ACL エントリに加えて、請負業者 (rw) エントリも見えます。しかし、なぜマスクエントリが読み取りと書き込みに変わったのでしょうか?
契約者ユーザーに読取および書込権限を追加したとき、ACLマスクに影響を与えました。前述のように、マスクはACLユーザーおよびグループエントリの最大許可権限に関連しています。契約者ユーザーのACLエントリに書込権限を追加したため、マスクにも書込権限が付与されます。
ACLを使用する際、グループクラスの権限(ls -l コマンドの出力のように)の役割がACLマスクを反映するように再利用されていることがわかります。しかし、心配しないでください。グループオーナーの権限は依然として「所有グループ」ACLエントリとして反映されます。
別のユーザーを追加する場合、そのユーザーの権限が少ない(たとえば、読み取り専用の場合)と、マスク権限を継承しないことを念頭に置いてください。これは、契約者のユーザーのACLエントリーを追加したときに、管理者ユーザーが書き込み権限を得なかったのと同じです。
効果的な権限
マスクエントリのアクセス許可を手動で設定するには、setfaclコマンドを使用します。これにより、ファイル上で設定された任意の名前のユーザーおよび/またはグループのアクセス許可を同時にフィルタリングできるほか、ファイルの既存のユーザーのACLエントリを最低の共通分母に設定することができます。これを効果的なアクセス許可と呼びます。
ファイルのマスクを読み取り専用に設定してから、ACLエントリを再確認しましょう:
setfacl -m m::r mysupersecretfile.txt
getfacl mysupersecretfile.txt
契約者ユーザーの有効な権限を示すコメントは、彼らに読み取りおよび書き込み権限が与えられたにもかかわらず、実際には読み取り権限しか持っていないことを私たちに知らせてくれます。マスクの変更がこれを引き起こしました。再度ls -lコマンドでファイルを確認すると、グループクラスの権限(再度マスクに反映されるように変えられたもの)が変更されているのを見ることができます。
ls -l mysupersecretfile.txt
名前付きユーザーまたはグループのACLエントリを追加したいが、マスクを再計算したくない場合は、setfaclと一緒に-nを使用できます。これにより、追加するACLはマスクによって許可される最大権限に制限されます(エントリの実効権限で示される)。ただし、これはデフォルトではありませんので、マスクは強制的なアクセス制御の一形態ではないことに注意してください。以下でそれを試してみましょう:
setfacl -n -m u:milton:rwx mysupersecretfile.txt
getfacl mysupersecretfile.txt
デフォルトマスク
ACLsを扱う際、デフォルトマスクの概念はデフォルトACLエントリに非常に似ています。例えば、ディレクトリにデフォルトマスクを追加すると、その内部に新しく作成されたすべてのファイルやサブディレクトリは、そのマスク(およびデフォルトマスクエントリ)を継承します。デフォルトマスクを適用するには、setfaclコマンドに-dパラメータを使用してください:
mkdir mysupersecretdirectory
setfacl -d -m m::rX mysupersecretdirectory/
getfacl mysupersecretdirectory/
mkdir mysupersecretdirectory/mysupersecretsubdirectory/
getfacl mysupersecretdirectory/mysupersecretsubdirectory/デフォルトマスクおよびデフォルトACLエントリは、ファイルや他のディレクトリを内部に含むことができる唯一のオブジェクトであるため、ディレクトリにのみ適用されます。これらの継承可能なエントリを適用するためです。
ACLマスクは、ACLを操作するプログラムの能力に関係なく、ACLのセキュリティが適切に処理されることを保証する方法です。
技術、ソフトウェア、セキュリティの概念が急速に進化し続ける中で、逆互換性が私たちの多くにとって最も重要であることを忘れないことが重要です。そして、逆互換性は新しい進歩とともに尊重されなければなりません。もちろん、それは新しい機能や装飾を持つことができないという意味ではありません。それは単に、新しい機能や装飾が既存の基準に従うべきであるということです。








