少しプロセスのパーミッションについて話しましょう。以前、SUID パーミッションビットが有効な状態でpasswdコマンドを実行すると、root としてプログラムが実行されると説明したのを覚えていますか?それは本当です。しかし、一時的に root になるからといって、他のユーザーのパスワードを変更できるという意味でしょうか?いいえ、幸いなことにできません!
これは、Linux が実装している多くの UID によるものです。すべてのプロセスには 3 つの UID が関連付けられています。
プロセスを起動すると、それを実行したユーザーまたはグループと同じパーミッションで実行されます。これは実効ユーザーIDとして知られています。この UID は、プロセスにアクセス権を付与するために使用されます。したがって、当然、Bob がtouchコマンドを実行した場合、プロセスは彼として実行され、彼が作成したファイルは彼の所有権の下に置かれます。
実ユーザーIDと呼ばれる別の UID があります。これは、プロセスを起動したユーザーの ID です。これらは、プロセスを起動したユーザーが誰であるかを追跡するために使用されます。
最後の UID は保存ユーザーIDです。これにより、プロセスは実効 UID と実 UID の間で、またその逆で切り替えることができます。これは、プロセスを常に昇格された権限で実行したくないため、特定の時間に特別な権限を使用するのが良い習慣であるため、便利です。
それでは、passwdコマンドをもう一度見て、これらすべてをまとめてみましょう。
passwdコマンドを実行すると、実効 UID はあなたのユーザーID になります。ここでは 500 としましょう。しかし、待ってください、passwdコマンドには SUID パーミッションが有効になっていることを思い出してください。したがって、それを実行すると、実効 UID は 0 になります(0 は root の UID です)。これで、このプログラムは root としてファイルにアクセスできます。
少し力を得て、Sally のパスワードを変更したいとしましょう。Sally の UID は 600 です。残念ながら、それはできません。幸いなことに、プロセスにはあなたの実 UID も含まれており、この場合は 500 です。あなたの UID が 500 であることを知っているため、UID 600 のパスワードを変更することはできません。(もちろん、あなたがマシンのスーパーユーザーであり、すべてを制御および変更できる場合は、これは常に回避されます)。
passwdを実行したため、あなたの実 UID を使用してプロセスを開始し、ファイルの所有者(実効 UID)の UID を保存するため、2 つの間で切り替えることができます。必要ない場合は、root アクセスですべてのファイルを変更する必要はありません。
ほとんどの場合、実 UID と実効 UID は同じですが、passwdコマンドのような場合は変更されます。