実行可能なバイナリにSUID権限が必要な理由に関する私の懸念を理解するには、この長い紹介を読んでください。
- LinuxのプロセスはEUIDを使って学習します。有効なユーザーIDそれ自体。
- ユーザーの権限は、プロセスが他のファイルと対話する方法(プロセスがファイルに書き込むことができるかどうか)を決定するために使用されます。
以下を使用してパスワードを変更するシナリオを検討してください。/usr/bin/passwd
実生活でのLinux
- パスワードはに保存されます。ファイルは権限()を持つファイル
/etc/shadow
に属します。root
rw-------
- もし
$passwd
権限がありますrwx--x--x
。これは、ルートのみロジックを変更できることを意味します。パスワードプログラム。 userA
プログラムを実行すると、passwd
プロセスは次のように始まります。ルイド=EUユーザーID=ユーザーA
結果は次のとおりです。プログラムが実行されます。 ㅏpasswd
プロセス起動しましたが、パスワードを変更できません。EUユーザーIDはいユーザーAそしてユーザーAを書き込めません/etc/shadow
。
この時SUID権限が必要です到着スエイド設定を許可EUユーザーIDプロセスを生成するためにバイナリが実行されるプロセス。これEUユーザーIDバイナリの所有者として設定されます。
- 環境SUID権限
/usr/bin/passwd
ブランド所有者の場合EUユーザーIDどのpasswd
プロセス任意のユーザーによって開始されましたEUユーザーID~のroot
root
に書き込むことができるので、すべての/etc/shadow
ユーザーが次のようにpasswd
実行できます。passwd
プロセスこれは変わることができます/etc/shadow
持つSUID権限なぜなら、LinuxではEUユーザーIDプロセスの所有者は実行可能なバイナリの所有者としてハードに設定されません(プロセスは実行時に生成されます)。
私の理想的なLinux
不要SUID権限。実行ファイルの場合空A作成者(および所有者)ユーザーA、実行できるすべてのユーザー空A作成しますプロセスそしてEUユーザーID=ユーザーA。
パスワードを変更するシナリオでは、このアイデアの論理は次のとおりです。
- 根
/usr/bin/passwd
唯一の所有者です根ロジックを変更できます。 - 内部ロジック
/usr/bin/passwd
では、ユーザーは自分のパスワードのみを変更でき、他のユーザーのパスワードは変更できません。 - 他のユーザーは変更できません
/usr/bin/passwd
。根できる。 /etc/shadow
書くことしかできないroot
結果は次のとおりです。権限のないユーザーがuserA
実行できます$passwd
。passwd
プロセス。このプロセスではEUユーザーID=根shadow
だからファイルに書き込むことができます。
この理論により、私たちは以下を達成することができます。誰もが特別な措置を取らずに自分のパスワード(および自分のパスワードのみ)を変更できます。SUID権限。
ベストアンサー1
どちらの例も setuid の仕組みを説明しています。ただし、「理想的なLinux」では、すべての実行可能ファイルが実行可能ファイル所有者のEUIDで始まり、システム内のすべての実行可能ファイルがsetuid実行可能ファイルになります。
これは明らかに多くの問題を引き起こす。いくつかの例を挙げると、すべてのルート所有の実行可能ファイルはUID検証を実行し、setuid()
プロセスのEUIDをroot以外のユーザーにリセットするように呼び出す必要があります(プログラムに他の権限がないことが必要な場合)。ユーザーはプロセスが誤ったEUIDで実行され、誤った慣行によって重大な結果が生じる可能性があるため、他のユーザーは実行可能ファイルを提供できません(たとえば、ユーザーが所有するすべてのファイルへchmod 777
のアクセスも許可されています)。そして、これがもっとあります。
setuidバイナリを持たない一般権限には、権限のないユーザーが特権操作を実行できるようにする別のメカニズムが必要です。 Setuid バイナリはこれらの特権の昇格を許可し、アクセス制御はプログラムロジックで実装されます。