
私は、述べられた質問の正しい理由を見つけようとしています。私の理解では、次のとおりです。
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
、これもルートによってのみ読み取り可能です。リストは続きますが、ユーザーやグループを変更する権限がルートにのみ与えられているという避けられない事実があるため、実際には問題ではありません。これが、su
とsudo
が setuid root である理由です。
sudo の内部はどのように動作するのでしょうか?関連する質問により、追加の背景情報が提供されます。