java - 使用 RMI 编写安全的 Java 代码

标签 java security rmi cajo

这似乎是一个非常宽泛的问题,但我们将不胜感激。

我有一个用 java 编写的客户端/服务器解决方案,它使用 Cajo 项目(使用 RMI)。考虑到将在服务器和客户端之间传输的敏感数据,我只想尝试让我的解决方案尽可能安全。

到目前为止,我的想法是让我的所有类都成为“最终类”,并为我在服务器中的所有类抛出一个“不可序列化”的异常(除了 RMI 注册表中绑定(bind)的对象,以及任何当然实际上确实需要转移)。

谁能想到任何其他想法?

我知道有人可以编写恶意客户端 - 这并不难,因为您可以使用反射找到远程对象的 API。但是,我能做些什么来保护恶意客户端访问服务器中他们不应该访问的类/对象吗?

非常感谢

更新: 感谢大家提供有用的提示,很抱歉这么长时间才回复您。我目前的思路是建立一个安全的系统:

  • 在客户端和服务器之间使用 OpenVPN。这意味着您需要访问物理客户端才能获得访问权限。 (N.B. 由于以下2点,VPN实际上会在服务器和办公室局域网之间。我觉得这样就足够安全了)
  • 使用用户名和密码(可能使用 JBOSS)在服务器和客户端之间进行身份验证。这意味着要在服务器上完成任何操作,攻击者需要用户名和密码。
  • 为所有对象抛出一个“不可串行化”的异常,除了那些实际上应该通过网络发送的对象。这会阻止敏感对象通过网络发送。

这听起来公平吗?如果我遗漏了什么,请纠正我。

进一步更新:似乎对我要防止的内容有些混淆。我要防止的是有人“入侵”服务器。例如,基本上是利用服务器转储/删除其整个数据库。

谢谢

最佳答案

保护通过 RMI 与可能受到危害的系统连接的系统非常困难。首先要做的是使用 java.rmi.server.useCodebaseOnly 系统属性禁用 RMI 的动态代码加载功能 - 不再有移动代码(通过此 channel )。正如 RMI 人员 Stuart Marks 所说,此属性现在默认情况下是安全的,符合 Oracle 政策。

关于java - 使用 RMI 编写安全的 Java 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2869771/

相关文章:

java - 为什么我不能使用 selenium 将图像上传到上传输入按钮?手动打开时工作正常,但为什么不能通过selenium工作?

java - 如何区分父类(super class)的ArrayList中的子类

java - OpenGL gl3 中如何处理不同数量的顶点?

java - Wsimport 生成的类和我的原始 Web 服务类中的名称冲突

java - 动态下载 .class 时出现 AccessControl 异常

java - 没有找到适合 UnicastRemoteObject() 的构造函数

java - LocateRegistry.createRegistry() 不能使应用程序保持 Activity 状态

security - 检查机器数量

python - 当命令的一部分来自用户输入时,在 Linux 服务器上执行命令的安全方法

java - Spring Security 拒绝访问 html 资源