私が知る限り、さまざまなユーザーIDは次のとおりです(プロセスの観点から)。
- 実際のユーザーID:プロセスを所有するユーザーID
- 有効ユーザーID:現在許可されているものと許可されていないものを決定するユーザーID。
- 保存されたユーザーID:デフォルトでは元の有効ユーザーIDで、必要に応じて元の有効ユーザーIDに戻すことができます。
今、2つの質問があります。
プログラムの起動時に有効なユーザーIDを変数に保存すると、保存する必要のないユーザーIDになりますか?
Cプログラムで保存されたユーザーIDを取得するには?これを行う機能が見つかりません。
ベストアンサー1
プログラムの起動時に有効なユーザーIDを変数に保存すると、保存されたユーザーIDは不要になりますか?
ユーザー空間プログラムが何を覚えているのではなく、カーネルがどの権限を使用できるかが問題です。ユーザーを分離するには、システムがプロセスで使用できるユーザーIDを制御する必要があります。それ以外の場合は、すべてのプロセスでroot権限を要求できます。
Cプログラムで保存されたユーザーIDを取得するには?これを行う機能が見つかりません。
getuid()
これは標準関数(sumのみ)を使用することはできませんgeteuid()
。少なくともLinuxはgetresuid()
ただし、3 つのユーザー ID がすべて返されます。
とにかく一般的に読む必要はありません。 setuid プログラムの場合、実際のユーザー ID と実効ユーザー ID の間の切り替えが許可されるため、実効ユーザー ID のコピーから始まります。
setuidプログラムでは、実際のユーザーIDはプログラムを実行しているユーザーのIDであり、有効で保存されたユーザーIDはそのプログラムを所有するユーザーのIDです。有効なユーザー ID は権限の確認に非常に重要であるため、プロセスが一時的に権限を放棄したい場合は、実際のユーザー ID と保存されたユーザー ID の間で有効なユーザー ID を変更します。
プロセスがユーザーIDを変更できることを確認するために、カーネルは保存されたユーザーIDをどのように使用しますか?これは、プロセスが有効なユーザーIDを変更しようとしたときにカーネルが保存されているユーザーIDを調べて、プロセスがそのようにできることを確認することを意味しますか?
はい。 Linuxのマニュアルページにsetuid()
これについての言及がありますが、やや隠されています。
ERRORS
EPERM The user is not privileged and uid does not match the real
UID or saved set-user-ID of the calling process.
つまり、(有効な)ユーザIDは、実際のIDまたは保存されたIDのいずれかを設定することができる。
setreuid()
これについてのマニュアルページがより明確です。
Unprivileged processes may only set the effective user ID to the real
user ID, the effective user ID, or the saved set-user-ID.