使用运行应用程序服务器进程的用户的权限来保护 Java Web 应用程序是否足够,或者将 SecurityManager 与合适的策略文件一起使用是否合理?
我曾经使用前者而不是后者,但有些客户希望我们也使用 SecurityManager,它会显式地授予每个第三方组件权限,以确保没有任何恶意代码潜伏在那里。
我见过一些 Servlet 容器,比如Resin,建议不要使用 SecurityManager 来减慢速度。有什么想法吗?
使用运行应用程序服务器进程的用户的权限来保护 Java Web 应用程序是否足够,或者将 SecurityManager 与合适的策略文件一起使用是否合理?
我曾经使用前者而不是后者,但有些客户希望我们也使用 SecurityManager,它会显式地授予每个第三方组件权限,以确保没有任何恶意代码潜伏在那里。
我见过一些 Servlet 容器,比如Resin,建议不要使用 SecurityManager 来减慢速度。有什么想法吗?
虽然我讨厌建议不要使用安全功能,但我认为 SecurityManager 更适合管理在 JVM 中执行不受信任或第三方代码的情况。想想小程序,或托管的共享应用程序服务器方案。如果您完全控制了应用服务器并且没有运行其他任何人的代码,我认为这是多余的。根据我的经验,启用 SecurityManager 确实会对性能产生重大影响。
在 java 中正确配置安全管理器可能很困难。例如,如果您不限制安全管理器本身,则只需将安全管理器设置为空即可绕过所有安全性。
仅当您的 JVM 将运行不受信任的代码时,使用安全管理器才有意义,否则设置起来很麻烦,因为您必须事先知道应该为每个功能设置什么权限(例如:RMI、套接字、I/O ) 和每个客户。
您的问题没有简单的是/否的答案,因为这实际上取决于:您要保护什么,以及您要保护什么?
例如,我使用 SecurityManager 来实现 IP 过滤并只允许列入白名单的 IP 地址连接到我的应用程序。如果您只想禁止访问磁盘文件,则以具有较低权限的用户身份运行应用程序可能是更好的解决方案。
如果您根本不信任第三方插件,请记住,一旦您允许执行插件代码,即使您使用 SecurityManager,该插件也可能使您的应用程序崩溃。如果您的应用程序加载插件,也许将插件列入白名单并在加载插件之前检查列表是更好的解决方案。
如果您决定使用它,您将受到性能影响(因为 JVM 会进行更多检查),但它的运行速度实际上取决于您将执行检查的代码/配置。我的 IP 白名单非常快,因为它只包含单个列表查找;如果您的检查包括调用远程 Web 服务和访问数据库,那么您可能会减慢很多速度,但另一方面,如果您有足够的硬件和很少的并发用户(换句话说,如果您负担得起的话),即使这也无关紧要.