私はSUIDビットの概念とそれらがなぜ役立つのかについて頭を悩ませています。
たとえば、私がプログラムを持っているとしましょう:
-rwsr-xr-x 1 root root 12364 Jan 12 2013 /usr/bin/foo
私の理解では、ユーザー所有者の実行ビットのs
は、基本的に、ファイル所有者の権限を持つ他のユーザーがファイルを実行できることを意味します。
なぜ私はこのようなものが欲しいのですか?すべてのユーザーが属するグループで機能するように、ファイルのグループを変更しないのはなぜですか?
特権を昇格させる方法は、setuidとsetgid(および存在する場合はsetcap)だけです。このメカニズムを介する以外に、プロセスは特権を放棄できますが、特権を取得することはありません。したがって、追加の特権を必要とすることは何もできません。
たとえば、プログラムsu
およびSudo
は、任意のユーザーとしてコマンドを実行できる必要があります。したがって、どのユーザーが呼び出したかに関係なく、rootとして実行する必要があります。
別の例はping
です。 TCPおよびUDPソケットは、すべてのユーザーがアクセスできます。これらのプロトコルにはポートの概念があり、プロセスがポートを制御できるため(バインディングと呼ばれます)、カーネルはどこにあるかを認識します。 ICMPにはそのような概念がないため、rootとして(または適切な機能を備えた)実行されているプログラムのみがICMPパケットのディスパッチを要求できます。すべてのユーザーがping
、ping
プログラムには追加の特権が必要なので、setuidルート(またはsetcap)です。
グループ特権の例として、ローカルのハイスコアをファイルに保存するゲームについて考えてみます。ユーザーが達成した実際のハイスコアのみをスコアファイルに保存する必要があるため、スコアファイルをプレーヤーが書き込みできないようにする必要があります。ゲームプログラムのみがスコアファイルへの書き込みを許可されている必要があります。したがって、ゲームプログラムはsetgid games
になり、スコアファイルはグループgames
によって書き込み可能ですが、プレーヤーによっては書き込み可能ではありません。
権限を昇格させる別のアプローチがあります。これは、特権ランチャープログラムから追加の権限を必要とするプログラムを開始することです。ユーザーが追加の特権を必要とするタスクを実行したい場合、ユーザーは、何らかの形式のプロセス間通信を使用して特権アクションを実行するフロントエンドプログラムを実行します。これは、ping
(オプションを解析して進行状況を報告する1つのping
プログラム、およびping-backend
パケットを送受信するサービス)。ただし、ゲームのハイスコアファイルなどの他のユースケースには使用できません。
Suid(またはsgid)ビットにより、実行可能ファイルは、それを呼び出すユーザーとは異なるユーザー/グループとして実行されます。
それを行う唯一の理由が特定のファイルにアクセスすることである場合、はい、他のメカニズムを使用してそのファイルを書き込み可能にすることができます。ただし、プログラムで許可されていることだけではなく、ユーザーはファイルに対してanythingを実行できます。
たとえば、プログラムでファイルへの行の追加のみを許可し、特定の形式でのみ許可することができます。ただし、ファイルシステムのアクセス許可を使用しただけの場合、ユーザーはファイルから行を削除することもできます。または、不適切な形式の行を入力します。
基本的に、suidプログラムは任意のポリシーを適用できます。ファイルシステムのアクセス許可はできません。例として、システムにはsuidプログラムがあります/bin/su
。これは(たとえば)ルートシェルを提供しますが、最初にポリシーを満たした場合にのみ、通常はルートパスワードを入力します。権限だけでそれを行う方法はありません。
最も一般的な理由は、実行可能ファイルをrootとして実行できるようにするためです。例えば:
find /bin/ -type f \( -perm -4000 -o -perm -2000 \) -ls | awk '{print $3,$NF}'
-rwsr-xr-x /bin/su
-rwsr-xr-x /bin/mount
-rwsr-xr-- /bin/fusermount
-rwsr-xr-x /bin/ping6
-rwsr-xr-x /bin/ping
-rwsr-xr-x /bin/umount
これらはすべて、通常のユーザーが実行できるコマンドですが、昇格された特権が必要です。 mount
は完璧な例です。user
または同様のオプションが/etc/fstab
に設定されているディスクをマウントできますが、マウントにはroot
権限が必要なので、SUIDビットはセットする。