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 プロセスと対話しますか? 上記が間違っている場合、少しでもどこが間違っているのか知りたいです。