11

検証されていないスクリプトをいくつか実行しようとしています (まだ決定されていない言語で書かれていますが、Java ベースである必要があるため、JRuby、Groovy、Jython、BeanShell などがすべて候補です)。私は、これらのスクリプトがいくつかのことを実行できるようにし、他のことを実行できないようにしたいと考えています。

通常は、Java の SecurityManager を使用するだけで済みます。これは非常に単純で、ファイルとネットワークへのアクセス、JVM をシャットダウンする機能などを制限できます。これは、ブロックしたい高レベルのものにはうまく機能します。

ただし、許可したいことがいくつかありますが、提供しているカスタム API/ライブラリを介してのみです。たとえば、直接のネットワーク アクセスで yahoo.com への URLConnection を開くことを許可したくありませんが、MyURLConnection でそれが行われていれば問題ありません。つまり、許可したい一連のメソッド/クラスがあり、それ以外はすべて立ち入り禁止にしたいということです。

この種のセキュリティは、標準の Java セキュリティ モデルで実現できるとは思いませんが、おそらく実現できるでしょう。スクリプト言語自体のパフォーマンスや柔軟性に関する特定の要件はありません (スクリプトは、基本的なループ/分岐を使用した API への単純な手続き型呼び出しになります)。したがって、すべてのリフレクション呼び出しでセキュリティ チェックをチェックする「大きな」オーバーヘッドでさえ、私には問題ありません。

提案?

4

3 に答える 3

4

免責事項:私はJavaセキュリティAPIの専門家ではないため、これを行うためのより良い方法があるかもしれません。

私はJavaベースのオープンソースエンタープライズCMSであるAlfrescoで働いており、あなたが説明しているものと同様のものを実装しました。スクリプトを許可したかったのですが、JavaAPIのサブセットをスクリプトエンジンに公開するだけでした。

JavaScriptスクリプトにはRhinoエンジンを選択しました。これにより、JavaScriptに公開されるAPIを制御できます。これにより、使用可能なクラスと使用できないクラスを選択できます。エンジニアによると、オーバーヘッドは10%程度で、それほど悪くはありません。

これに加えて、これはあなたにも関係があるかもしれませんが、Java側では、Acegi(現在はSpring Security)を使用し、AOPを使用して、特定のユーザーが呼び出すことができるメソッドをロールベースで制御します。これは、承認にはかなりうまく機能します。したがって、実際には、JavaScriptを介してアプリにアクセスするユーザーは、最初に制限付きAPIを使用できます。次に、承認に基づいてそのAPIをさらに制限できます。したがって、AOP手法を使用して、呼び出すことができるメソッドをさらに制限し、Groovyなどの他のスクリプト言語でこれを公開できるようにすることができます。基盤となるJavaに自信を持って、これらも追加中です。 APIは、不正アクセスからユーザーを保護します。

于 2009-02-09T21:29:24.157 に答える
3

親に委任する前に、クラスにリンクする獣医を行うカスタムクラスローダーを使用できる場合があります。

独自の権限を作成し、セキュリティに敏感なAPIでそれらを確認してAccessController.doPrivilegedから、基盤となるAPIを呼び出しながら適切な権限を復元するために使用できます。

スクリプトエンジン自体が安全であることを確認する必要があります。Sun JDKのRhinoのバージョンは問題ないはずですが、保証はありません。明らかに、スクリプトで利用可能なすべてのものが安全であることを確認する必要があります。

于 2009-02-09T22:16:23.403 に答える