ACLはファイルの有効権限をどのように計算しますか?

ACLはファイルの有効権限をどのように計算しますか?

作成した新しいファイルとサブディレクトリに対するwheelグループ権限を付与するために、次のコマンドを実行しました。rwx

[belmin@server1]$ ls -la
total 24
drwxr-sr-x+   2 guards guards  4096 Aug 27 15:30 .
drwxr-xr-x  104 root   root   12288 Aug 27 15:19 ..

[belmin@server1]$ sudo setfacl -m d:g:wheel:rwX .

[belmin@server1]$ getfacl .
# file: .
# owner: guards
# group: guards
# flags: -s-
user::rwx
group::r-x
group:wheel:rwx
other::r-x
default:user::rwx
default:group::r-x
default:group:wheel:rwx
default:mask::rwx
default:other::r-x

effectiveただし、rootとしてファイルを作成するときに権限がどのように計算されるかは完全にはわかりません。

[belmin@server1]$ sudo touch foo

[belmin@server1]$ getfacl foo
# file: foo
# owner: root
# group: guards
user::rw-
group::r-x                      #effective:r--
group:wheel:rwx                 #effective:rw-
group:guards:rwx                #effective:rw-
mask::rw-
other::r--

これが何を意味するのかを詳しく説明できる人はいますか?

答え1

effective権限は、実際の(実際の?)権限をと組み合わせて決定されますmaskmaskファイルがあるため、rw-すべてのeffective権限はオフになりますx

答え2

短い答え:ビットオンマスクを実行するには、setfaclafterを使用して明示的に設定する必要がありますtouch。セキュリティは暗黙の設定を禁止します。

setfacl -n -m m::rwx foo

「-n」はマスクの再計算を抑制します(不要な場合があります)。
「m::rwx」はマスク値を「rwx」に設定します。 "m::x" はすべての読み書きを無効にします。


マスクがなぜ「rw-」なのかわかりません。touchファイルが生成されるデフォルトディレクトリは、OP例全体で同じままであると仮定します。

  1. 「foo」のディレクトリエントリには、所有者「root」が表示される必要があります(ディレクトリにSUIDビットが設定されているため、sudoコマンドとグループ「guards」のため、権限はデフォルトで「-rw-...r--」に設定されています)。 "-...rx..."(SUID ビットのため小さい s で表される)

  2. 以下は、ディレクトリのデフォルト値でなければならないACLです。 ACLは継承されるため、ACLを作成したくないので、ACLマスクは「rwx」のディレクトリのデフォルト値である必要があります。

ただし、作成された場合は、新しいACLeがデフォルト値から始まり、マスクを再度「rwx」として残したいと思います。これは、デフォルト値から開始されなかった場合、デフォルトのACLの概念に反するように見えます。 「デフォルト」ACLは、名前付きユーザーと名前付きグループACLのみを提供します。

今質問があります。マスクACLeとは何ですか?デフォルトのマスクエントリで「rwx」になりたいです。ただし、スペースマスクを使用して作成し、さまざまな法的用語を適用できます。

  1. 一時ACLは、user::rw-、group::rx、other::r--、group:wheel:rwx、group:guards:rwx、およびマスク:::(未設定)ですsetfacl。同じファイルの作成にはルールが適用されます。

規定があります:

ACLに名前付きユーザーまたは名前付きグループ項目が含まれており、マスク項目がない場合は、グループ項目と同じ権限を含むマスク項目が作成されます。

これは、ACLグループエントリがファイルディレクトリエントリから作成された場合はACLマスクを「rx」に設定し、ACLグループエントリがデフォルトのACLから出ている場合はACLマスクを「rx」に設定します。 (とにかくこの場合の結果は同じです。)

別の規定があります:

基本 ACL に名前付きユーザー項目または名前付きグループ項目が含まれており、マスク項目がない場合は、基本 ACL のグループ項目と同じ権限を含むマスク項目が追加されます。 ...マスクされたアイテムの権限は、マスクされたアイテムの影響を受けるすべての権限の統合を含むようにさらに調整されます。

このルールが適用されると、マスクは「rx」(前のエントリと同じ論理)で始まり、「マスクエントリの影響を受けるすべての権限の統合」に調整されます。

「マスクエントリの影響を受ける権限」は、コマンドドキュメントに定義されていませんsetfacl。 POSIX ACL文書によると、

マスクは、自分が属するグループへのすべてのアクセス権と、すべてのユーザーおよびグループ項目の組み合わせです。

付加的な「結合」という言葉が与えられると、「組合せ」を論理ORとして読み取る。つまり、グループまたはユーザーACLeに「x」権限がある場合、マスクには「x」が含まれます。

  1. これらすべてのロジックによれば、OP例のマスク値は、どの論理パスに従うかにかかわらず「rwx」でなければなりません。

実行に使用されたxがマスクに表示されないため、上記の推論には欠陥があるようです。

したがって、パブリックドキュメントソースで「隠された」マスクを計算する方法に関するいくつかの規則が必要です(またはバグが見つかりました)。

私の結論は、「x」が常に無条件に削除され、文書が緩んでいることです。

この変更はおそらく「セキュリティ」の理由で行われたでしょう。どのファイルも暗黙的に実行可能ではありませんが、生成後に実行可能ビットをオンにする必要があります。

関連情報