使用RMI编写安全的Java代码

时间:2010-05-19 22:01:25

标签: java security rmi cajo

这似乎是一个非常广泛的问题,但任何帮助都表示赞赏。

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

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

有人能想到其他任何想法吗?

我知道有人可以编写恶意客户端 - 这并不难,因为您可以使用反射找到远程对象的API。但是,我可以采取哪些措施来保护服务器内的恶意客户端访问类/对象,而这些类/对象不应该访问它们?

非常感谢

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

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

这听起来不公平吗?如果我遗漏任何东西,请纠正我。

进一步更新:似乎对我要防范的内容感到有些困惑。我试图阻止的是“黑客”服务器的人。因此,基本上利用服务器转储/删除整个数据库,例如。

由于

4 个答案:

答案 0 :(得分:2)

通过RMI保护与潜在受损系统连接的系统非常困难。首先要做的是使用java.rmi.server.useCodebaseOnly系统属性禁用RMI的动态代码加载功能 - 不再需要移动代码(通过此通道)。正如RMI人员Stuart Marks指出的那样,这个属性现在默认安全,符合Oracle政策。

答案 1 :(得分:0)

我会使用自定义套接字工厂来加密所有RMI数据。例如。使用SSL将阻止查看数据,修改数据和重放攻击。

本教程介绍如何创建自定义RMI套接字工厂,以及对基于SSL的RMI的一般性讨论。

看起来似乎有很多工作,但是如果你真的必须隐藏敏感数据,那么将对象设为最终将无法提供任何真正的安全性 - 仍然可以读取敏感数据。

编辑:这几乎是一个有争议的问题,因为OP在下面的评论中提到正在使用VPN。

答案 2 :(得分:0)

Cajo是否只允许您在导出的对象上调用方法?如果是这样,只需导出可安全调用的远程对象。否则,如果您希望主机安全,则必须使用sandbox。另请参阅this

您需要SSL来阻止嗅探/修改网络流量。

答案 3 :(得分:0)

您提到您正在使用VPN,因此对于恶意客户端连接到您的服务器,他们必须对您的VPN进行压缩,或者在合法访问您的VPN的计算机上安装流氓软件。

一旦完成,就没有简单的方法来区分恶意客户端和授权软件。您可以为客户端软件的每个用户提供额外的凭据以进行其他身份验证,但如果客户端计算机受到限制,则可以对这些凭据进行压缩。更强的认证方案是向每个用户发送计算访问代码的小“小部件”。流氓客户端将无法访问此流量,并且由于它与客户端计算机在物理上是分开的,因此无法单独通过软件进行压缩。将其与每个用户的用户名/密码相结合将使一个用户窃取另一个用户的小部件失败。

取决于您想要的安全性以及您准备投入多少精力,这可能是过度的。如果您的主要关注是防止恶意客户端与使用该软件的普通用户的自动攻击,您可以通过在登录时显示capcha来实现“我是人”身份验证。

相关问题