問題タブ [cajo]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - RMI を使用した安全な Java コードの作成
これは非常に広範な質問のように思えるかもしれませんが、どんな助けも大歓迎です。
Cajo プロジェクト (RMI を使用) を使用する Java で記述されたクライアント/サーバー ソリューションがあります。サーバーとクライアント間で転送される機密データを考慮して、ソリューションを可能な限り安全なものにしたいだけです。
これまでのところ、私の考えは、すべてのクラスを「最終」にし、サーバー内のすべてのクラスに対して「シリアル化できない」例外をスローすることです (RMI レジストリにバインドされたオブジェクトと、実際に必要なオブジェクトを除く)。もちろん転載可)。
他のアイデアを思いつく人はいますか?
誰かが悪意のあるクライアントを作成できることは知っています。リフレクションを使用してリモート オブジェクトの API を見つけることができるので、これを行うのは難しくありません。しかし、悪意のあるクライアントがアクセスするべきではないサーバー内のクラス/オブジェクトにアクセスするのを防ぐためにできることはありますか?
どうもありがとう
更新: 有益なヒントを提供してくださった皆様に感謝いたします。ご連絡が遅くなり申し訳ありません。安全なシステムを作るための私の現在の考え方は次のとおりです。
- クライアントとサーバー間で OpenVPN を使用します。つまり、アクセスするには物理クライアントにアクセスする必要があります。(注:以下の2点により、VPNは実際にはサーバーとオフィスLANの間になります。これで十分安全だと思います)
- サーバーとクライアント間の認証には、ユーザー名とパスワードを使用します (おそらく JBOSS を使用します)。これは、サーバー上で何かを行うために、攻撃者がユーザー名とパスワードを必要とすることを意味します。
- 実際にネットワーク経由で送信されるはずのオブジェクトを除いて、すべてのオブジェクトに対して「シリアル化できない」例外をスローします。これにより、機密オブジェクトがネットワーク経由で送信されなくなります。
それは公平に聞こえますか?何か不足している場合は修正してください。
さらなる更新:私が防ごうとしているものについて混乱があるようです。私が阻止しようとしているのは、誰かがサーバーを「ハッキング」することです。したがって、基本的にサーバーを悪用して、たとえばデータベース全体をダンプ/ドロップします。
ありがとう
java - RMI サーバー コードの変更の防止
Java RMI (Cajo プロジェクト経由) を使用するクライアント サーバー ソリューションを作成しています。
サーバーをできるだけ安全にしたい。Java リフレクションを使用することにより、悪意のあるクライアントは、RMI レジストリにバインドされているか、サーバーから「プロキシ」されている任意のオブジェクト内のすべてのメソッド名とフィールド名を表示できることを理解しています (Cajo では、プロキシされたアイテムは実際にはサーバー上に存在するオブジェクトですが、クライアントはそれを参照できます)。しかし、悪意のあるクライアントは、プログラム ロジックを表示したり、サーバー上のコードを変更したりできますか? または、フィールドの実際の内容を表示するにはどうすればよいでしょうか?
サーバーへの物理的なアクセスは許可されておらず、サーバーへの唯一のネットワーク アクセスは Cajo TCP ポート (1198) 経由であると想定してください。
ありがとう
java - ローカル JVM 間の通信
私の質問:ローカルで実行されている 2 つ以上の JVM インスタンス間で通信するには、どのような方法をとればよいですか?
問題の説明:
特定のタスクを互いに完全に分離するために別個の JVM インスタンスを必要とするプロジェクト用のシステムを開発しています。
実行中、「親」JVM は、実行を期待する「子」JVM を作成し、結果を (比較的単純な POJO クラスまたは構造化された XML データの形式で) 返します。これらの結果は、SysErr/SysOut/SysIn パイプを使用して転送されるべきではありません。これは、子が実行の一部としてこれらを既に使用している可能性があるためです。
子 JVM が一定時間内に結果を返さない場合、親 JVM は子プロセスに信号を送って処理を停止するか、子プロセスを強制終了できるようにする必要があります。それ以外の場合、子 JVM はタスクの完了時に正常に終了する必要があります。
これまでの調査:
役立つ可能性のある技術がいくつかあることは承知しています。
- Java の RMI ライブラリを使用する
- ソケットを使用してオブジェクトを転送する
- Cajo、Hessian などの配布ライブラリの使用
...しかし、これらのオプションのいずれかまたは他のオプションを追求する前に、他の人がどのようなアプローチを検討するかを聞くことに興味があります.
これに関する助けやアドバイスをありがとう!
編集:
転送するデータの量 -比較的小さいですが、ほとんどの場合、子の実行結果を表す文字列を含むほんの一握りの POJO になります。大量の情報に対して非効率的な解決策がある場合、これが私のシステムで問題になる可能性はほとんどありません。転送される金額はかなり静的である必要があるため、これはスケーラブルである必要 はありません。
この場合、転送のレイテンシーは重大な問題ではありませんが、結果の「ポーリング」が必要な場合は、大きなオーバーヘッドなしでかなり頻繁に行うことができるため、後でこれに加えて応答性の高い GUI を維持できます (例: プログレス バー)
java - リモートJavaプログラムを管理する方法は?
リモートで実行するJavaプログラム(実行中のタスクのステータスの表示、タスクのロード/開始/停止)を管理するためのGUIを構築したいのですが、複雑なことは何もありません。
これまでの私の最善のアイデアは、CAJOを使用することです。
優れている可能性のある別のアプローチはありますか?
Javaプログラムは、標準のJavaSE実行可能ファイルです。Webアプリの一部ではありません。
java - SSH を介してすべての RMI トラフィックをトンネリングする方法
SSH トンネルを介して cajo rmi トラフィックをトンネリングする作業を行っています。
そのために、SSH デーモン (apache Mina) を実行するサーバーと、SSH クライアント (Trilead SSH) を実行するクライアントがあります。
これらのマシン間の shh 接続を確立し、ローカルおよびリモート ポート フォワーディングを適用することで、rmi トラフィックをトンネリングできますが、これは送信 (サーバーへの) 方向でのみ機能します。
セットアップ:
アクティブな SSH 接続 (ポート 22)
クライアント: ローカル ポート 4000 をリモート ホスト ポート 1198 に転送します (このトラフィックは実際にはトンネルを通過します) サーバー: サーバー ポート 4000 をクライアント ポート 1198 に転送します (トンネルのこの部分は、カジョ)
サーバーは、以下を使用してオブジェクトをエクスポートします。
クライアントは、以下を使用してオブジェクト ルックアップを行います。
ポート フォワーディングは、クライアント側で trilead ssh ライブラリを使用して呼び出されます。
WireShark を使用して 2 台のマシン間の IP トラフィックを分析すると、ルックアップがトンネル経由でリダイレクトされていることがわかりますが、応答はそうではありません。通常、応答はクライアントのポート 1198 に送信されます。
リモート呼び出しの応答をクライアントにトンネリングして戻すために、サーバーがローカル ポートに応答を送信するように強制するにはどうすればよいですか?
更新: ここでの問題は、RMI オブジェクトのポートがレジストリ ポートとは異なるため、転送する必要があることです。
つまり、クライアント 10.0.0.1 は //10.0.0.1:4000 をルックアップし、サーバーの RMI ポートに (トンネル経由で) 転送されます。その後、サーバーは 10.0.0.1:1198 に応答します。ここで、トンネルを使用するために、代わりにサーバーがローカル ポート 4000 にトラフィックを送信するようにします。
cajo Remote.config(ServerAddress, ServerPort, ClientAddress, ClientPort) 設定をいじろうとしましたが、このメソッドの clientaddress を 10.0.0.1 または 127.0.0.1 に設定すると、応答が返されず、応答するトラフィックがまったく表示されません...