~からhttps://unix.stackexchange.com/a/18290/674
カーネルを見る
概念的には、プロセスは3つのグループに属します。各グループは、次のグループのサブセットです。
- プロセスによって生成されたファイルが属するプロセスの基本グループとして機能する単一のグループ。
- 確認済みグループのコレクショングループがファイルを開くための権限が必要な場合。
- グループコレクション追加の権限で実行されるプロセスが悪用される可能性があります。
歴史的な理由から、これらのセットは次のとおりです。
- これ有効グループID (良い);
- 有効グループIDプラス補助グループID;
- 上記のすべてのプラス実際のグループID そして保存されたコレクショングループID。
質問:
ポイント3で「プロセスが利用できる追加の権限で実行されるプロセス」はどうですか?
この状況は、ポイント2の「グループにファイルを開く権限が必要な場合」の状況とは異なりますか?
通常、「セカンダリグループID」と2番目のエントリにはデフォルトグループIDがそれぞれ含まれていますか?
「一般的に」という言葉は、私が気づいた出力に次の1次グループと2次グループが
id
含まれていることを意味しますgroups=
。 https://unix.stackexchange.com/a/18203/674「各ユーザーは複数のセカンダリグループに属することができます。このグループは出力の末尾に一覧表示されます。id
したがって、プライマリグループもセカンダリグループであることを知りたいです。
ありがとうございます。
答え1
特にLinuxでは、最近「プロセスが利用できる追加の権限で実行されるプロセス」は、次のようなプロセスです。
CAP_SETGID
「ユーザーの名前空間に機能があります。」。これら3つの項目の紹介では、「各セットは次のセットのサブセット」と記載されています。したがって、ポイント3で説明されているセットは、ポイント2で説明されているセットと概念的に異なります。
id
印刷効果的なデフォルト以外のグループを使用して有効グループを変更できますnewgrp
。デフォルトグループはデフォルトの物理/有効グループです。 Linuxでは、getgroups
'マンページ「返されたリストに呼び出しプロセスの有効なグループIDが含まれているかどうかは指定されていません」と記載されているため、セカンダリグループに必ずしもプライマリグループが含まれるわけではありません。
それでもLinuxを具体的に考えているなら、読む価値があります。credentials
マンページ。
答え2
さまざまな概念があるので、実際のケースで学ぶ方が簡単です。
ユーザー空間 NFS サーバーなどのプログラムは、ネットワークを介して接続された特定のユーザーを表します。たとえば、特定のユーザーの代わりにファイルを開くと、有効なユーザーとグループIDが一時的に変更されます。 「セーブセット」または「実際の」UIDとGIDには依然として特権UIDとGIDがあるため、切り替えることができます。
私は最近学んだこれはfusermount
これを行うプログラムの別の例です。ファイルシステムをマウントするにはset-uid rootである必要がありますが、構成ファイルを読み取るとき、マウントポイントに渡されたディレクトリに到達したときなど、元のユーザーで権限の確認を実行すると予想されます。少なくともUIDをこのように変更する必要があります。このプログラムもset-gidの場合、GIDも変更する必要があります。 fusermount
set-gidでインストールする必要はありませんが、コードはとにかく有効なGIDを変更します。これ以上コードは必要ありません。少なくとも問題が発生しないことを願っています。 :-).
この例man
を参照すると、ページに次のように表示されます。setfsgid()
setfsuid()とsetfsgid()の明示的な呼び出しは、通常、実際の有効なユーザーとグループIDを変更せずにファイルアクセスに使用されるユーザーとグループIDを変更する必要があるLinux NFSサーバーなどのプログラムでのみ使用されます。
[...]
プロセスが不要な信号を受信せずにファイル権限を確認するためにユーザーIDを変更できるように、ファイルシステムのユーザーID属性が追加されました。 Linux 2.0以降、シグナル権限の処理が異なり(kill(2)を参照)、プロセスの変更が不要なプロセスのシグナルに影響を与えることなく、有効なユーザーIDを変更できます。したがって、 setfsuid() は不要で、新しいアプリケーションでは避けなければなりません (setfsgid(2) も同様です)。
つまり、これらのプログラムの現在のバージョンはsetresuid()とsetresgid()を使用して有効なUIDとGIDを一時的に変更します。