私は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
パケットの送受信サービスなどの一部のユースケースではうまく機能しますが、ゲームトップスコアファイルなどの他のユースケースではうまく機能しません。
答え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
完璧な例です。user
同様のオプションセットを使用してすべてのディスクをマウントできますが、/etc/fstab
マウントするにはroot
権限が必要なため、SUIDビットが設定されます。
答え3
suid(またはsgid)ビットは、実行可能ファイルを呼び出したユーザーとは異なるユーザー/グループで実行します。
これを行う唯一の理由が特定のファイルにアクセスすることである場合は、他のメカニズムを使用してファイルを書き込み可能にすることができます。ただし、ユーザーはこれを行うことができます。何もないファイルに - プログラムが許可するだけではありません。
たとえば、特定の形式のファイルに1行だけ追加するようにプログラムを設定できます。ただし、ファイルシステム権限のみを使用している場合、ユーザーはファイルから行を削除することもできます。または間違った行を入れてください。
デフォルトでは、suidプログラムは任意のポリシーを適用できます。ファイルシステム権限は使用できません。たとえば、システムにsuidプログラムがあります/bin/su
。たとえば、ルートシェルを提供しているがポリシーを最初に満たす場合にのみ、通常はルートパスワードが必要です。権限だけではこれを行うことはできません。
答え4
私にとって最も簡単な例はpasswdコマンドです。このコマンドを使用すると、すべてのユーザーがroot権限なしで自分のパスワードを変更できます。ただし、すべてのパスワードが保存されているファイルはルートのみを書き込むことができます。
誰でもコンテンツを変更できるように、Shadowの権限を666に設定できますが、これは恐ろしいセキュリティ上の欠陥になります。したがって、SUIDが必要です。これにより、ユーザーはpasswdスクリプトを介してのみシャドウファイルを変更でき、制御された方法ですべてのユーザーに昇格した権限を付与できます。スクリプト自体は、ユーザーが他人のパスワードを変更できないことを保証します。
もちろんpasswdは書き込み禁止でなければなりません。そうでない場合、ユーザーはこのファイルを変更し、それを使用してroot権限でスクリプトを実行できます。