実行可能なバイナリに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 バイナリはこれらの特権の昇格を許可し、アクセス制御はプログラムロジックで実装されます。
答え2
表示された回答は私の質問に完全に答えました。ここに入れたのは、説明に役立つ追加のロジックです。SUID権限パスワード変更シナリオについて。
Linuxでは、実行可能なbinファイルを他のユーザーが実行する必要があります。
たとえば、
/usr/bin/nano
テキストエディタのbinなので、同じ実行可能なbinファイルを別のユーザーが実行できることが合理的です(なぜ同じbinファイルを各ユーザーのホームファイルシステムにコピーするのですか?)多くのユーザーが同じbinファイルを使用できるようにする必要がありますが、そのbinファイルによって開始されたプロセスはファイルに対して異なる権限を持っている必要があります。
例えば、ユーザーAそしてユーザーBどちらも2つのナノを生成できるはずです。プロセス同じ
/usr/bin/nano
binファイルを実行するだけです。しかし、ユーザーAナノのプロセス許可されなければならないユーザーA自分のファイルだけを修正し、その逆の場合も同様です。
これにはメカニズムが必要です。プロセス適用されるべきプロセスを開始したユーザーと同じ権限を持ちます。このファイルにはファイルがあります(実行可能なbinファイルを所有するユーザーの権限の代わりにこれはプロセスを作成するために行われます)。
Linuxでは、すべてのプロセスにルイド。これルイドプロセスを開始したユーザーのID。このロジックによると、ルイドプロセスのユーザーは、プロセスがファイルに対して使用する権限を持つユーザーでなければなりません(たとえば、プロセスはファイルの内容に基づいてファイルに対して実行できる操作を決定します)。ルイドユーザーはファイルに対して操作を実行できます。
ただし、パスワードを変更する場合はルイド次の理由で十分ではありません。
/etc/shadow
そのファイルは自分以外の人は変更できません。根。- パスワードを変更したいユーザーは、
/usr/bin/passwd
実行可能なbinファイルを実行してパスワードを変更する必要があります。プログラムのロジックは、権限の低いユーザーが自分のパスワードのみを変更できるようにします。 - ルートのみがこのbinファイルに書き込むことができるため、root以外のユーザーはこのロジックを変更できません。
- もしユーザーA
/usr/bin/passwd
実行するとpasswd
プロセスWHOルイドはいユーザーA。 - しかし、その後ユーザーA書き込みは許可されていません
/etc/shadow
。passwd
プロセス彼はまた最初はファイルに書き込めなかった。
これにはメカニズムが必要です。プロセスファイルに対する他のユーザーの権限に基づいて、ファイルに対する1人のユーザーの権限を決定します(プロセスを開始したユーザーの権限ではありません)。
Linuxでは、ファイルに対するプロセスの権限はファイルの権限から取得されます。EUユーザーIDそのファイルにあります。
そしてEUユーザーID、根今利用可能SUID権限許可するユーザーA始めるpasswd
プロセス持つEUユーザーID設定根。これにより効果的にpasswd
プロセス次から始まったユーザーA/etc/shadow
ファイルを変更します。