
SUID ビットの概念とそれがなぜ役立つのかを理解するのに苦労しています。
たとえば、次のようなプログラムがあるとします。
-rwsr-xr-x 1 root root 12364 Jan 12 2013 /usr/bin/foo
私の理解では、s
ユーザー所有者の実行ビットは、基本的に、ファイル所有者の権限を持つ他のユーザーがファイルを実行できることを意味します。
なぜこのようなことが必要になるのでしょうか? ファイルのグループを変更して、すべてのユーザーが属するグループで動作するようにしないのはなぜでしょうか?
答え1
setuid と setgid (および存在する場合は setcap) は、権限を昇格する唯一の方法です。このメカニズム以外では、プロセスは権限を放棄することはできますが、権限を取得することはできません。したがって、追加の権限を必要とする操作は実行できません。
たとえば、プログラムはsu
、sudo
どのユーザーでもコマンドを実行できる必要があります。したがって、どのユーザーが呼び出したかに関係なく、プログラムは root として実行する必要があります。
もう 1 つの例は ですping
。TCP および UDP ソケットは、どのユーザーからもアクセスできます。これらのプロトコルにはポートの概念があり、プロセスはポートを制御できるため (これをバインドと呼びます)、カーネルはパケットの送信先を認識できます。ICMP にはそのような概念がないため、ルートとして (または適切な機能を使用して) 実行されているプログラムだけが、ICMP パケットが自分に送信されるように要求できます。すべてのユーザーが を実行できるようにするにはping
、ping
プログラムに追加の権限が必要であり、setuid root (または setcap) にする必要があります。
グループ権限の例として、ローカルのハイスコアをファイルに保存するゲームを考えてみましょう。スコア ファイルにはユーザーが実際に獲得したハイスコアのみを保存する必要があるため、スコア ファイルはプレイヤーが書き込み可能であってはなりません。スコア ファイルへの書き込みはゲーム プログラムのみに許可する必要があります。そのため、ゲーム プログラムは setgid に設定されgames
、スコア ファイルはグループが書き込み可能games
で、プレイヤーは書き込み不可になります。
権限を昇格する別の方法として、特権ランチャー プログラムから追加の権限を必要とするプログラムを起動する方法があります。ユーザーが追加の権限を必要とするタスクを実行したい場合、何らかの形式のプロセス間通信を使用して特権アクションを実行するフロントエンド プログラムを実行します。これは、ping
(ping
オプションを解析して進行状況を報告する 1 つのプログラムと、ping-backend
パケットを送受信するサービス) などの一部のユース ケースではうまく機能しますが、ゲームのハイ スコア ファイルなどの他のユース ケースではうまく機能しません。
答え2
最も一般的な理由は、実行可能ファイルを 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
ディスクをマウントできますが、マウントには権限が必要なので、SUID ビットが設定されます。user
/etc/fstab
root
答え3
suid (または sgid) ビットにより、実行可能ファイルは、それを呼び出したユーザーとは異なるユーザー/グループとして実行されます。
もしそれが特定のファイルにアクセスするためだけのことであれば、そのファイルを書き込み可能にするために他のメカニズムを使うこともできます。しかし、その場合ユーザーは何でもプログラムが許可するものだけではなく、ファイルに追加することもできます。
たとえば、プログラムでファイルに 1 行だけ追加できるようにし、しかも特定の形式でのみ追加できるようにすることができます。しかし、ファイルシステムの権限だけを使用した場合、ユーザーはファイルから行を削除することもできます。または、不適切な形式の行を挿入することもできます。
基本的に、suid プログラムは任意のポリシーを適用できます。ファイルシステムの権限では適用できません。たとえば、システムに suid プログラムがあるとします/bin/su
。このプログラムでは、たとえばルート シェルが提供されますが、これは最初にポリシーを満たした場合 (通常はルート パスワードを入力する) にのみ行われます。権限だけではこれを行う方法はありません。
答え4
私にとって最も簡単な例は、passwd コマンドです。このコマンドを使用すると、どのユーザーでも、root 権限を必要とせずに自分のパスワードを変更できます。ただし、すべてのパスワードが保存されているファイルは、root のみが書き込み可能です。
誰でもコンテンツを変更できるように、シャドウの権限を 666 に設定することもできますが、これはセキュリティ上の重大な欠陥となります。そのため、SUID が必要になります。これにより、ユーザーはパスワード スクリプトを通じてのみシャドウ ファイルを変更できるため、制御された方法で任意のユーザーに昇格された権限を与えることができます。スクリプト自体は、ユーザーが他のユーザーのパスワードを変更できないようにします。
もちろん、passwd は書き込み禁止にする必要があります。そうしないと、ユーザーはこのファイルを変更し、ルート権限でスクリプトを実行することができます。