3

ユーザーに代わってネットワーク インターフェイスを管理するアプリケーションを開発しており、変更を加えるには root が必要ないくつかの外部プログラム (ifconfig など) を呼び出します。(具体的には、ローカルインターフェースのIPアドレスの変更など) 開発中、IDEはroot(うーん)、デバッガーはroot(うーん)で動かしていました。エンドユーザーが root 以外のアカウントでこれらを実行する良い方法はありますか? GTK、wxPython、Python、およびルートとして実行されているアプリケーションによって提示される攻撃面のサイズが非常に嫌いです。

機能を調べましたが、中途半端に見え、特にスレッドベースの場合、Pythonで使用できるかどうかわかりません。私が検討していない唯一のオプションは、setuid ビットが設定され、UI に代わってすべてのルート タイプの処理を行うデーモンです。root として実行することはユーザーにとって大きな問題ではないため、プロジェクトの初期段階でそのような複雑さを導入することをためらっています。

4

7 に答える 7

7

デーモンについてのあなたの考えには、導入する複雑さにもかかわらず、多くのメリットがあります。アクションがroot としてのユーザー インターフェイスの対話を必要としない限り、デーモンを使用すると、許可される操作と許可されない操作を制御できます。

ただし、SUDO を使用して、ROOT と通常のユーザーの間で制御された妥協を作成できます...必要な特定のツールについて、問題のユーザーに SUDO アクセスを許可するだけです。これにより、「許可された」ルートの起動のみが許可されるため、攻撃対象領域が減少します。

于 2008-10-29T23:11:01.310 に答える
3

欲しいのは「グループ」

グループを作成し、アクションを実行したいアカウントがそのグループに属していることを指定してから、アクセスしたいリソースがそのグループのメンバーであることを指定します。

グループ管理は時々いらいらするかもしれませんが、それはあなたがやりたいことを何でもできるようにするべきであり、あなたのプログラムではなくユーザーが許可されています.

(プログラムを許可する場合は、特定のユーザーを作成して実行し、そのユーザーに適切なグループ メンバーシップを付与してから、プログラム内のそのグループに su して、実行中のユーザーに権限を与えずに操作を実行できます。)

于 2008-10-29T23:11:35.100 に答える
1

伝統的な方法は、setuid ヘルパーを作成して使用し、必要なことを行うことです。ただし、setuid ヘルパーを適切に作成するのは難しいことに注意してください (防御しなければならない攻撃ベクトルがいくつかあります)。

最新の方法は、アプリケーションの残りの部分からの要求をリッスンするデーモン (ルートとして実行され、ブート時に開始される) を使用することです。このように、攻撃面は、選択した IPC にほとんど制限されます (最新の方法であると思われる d-bus をお勧めします)。

最後に、ネットワーク インターフェイスを管理している場合、行うことは、最新のディストリビューションで network-manager が行うことと非常に似ています。あなたがやっていることを何らかの方法で network-manager と統合しようとする (そうすれば、あなたの操作と競合しない) か、少なくともそれがどのように機能するかを調べるのは良い考えです。

于 2008-10-30T00:08:28.480 に答える
1

アプリケーションの selinux ポリシーを作成して配布できます。Selinux では、必要な種類のきめの細かいアクセスが可能です。selinux を使用できない、または使用しない場合は、デーモンを使用することをお勧めします。

于 2008-10-29T23:10:17.023 に答える
1

アプリケーションをルートとしてフルタイムで実行することはしませんが、特定のアプリケーションの sudo などを使用して、アプリケーションをルートに設定するか、ルートになる ID に設定することを検討することをお勧めします。ログインできないアカウントを設定し、setuid を使用してプログラムの ID を変更し (一時的に必要な場合)、パスワードを要求しないように sudo を設定することができますが、特定のタスクについては常にそのアカウントへのアクセスを許可します。

このようにして、プログラムは通常の実行時に特別な特権を持たず、必要なときにのみ特権を昇格させ、sudo によって特定のプログラムのみを実行するように制限されます。

多くの Unix 開発を行ってからしばらく経っているので、sudo をセットアップしてパスワードを要求しないようにすることができるかどうか (またはそのための API がある場合でも) はよくわかりませんが、フォールバックとして必要な場合にのみ root に対して setuid を有効にします。

[編集] sudoには NOPASSWD モードがあるように見えるので、プログラムを外部コマンドとして実行しているので、うまくいくはずです。

于 2008-10-29T23:10:23.730 に答える
0

Python については、その言語で必要なコマンドを説明できるほど詳しくありませんが、親プロセスと子プロセスの間で通信するパイプをフォークして使用することで、これを達成できるはずです。次のようなもの:

  • sudo または suid を介して root としてプログラムを実行します
  • 起動時に、プログラムはすぐに fork し、親プロセスと子プロセス間の通信用のパイプを確立します。
  • 子プロセスはルート権限を保持しますが、パイプからの入力を待機するだけです
  • 親プロセスは root をドロップし (uid をそれを実行しているユーザーのものに戻します)、GUI を表示し、ユーザーと対話し、非特権ユーザーが使用できるすべての操作を処理します。
  • ルート権限を必要とする操作が実行される場合、(非ルート) 親プロセスはコマンドをパイプを介して (ルート) 子プロセスに送信し、子プロセスはそれを実行し、オプションで親プロセスに報告します。

これは、独立したデーモンよりも書くのが少し簡単で、実行するのも便利です (デーモンが実行されているかどうかを気にする必要がないため)。非ルートとして実行するためにルート権限は必要ありません。

于 2008-10-30T00:04:26.507 に答える
0

「通常の」ユーザーとルートの中間にいるユーザーは 1 人もいません。ルートがあり、ユーザーがいます。ユーザーはさまざまなレベルの機能を持つことができます。「通常の」ユーザーよりも強力であり、root ほど強力ではないものが必要な場合は、必要な機能を持つ新しいユーザーを作成するだけで、必要のない特権を与えないでください。

于 2008-10-29T23:06:28.183 に答える