4

質問はこれとよく似ていますが、別の問題に集中する必要があります。

大規模なデータベース (映画データベースなど) を持つアプリケーションがあるとします。アプリケーションのユーザーは、自分のプラグインを追加して実行できる必要があります。

シナリオは次のようになります。

  • メインアプリを起動
  • stats-plugin.jar を /app/plugins ディレクトリに配置します
  • メインアプリに新しいプラグインをロードするように伝えます
  • プラグインを一覧表示するようにアプリに指示する
  • プラグイン (たとえば、インストールしたばかりのもの) を選択して実行します
  • stats-plugin.jar は、映画についてデータベースにクエリを実行し、ホラー映画をカウントし、カウントを返します
  • メインアプリは結果を提示します


各プラグインには、などPluginと呼ばれる標準メソッド (共通インターフェース) が いくつかあります。onInitializeonRun

メイン アプリが保証する必要があるのは、プラグインがクラッシュした場合 (0 で除算など)、メイン アプリが安定したままであることです (たとえば、エラー ダイアログが表示されますが、それ自体はクラッシュしません)。実行時間を制限し、プラグインが実行している操作を確認することも可能です。

これはすべて、サンドボックス化されたプラグイン環境に要約されます。最も重要なことは次のとおりです。プラグイン スタイルの拡張性とプラグインのサンドボックス化 - 安全な操作のみを許可します (たとえば、DB を読み取り、更新しない)。

プラグインは Java で作成する必要はありません。何らかの方法で実行可能である必要があります...可能であれば、JavaScriptファイルでもかまいません。

そのようなタスクにどのように取り組みますか?

4

4 に答える 4

1

独自のセキュリティポリシーファイルと独自のセキュリティマネージャを使用して、そのようなことを行うことができます。基本的に、独自のjarにAllPermissionを付与し、プラグインjarに付与する権限を少なくします。そうすれば、信頼できないアプレットが利用できる操作を制限することはできません。そのため、無限ループを作成したり、100GBのRAMを割り当てたりするスレッドを作成することは可能です。

DBアクセスを許可するが、特定の操作のみを許可するには、信頼できる操作(最初にSELECTステートメントを検証するなど)のみを提供し、後でAccessController.doPrivilegedを呼び出す独自のAPI(信頼できるJarの1つにある)を提供する必要があります。操作を実行するために信頼されています。信頼できないコードは(特定のホストで許可されていない限り)ソケット接続を開かない可能性があるため、コードはそのようにDBを混乱させることはできません。

ただし、セキュリティマネージャを正しく実装するのは難しい場合があるため(最近のBatik Squiggleのように、実装にバグが見つかることがよくあります)、エミュレートされた言語(JavaScript / Rhinoなど)を使用する方が安全な場合があります。

于 2012-06-20T17:43:49.957 に答える
1

Security Managerの使用を検討し、おそらく独自のアクセス許可のいくつかを定義する必要があります。ポリシーを定義するときに使用できる、一般的に使用される一連のアクセス許可が既に用意されています。

RDBMS への読み取り専用アクセスは、Java 環境の範囲内にある可能性は低いことに注意してください。代わりに、これは通常、特定の権限を持つ別の RDBMS ユーザーを使用して処理されます。フレームワークは、そのユーザー名を使用して DB に接続する必要があります。

于 2012-06-20T17:42:11.600 に答える
0

Java Authentication and Authorization Serviceを使用して、このようなプラグ可能なアーキテクチャを実装できる場合があります。JAAS を使用すると、アクセス制御権限を制限してプラグインを実行できます。ACL は、ソケット接続のオープン、ファイルへの書き込み、データベース接続のオープンなどを制限できます。

データベース アクセスの場合、JNDI データソースを介してプラグインへのデータベース接続を提供し、データベースの読み取りのみが可能で更新はできない DB ユーザーを使用してデータソースを構成できます。

于 2012-06-20T17:54:57.313 に答える
-2

Java は、信頼できないプラグインを実行するのに適したプラットフォームではないと思います。プラグインが実行されると、ホスト プログラムが実行できるすべてのことを実行できるようになります。

メインプログラムの一部として実行する「安全な」操作の独自の抽象化レイヤーとサンドボックスを作成する必要があります。プラグインは、プログラムとして解釈するデータを提供できます。プラグインを実行させることはできません。

于 2012-06-20T17:31:46.163 に答える