使用场景
安全管理器(SecurityManager)通过运行阶段检查和访问授权,以实施应用所需要的安全策略,从而保护资源免受恶意操作的攻击(注意是应用级安全管理)。实际上,安全管理器根据Java安全策略稳健决定将那些组权限授予类。然而,当不可信的类和第三方应用使用JVM时,Java安全管理器将使用与JVM相关的安全策略来识别恶意操作。在很多情况下,威胁模型不包含运行于JVM中的恶意代码,此时Java安全管理器便不是必需的。当安全管理器检测到违反安全策略的操作时,JVM将引发AccessControlException或SecurityException异常。
实践
JVM启动应用,默认不使能安全管理,安全管理器应用为null。如下验证:
public class SecurityStart {
public static void main(String[] args){
System.out.println(System.getSecurityManager());
}
}
应用使用安全管理器有两种方式,一种是在JVM启动时通过参数指定安全管理器使能;另一种在应用代码中通过System.setSecurityManager指定安全管理器。
方式一:
在启动应用时,添加如下参数:
-Djava.security.manager
此时在便使能了安全管理器,安全管理器不为null。验证如下:
public class SecurityStart {
public static void main(String[] args){
System.out.println(System.getSecurityManager());
}
}
这里启动的Java应用,使用的默认安全策略文件(jre/lib/security/java.policy),进行安全策略验证。验证如下:
1、启动如下代码
public class SecurityStart {
public static void main(String[] args) {
try {
BufferedWriter fos = new BufferedWriter(new FileWriter("output.txt"));
fos.write("hello world !");
fos.close();
} catch (IOException ioe) {
System.out.println("I/O failed for SecurityManagerTest.");
} catch (Exception e) {
System.out.println(e.toString());
}
}
}
此时应该包如下异常:
java.security.AccessControlException: access denied ("java.io.FilePermission" "output.txt" "write")
2、修改jre/lib/security/java.policy 文件对词文件增加写权限如下:
permission java.io.FilePermission "/xxxx/output.txt","write"; //xxxx 对于自己的output.txt文件地址
3、在此启动以上程序,运行结束。创建output.txt文件切写入了hello world!验证ok!
当然,通过启动参数使用指定的策略文件,方式如下:
-Djava.security.manager=###
或者
-Djava.security.manager==###
对于一个‘=’号的,是指使用默认策略文件与指定策略文件合并后共同作用。对于‘==’的,是指只是用指定的策略文件。
方式二:
1、直接启动如下代码
public class SecurityStart {
static{
System.setSecurityManager(new SecurityManager());
}
public static void main(String[] args) {
try {
BufferedWriter fos = new BufferedWriter(new FileWriter("nowOutput.txt"));
fos.write("hello world !");
fos.close();
} catch (IOException ioe) {
System.out.println("I/O failed for SecurityManagerTest.");
} catch (Exception e) {
System.out.println(e.toString());
}
}
}
运行结果为:
java.security.AccessControlException: access denied ("java.io.FilePermission" "nowOutput.txt" "write")
2、修改jre/lib/security/java.policy 文件对词文件增加写权限如下:
permission java.io.FilePermission "/xxxx/nowOutput.txt","write"; //xxxx 对于自己的nowOutput.txt文件地址
3、在此启动以上程序,运行结束。创建nowOutput.txt文件切写入了hello world!总结:
验证ok!
当然对于第二种方式可以实现自定义的安全管理器,可以完全不用加载java.policy这种机制,而是自己根据自己需求实现一套安全管理机制。