私はSUIDビットの概念とそれが役に立つ理由を理解しようとしています。
たとえば、次のようなプログラムがあるとします。
-rwsr-xr-x 1 root root 12364 Jan 12 2013 /usr/bin/foo
私が理解しているように、s
ユーザー所有者の実行ビットは、本質的にファイル所有者権限を持つ他のユーザーがファイルを実行できることを意味します。
私はなぜこれをしたいですか?すべてのユーザーが属するグループに適用されるようにファイルグループを変更した場合はどうなりますか?
ベストアンサー1
Setuidとsetgid(および存在する場合はsetcap)は、権限を高める唯一の方法です。このメカニズムを介さないと、プロセスは権限を放棄できますが、決して取得することはできません。したがって、追加の権限を必要とする操作を実行できません。
たとえば、プログラムはすべてのユーザーとしてコマンドを実行できる必要がありますsu
。sudo
したがって、どのユーザーが呼び出してもルートとして実行する必要があります。
もう一つの例はですping
。 TCPおよびUDPソケットは、すべてのユーザーがアクセスできます。これらのプロトコルにはポートの概念があり、プロセスがポートを制御して(これをポートバインディングと呼びます)、カーネルがパケットを送信する場所を知ることができるからです。 ICMPにはそのような概念がないため、rootとして実行されているプログラム(または適切な機能を持つプログラム)だけがICMPパケットを転送するように要求できます。すべてのユーザーがを実行できるようにするには、ping
プログラムping
に追加の権限が必要であるため、setuid root(またはsetcap)です。
グループ権限の例として、ローカルトップスコアをファイルに保存するゲームを考えてみましょう。スコアファイルには、ユーザーが実際に達成した最高スコアのみを保存する必要があるため、スコアファイルはプレイヤーが書くことはできません。スコアファイルにはゲームプログラムのみを書き込むことができます。したがって、ゲームプログラムはsetgidgames
であり、スコアファイルはグループ書き込み可能ですgames
が、プレーヤー書き込みは不可能です。
特権ランチャーで追加の特権を必要とするプログラムを実行して特権を増やす別の方法があります。ユーザーが追加の権限を必要とするタスクを実行したい場合は、特定の種類のプロセス間通信を使用して特権タスクを実行するフロントエンドプログラムを実行します。これは、オプションを解析し、進行状況を報告するping
プログラムping
、ping-backend
パケットの送受信サービスなどの一部のユースケースではうまく機能しますが、ゲームトップスコアファイルなどの他のユースケースではうまく機能しません。