SecurityManager入门
每个Java应用都可以有自己的安全管理器,它是防范恶意攻击的主要安全卫士。
安全管理器通过执行运行阶段检查和访问授权,以实施应用所需的安全策略,从而保护资源免受恶意操作的攻击。
实际上,安全管理器根据Java安全策略文件决定将哪组权限授予类。
然而,当不可信的类和第三方应用使用JVM时,Java安全管理器将使用与JVM相关的安全策略来识别恶意操作。
在很多情况下,威胁模型不包含运行于JVM中的恶意代码,此时Java安全管理器便不是必需的。
当安全管理器检测到违反安全策略的操作时,JVM将引发AccessControlException或SecurityException。
策略(Policy)
类装载器用Policy对象帮助它们决定,把一段代码导入虚拟机时应该给它们什么样的权限. 任何时候,每一个应用程序都只有一个Policy对象.
保护域(ProtectionDomain)
当类装载器将类型装入java虚拟机时,它们将为每一个类型指派一个保护域,保护域定义了授予
一段特定的代码的所有权限.装载入java虚拟机的每一个类型都属于一个且仅属于一个保护域.
当运行未知的Java程序的时候,该程序可能有恶意代码(删除系统文件、重启系统等),
为了防止运行恶意代码对系统产生影响,需要对运行的代码的权限进行控制,这时候就要启用Java安全管理器。
默认的安全管理器配置文件是 $JAVA_HOME/jre/lib/security/java.policy
启动安全管理有两种方式,建议使用启动参数方式。
1 启动参数方式
启动程序的时候通过附加参数启动安全管理器:
-Djava.security.manager
若要同时指定配置文件的位置那么示例如下:
-Djava.security.manager -Djava.security.policy="E:/java.policy"
2 编码方式启动
也可以通过编码方式启动,不过不建议:
System.setSecurityManager(new SecurityManager());
不过参数启动使用灵活,源码在类(sun.misc.Launcher)中。