3

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

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

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

谁能想到其他的想法?

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

非常感谢

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

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

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

进一步更新:似乎我试图阻止的事情似乎有些混乱。我试图阻止的是有人“入侵”服务器。因此,例如,基本上是利用服务器转储/删除其整个数据库。

谢谢

4

4 回答 4

2

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

于 2010-06-01T13:33:14.830 回答
0

Cajo 是否只允许您调用导出对象的方法?如果是这样,只需导出可安全远程调用的对象。否则,如果您希望主机安全,您将被迫使用沙箱。也看到这个

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

于 2010-05-19T23:45:16.173 回答
0

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

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

看起来工作量很大,但如果你真的必须从授权的眼睛中隐藏敏感数据,那么将对象设为最终将不会提供任何真正的安全性——敏感数据仍然可以被读取。

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

于 2010-05-19T22:07:33.850 回答
0

您提到您正在使用 VPN,因此对于连接到您的服务器的恶意客户端,他们将不得不破坏您的 VPN,或者在可以合法访问您的 VPN 的机器上安装流氓软件。

完成此操作后,就没有简单的方法可以将流氓客户端与您的授权软件区分开来。您可以为客户端软件的每个用户提供额外的凭据以进行额外的身份验证,但如果客户端计算机受到损害,这些可能会受到损害。更强大的身份验证方案是向每个用户发送一个计算访问代码的小“小部件”。流氓客户端将无法访问它,并且它不能仅通过软件来破坏,因为它与客户端计算机在物理上是分开的。将此与每个用户的用户名/密码相结合,将阻止一个用户窃取另一个用户的小部件。

根据您想要它的安全程度以及您准备投入多少精力,这可能是矫枉过正。如果您主要关心的是防范来自流氓客户端和使用该软件的普通用户的自动攻击,您可以通过在登录时显示验证码来实现“我是人类”身份验证。

于 2010-05-20T10:19:59.567 回答