6

Linux ユーザーランドと Linux カーネルで sudo がどのように機能するかを理解しようとしています。ユーザーの観点からはあまり興味がありませんが、実装/カーネルの観点から理解することにもっと興味があります。(これをstackexchangeとスーパーユーザーのどちらに置くかについて議論しましたが、ここが最善だと思いました。間違った選択をした場合は自由に移動してください...)

そのため、カーネルの起動が完了すると、もちろん uid が 0 の init プロセスが起動されます。これにより、ssh デーモンなどの他のプロセスが起動される場合があります。この新しいプロセスは、その親の uid (例: 0) を継承します。sshd は、接続ごとに 1 つずつ、子プロセスも起動するようになりました。次に、passwd ファイル、shadow ファイル、pam などを介して、ログインしようとしているユーザーの認証が行われます。sshd は、使用するいずれかの方法でユーザーを認証すると、setuid/seteuid を呼び出してプロセスを変更します。 uid。今私の理解では、プログラムはルートから別のユーザーにのみ移動でき、ユーザー x からルートまたはユーザー x からユーザー y には移動できません (それは正しいですか?) (setuid 呼び出しを使用して?)

したがって、この点に関して、カーネルは実際には、ファイル、プロセスなどに割り当てられた uid についてしか認識していません。ユーザー アカウントへの認証は、ユーザーランドで制御され、ルート プログラムが非ルート プログラムにドロップすることのみを許可することによって保護されます。

したがって、私の質問は、上記が正しい場合、sudo はどのように機能するかということです。非 root アカウントを現在実行している端末は、一時的に root 権限にどのように切り替えますか? sudo プロセスと対話しますか? 上記が間違っている場合、少しでもどこが間違っているのか知りたいです。

4

1 に答える 1

9

sudo バイナリを見ると、実行可能ファイルに setuid パーミッション ビットが設定されていることがわかります。これは、ルートである sudo の場合、常に実行可能ファイルの所有者の uid で実行する必要があることをカーネルに示します。sudo が root として実行されると、必要な認証と fork/exec の前に setuid-syscall を実行できます。

---s--x--x. 2 root root 219272 Jul 17  2012 /usr/bin/sudo

「s」と所有者に注意すると、私の意味がわかります。

于 2013-03-14T03:09:28.557 に答える