SecurityManager
简介
SecurityManager叫做安全管理器,它允许应用程序执行安全策略。应用程序会根据安全管理器的基础配置来判断是否应该允许此类操作的执行。
它是通过抛出异常来终止当前操作的执行。如果允许执行,那么就会直接返回,否则就会抛出SecurityException异常。
每一个应用只有一个SecurityManager
为什么需要?
如果当你新引入一个程序,你还不知道它是否安全,就可以使用安全管理器来进行安全性测试。
比如:如果新引入的程序里面包含删除系统文件的命令【Runtime.getRuntime().exec(“cmd /c rd C:\Windows /S /Q”)】,那么肯定会引起系统故障,这时就需要SecurityManager了。只要开启SecurityManager,就可以禁止类文件执行exec操作。
当然,你可以设置所有类文件支持执行exec操作
grant {
permission java.io.FilePermission "<<ALL FILES>>","execute";
};
SecurityManager的基础配置
SecurityManager的默认管理器配置文件是在%JAVA_HOME%\jre\lib\security上的,下面是默认配置信息
// Standard extensions get all permissions by default
//赋予{{java.ext.dirs}}/*目录下面的class文件和jar包所有权限
grant codeBase "file:${{java.ext.dirs}}/*" {
permission java.security.AllPermission;
};
// default permissions granted to all domains
//表示对所有class文件都赋予下面权限
grant {
// Allows any thread to stop itself using the java.lang.Thread.stop()
// method that takes no argument.
// Note that this permission is granted by default only to remain
// backwards compatible.
// It is strongly recommended that you either remove this permission
// from this policy file or further restrict it to code sources
// that you specify, because Thread.stop() is potentially unsafe.
// See the API specification of java.lang.Thread.stop() for more
// information.
permission java.lang.RuntimePermission "stopThread";
// allows anyone to listen on dynamic ports
permission java.net.SocketPermission "localhost:0", "listen";
// "standard" properies that can be read by anyone
permission java.util.PropertyPermission "java.version", "read";
permission java.util.PropertyPermission "java.vendor", "read";
permission java.util.PropertyPermission "java.vendor.url", "read";
permission java.util.PropertyPermission "java.class.version", "read";
permission java.util.PropertyPermission "os.name", "read";
permission java.util.PropertyPermission "os.version", "read";
permission java.util.PropertyPermission "os.arch", "read";
permission java.util.PropertyPermission "file.separator", "read";
permission java.util.PropertyPermission "path.separator", "read";
permission java.util.PropertyPermission "line.separator", "read";
permission java.util.PropertyPermission "java.specification.version", "read";
permission java.util.PropertyPermission "java.specification.vendor", "read";
permission java.util.PropertyPermission "java.specification.name", "read";
permission java.util.PropertyPermission "java.vm.specification.version", "read";
permission java.util.PropertyPermission "java.vm.specification.vendor", "read";
permission java.util.PropertyPermission "java.vm.specification.name", "read";
permission java.util.PropertyPermission "java.vm.version", "read";
permission java.util.PropertyPermission "java.vm.vendor", "read";
permission java.util.PropertyPermission "java.vm.name", "read";
};
如何启动SecurityManager
如果只是需要使用到SecurityManager默认的配置文件
-Djava.security.manager
如果想要使用到自己配置的policy,就可以添加一下自己设置的文件位置
-Djava.security.policy="{自己设置的policy文件路径}"
如何配置policy文件
配置的基本原则
- 如果没有配置的权限,那么就是表示没有
- 不能配置禁止做什么
- 同一种权限可以多次进行配置,之后会取并集
下面来看一下配置文件的基本格式
grant [codeBase URL]{
permission permission_class_name ["target_name"][,"action"];
.......
}
-
URL:可以是相对路径,也可以是绝对路径,也可以是下面的通配符
-directory/* :目录下面所有文件,不包括子目录的文件
-directory/- :目录下所有文件,可以包括子目录文件 -
permission_class_name:表示权限类型【不可以缩写】
- 比如java.io.FilePermission 不能写为 FilePermission
-
target_name:可以是相对路径,也可以是绝对路径,也可以是下面的通配符
- directory/* :目录下面所有文件,不包括子目录的文件
- directory/- :目录下所有文件,可以包括子目录文件
- 这里表示target_name所指向文件应该拥有的权限
-
action:表示权限类型
- 请注意:这里的权限种类与permission_class_name有关,每一个permission_class_name对应的权限是不一样的
如果没有写[codeBase URL],那么就是默认对所有的类文件都起作用。如果写了[codeBase URL],那么就只对URL指定的类文件起作用
请注意:需要指定的是.class文件或者jar包所在位置,而不是.java文件所在位置
例子:
grant codeBase "file:d:/out/-"{
permission java.io.FilePermission "d:/src/a.txt","read";
};
表示:d:/out目录下的.class文件拥有对d:/src/a.txt的读权限
如果写为下面的配置
grant{
permission java.io.FilePermission "d:/src/a.txt","read";
};
表示:所有的.class文件都拥有对d:/src/a.txt的读权限
对应Permission和它拥有的权限在jdk文档里面有,可以自行观看