Linux - su および sudo バイナリを UID ルートに設定する必要があるのはなぜですか?

Linux - su および sudo バイナリを UID ルートに設定する必要があるのはなぜですか?

私は、述べられた質問の正しい理由を見つけようとしています。私の理解では、次のとおりです。

  • sudoルートのみが読み取り可能なファイルを読み取る必要がある/etc/sudoersため、ルートにUIDを設定する必要があります。
  • su異なる実 UID と有効 UID を持つ新しいシェルを作成し、パスワードを確認する必要があります。パスワードを確認するには、 を読み取る必要がある/etc/shadowため、root に set-UID する必要があります。パスワードを確認した後、フォークされたプロセスを呼び出す必要がありsetuid()、任意の UID 引数を使用するには、その親プロセスが root を有効 UID として持つ必要があるため、これも別の理由になります。

上記の理由は正しいでしょうか?

答え1

あなたの理由はほぼ正しいですが、どちらの場合も(suおよびsudo)、rootとして実行する必要がある基本的な理由は、現在のプロセスのさまざまなユーザーとグループの識別子を変更できる必要があるためです。これには、次のような関数の呼び出しが含まれます。setreuidこれは、呼び出しプロセスが root として実行されている場合にのみ、任意のユーザーとグループに対して機能します。

suには、sudoルートとして実行する必要がある他の機能もありますが、上記と比較すると、実質的には二次的な詳細です。おっしゃるとおり、sudoは を読み取る必要があります/etc/sudoersが、後者がルートによってのみ読み取り可能であるという事実は、厳格な要件ではありません。どちらのプログラムも PAM を使用して認証を実行できますが、通常は を読み取ることができることを必要とするフォールバックも含まれており/etc/shadow、これもルートによってのみ読み取り可能です。リストは続きますが、ユーザーやグループを変更する権限がルートにのみ与えられているという避けられない事実があるため、実際には問題ではありません。これが、susudoが setuid root である理由です。

sudo の内部はどのように動作するのでしょうか?関連する質問により、追加の背景情報が提供されます。

関連情報