誰かがUnixのset-user-IDメカニズムを説明できますか?この設計決定の根拠は何でしたか?有効なユーザーIDメカニズムとどう違うのですか?
UNIXのファイルに対する通常の読み取り、書き込み、実行の権限を知っているかもしれません。
ただし、多くのアプリケーションでは、このタイプの権限構造(例:特定のユーザーに特定のファイルを読み取るための完全なアクセス許可を与えるか、ファイルを読み取るためのアクセス許可をまったく与えない-は、粗すぎます。このため、Unixには別の許可ビットset-user-ID
ビットが含まれています。実行可能ファイルに対してこのビットが設定されている場合、所有者以外のユーザーがファイルを実行するたびに、そのユーザーは所有者の他のファイルへのアクセスにおける所有者のすべてのファイル読み取り/書き込み/実行特権を取得します。
ファイルのユーザーID設定ビットを設定するには、次のように入力します。
chmod u+s filename
Group-other実行権限も設定していることを確認してください。 group-other読み取り権限も持っているといいでしょう。これはすべて1つのステートメントで実行できます
chmod 4755 filename
これは、保存されたUIDとも呼ばれます。 Set-UIDビットがオンになっている起動されたファイル。保存されたUIDは、ファイルの所有者のUIDになります。それ以外の場合、保存されたUIDは実際のUIDになります。
このUIDは、特定のアクションを実行するプロセスの特権を評価するために使用されます。 EUIDは、実際のUID、またはEUID!= 0の場合はスーパーユーザーUIDのいずれかに変更できます。 EUID = 0の場合は、何にでも変更できます。
そのようなプログラムの例はpasswd
です。完全にリストすると、Set-UIDビットがあり、所有者が「root」であることがわかります。通常のユーザー、たとえば「mtk」がpasswd
を実行すると、次のように始まります。
Real-UID = mtk
Effective-UID = mtk
Saved-UID = root
man credentials
は、この場合の優れた情報源です。 [〜#〜] so [〜#〜] のこの質問も参照してください。歴史的な説明については、この アーカイブされた投稿 を参照してください。
「set UID」および「実効UID」メカニズムを呼び出すのではなく、UIDの概念全体をそれと呼ぶ必要があります。さまざまなUIDが存在する理由は、特権の分離に関するさまざまな問題です。通常の(特権のない)ユーザーでも、特権のあるユーザーだけが実行できること(リソースにアクセスする)が必要になる場合があります。これを簡単に実現するために、プログラムはUIDを変更できます。これらには3つのタイプがあります。
実UID-プロセスを所有するUID
実効UID-プロセスが現在実行されているUID-これは、特定の瞬間におけるプロセスの実際の機能を決定します。これは、ps
がUSERフィールドに表示するものでもあります。
保存セットUID-実際のUIDと有効なUIDを切り替えるために使用されるプレースホルダー
最後のものの必要性は、通常のユーザーがこれらの3つをのみ切り替えることができ、それ以外は何もできないという事実から生じますそしてsetuidプログラムは通常、それをロードしたユーザーが誰であるかを知る必要があります(さらに、実際のUIDは変更する必要があります。
mtkの拡張は良いものです。
passwd
の例は、権限の昇格の1つです。passwdは、ルートのみが変更できるファイルを変更する必要があるため、常にルートとして実行されます。これにより、passwd実行可能ファイルがバッファオーバーフローなどになりにくくなり、賢い通常のユーザーが意図しない用途に使用できるようになることが重要になります。
別の論理的根拠は、rootとしてログインしている場合にsu
を使用するのと同じ方法でユーザーを保護することです-減少または制限特定のタスクに対するエスカレーションではなく、特権。たとえば、自分のものへのアクセスを必要としないデーモンサービスを開始する権限があり、それ自体に必要なもの(ロガーなど)がある場合、それを実行すると、そのものにのみアクセスできます。私のものや他の誰かではありません。
実行可能ファイルでsuidビットが設定されていなくても、プログラムでuidを設定できることに注意してくださいただし、エスカレーションでは機能しません。つまり、通常のユーザーで、ある時点でuidを設定するプログラムを作成した場合、そのプログラムはrootに切り替えることができません。 Apacheはこのように動作すると思います。これは通常、rootによって開始され、uidを特権のないユーザー(たとえば、「httpd」)に切り替える子をフォークする1つのプロセスがあります。これらの子プロセスは、実際のWebサーバーが機能するものです。