すべてのファイル/ディレクトリに固定所有者があることを確認するためにFreeBSDがインストールされているデータセットで「setuid」を使用するのは混乱していますか?

すべてのファイル/ディレクトリに固定所有者があることを確認するためにFreeBSDがインストールされているデータセットで「setuid」を使用するのは混乱していますか?

最初は私がやりたいことが単純だと思いました。しかし、FreeBSDページを見るほど、manこれが可能かどうかは混乱します。

データファイル専用の zfs プールがあります。上記で作成/保存されたすべての項目に対して、かなり厳しい一貫性と制御を設定したいと思います。 1つの側面は、統合された所有者/グループを持つようにすべての「静的」ファイルを維持したいということです(以前は、他のユーザーが作成した実行不可能なファイルが別のアカウントに分割されたとき、これは私にとって本当に苦労しました)。

に基づいてこのInfoSec SEの質問データプールを参照するスクリプトやオペレーティングシステムファイルがなく、実行権限を設定しないままにすることができるため、このシングルユーザールートを作成するのが最も簡単なようです。

だから簡単に聞こえると思います。 chmodsetuidビットを使用すると、すべてが正常です。man chmodこの言葉以外できない-o suiddirデータセットが以下を使用してインストールされていない場合(「モード」を参照)。さて、これはデフォルトではないので、少し痛いですが、動作します。

man mount その後、追加実行ビットは削除されましたが(良好)、次のように表示されます。「そしてルートは与えられません」技術的には、私が作成したルートではなく「仮想」ユーザーにファイルを提供できましたが、これは予期しないことでした。

除く追加「UFSファイルシステムのみがこのオプションをサポートしています」、私がインストールしたファイルシステムがZFSなので、最終的にsetiudビットを使用できないようです。

NFSv4 ACLを使用していますが、所有権の継承に役立つものが見つかりません。ユーザーが既存の所有者を変更するのを防ぐためにのみ使用されるようです。

だから私は何ができますか?データセットで作成/変更されたすべてのファイルに単一のファイル所有者を適用したいが、このページではこれを実行できないようです。

これを達成する方法はありますか?

修正する:

@Raphael Ahrens - 静的ファイルとは、単にシステムプロセスによって実行または呼び出されないデータセット全体のファイルを意味します。これは、データセットのどこでも、ユーザーが作成/移動/変更したデータファイルとディレクトリ階層です。

私はあなたが与えたコマンドを試しました。私はこれが有効なzfs属性であることを知りませんでしたsetuid。それが有効であれば問題は解決します。しかし、試してみると有効/継承されたと報告されますが、実際にはフラグを無視しますか?私が何か間違っているのでしょうか?それとも別の機能を有効にする必要がありますか?結果は次のとおりです。たぶん私が間違っているかもしれません。

# id
uid=0(root) gid=0(wheel) groups=0(wheel),1002(data_managers)

# su -l temp_user

% id
uid=1003(temp_user) gid=65533(nogroup) groups=65533(nogroup),1002(data_managers)

% cd /mnt/test_pool

% ls -lt
drwsrwxrwx  11 root  data_managers  12 Apr  3 15:25 test_dataset

% zfs get setuid test_pool/test_dataset
NAME            PROPERTY  VALUE   SOURCE
test_pool/test_dataset  setuid    on      default

% cd test_dataset

% ls -lt
drwsrwxrwx  11 root  data_managers  12 Apr  3 15:26 test_dataset2

% zfs get setuid test_pool/test_dataset/test_dataset2
NAME                            PROPERTY  VALUE   SOURCE
test_pool/test_dataset/test_dataset2  setuid    on      default

% cd test_dataset2

% touch testfile
% ls -lt testfile
-rw-r--r--  1 temp_user  data_managers  0 Apr  3 15:27 testfile

dir+dataset とその親 dir+dataset は setuid + 継承セットを表示しますが、その中に生成されたファイルは、親ディレクトリ () の所有者のtemp_user代わりに所有者 = user( ) を呼び出して生成されます。root

アップデート2:

以下の出力を見ると、問題が明確に表示されます。

データセットは ZFS で setuid 有効になっています。 suiddir オプションでインストールされます。長い dir 出力は setuid ビットがセットされていることを示します。 dir は root が所有し、呼び出し側のユーザーは「temp_user」です。ただし、OPに記載されているようにOPに引用されたマニュアルページでは、新しく作成されたファイル(test0)はルートの代わりにowner = temp_userを使用して作成されます。

これが私が解決しようとしている問題です。 ZFSファイルがファイルの所有権を継承するか(可能であれば)、解決策を見つけます。

# id
uid=0(root) gid=0(wheel) groups=0(wheel),1002(data_managers)

# su -l temp_user

% id
uid=1003(temp_user) gid=65533(nogroup) groups=65533(nogroup),1002(data_managers)

% zfs get setuid test_pool/test_dataset/test_dataset2
NAME                        PROPERTY  VALUE   SOURCE
test_pool/test_dataset/test_dataset2  setuid    on      default

% mount | grep 'test_dataset2'
test_pool/test_dataset/test_dataset2 on /mnt/test_pool/test_dataset/test_dataset2 (zfs, local, noatime, suiddir, nfsv4acls)

% cd /mnt/test_pool/test_dataset

% ls -lt
drwsrwxrwx  5 root  wheel  9 Apr  3 22:30 test_dataset2

% cd test_dataset2

% touch test0

% ls -lt test0
-rw-r--r--  1 temp_user  wheel  0 Apr  3 22:32 test0

関連情報