2009-08-25 95 views
7

使用正在运行应用程序服务器进程的用户的权限保护Java Web应用程序是否足够,还是使用SecurityManager和合适的策略文件合理吗?我应该在Java Web应用程序中使用安全管理器吗?

我曾经做过前者,而不是后者,但有些客户希望我们也使用SecurityManager,它会明确授予每个第三方组件的权限,以确保没有任何潜在的恶意代码。

我见过一些Servlet容器,如Resin建议不要使用SecurityManager来减慢速度。有什么想法吗?

回答

9

尽管我不想推荐使用而不是使用安全功能,但我认为SecurityManager更多用于管理JVM中执行不可信或第三方代码的情况。考虑小应用程序或托管的共享应用程序服务器方案。如果你完全控制了应用服务器,并且没有运行其他人的代码,我认为这是多余的。根据我的经验,启用SecurityManager确实会对性能产生重大影响。

+0

在我们的例子中,第三方代码是各种已知的OS库。检查每行代码以检查是否存在任何潜在的“不良”代码是相当多的工作。我信任这些库,但我们的客户有点偏执:) – Kaitsu 2009-08-25 11:55:57

+0

在你说你没有运行其他人的代码之前,你需要小心。例如,如果您解析XML,但可以使用XML外部实体(XEE)攻击,但大多数人会说这只是数据。 – bgiles 2010-09-28 21:02:32

1

对于您的问题,没有简单的是/否回答,因为它确实取决于:您想要保护什么,以及您想要保护什么?

例如,我使用SecurityManager来实现IP过滤,并只允许列入白名单的IP地址连接到我的应用程序。如果您只是想禁止访问磁盘文件,可能以更低权限运行应用程序是更好的解决方案。

如果您完全不信任第三方插件,请记住,一旦允许执行插件代码,即使您使用SecurityManager,该插件也可能会导致应用程序崩溃。如果您的应用程序加载插件,可能是白名单插件,并在加载插件之前检查列表是更好的解决方案。

如果您决定使用它,您将会受到性能影响(因为JVM将执行更多检查),但运行速度取决于执行检查的代码/配置。我的IP白名单相当快,因为​​它只包含单个列表查询;如果你的检查包括调用远程Web服务和访问数据库,你可以减慢很多事情的速度,但另一方面,如果你有足够的硬件和很少的并发用户(换句话说,如果你能负担得起),即使这不重要, 。

1

正确地在java中配置安全管理器可能很困难。例如,如果您不限制安全管理器本身,只需将安全管理器设置为空即可绕过所有安全性。

使用安全管理才有意义,如果你的JVM运行不可信代码,否则它是一个痛苦的成立,因为你必须预先知道什么权限应为每个功能(例如设置:RMI ,套接字,I/O)和每个客户端。

相关问题