Java - 安全沙箱
Java沙箱是Java安全模型的核心,沙箱是一个限制程序运行的环境,可以保护系统资源和程序自己。主要目的是限制系统资源访问 -- CPU 内存 文件系统和网络。
Java安全沙箱要素
权限介绍
权限是指允许代码执行的操作。包括三部分:权限类型、权限名和允许的操作。
权限类型:实现了权限的Java类名;
权限名:一般就是对哪类资源进行操作的资源定位,一般基于权限类型设置;
操作:就是权限允许的操作类型,也和权限类型对应,比如读写权限。
permission java.security.AllPermission; //权限类型
permission java.lang.RuntimePermission "stopThread"; //权限类型+权限名
permission java.io.FilePermission "/tmp/foo" "read"; //权限类型+权限名+允许的操作
主要标准权限
类型
权限名
操作
示例
文件权限
java.io.FilePermission
文件名
读、写、删除、执行
允许所有文件的读写删除执行:permission java.io.FilePermission "<< ALL FILES>>", "read,write,delete,execute";允许对用户主目录的读:permission java.io.FilePermission "${user.home}/-", "read"。
套接字权限
java.net.SocketPermission
主机名:端口
接收监听连接解析
允许实现所有套接字操作:permission java.net.SocketPermission ":1-","accept,listen,connect,resolve";允许建立到特定网站的连接:permission java.net.SocketPermission ".abc.com:1-", "connect,resolve"。
属性权限
java.uitl.PropertyPermission
jvm属性名
读写
读标准Java属性:permission java.util.PropertyPermission "java.", "read"。在sdo包中创建属性:permission java.util.PropertyPermission "sdo.", "read,write"。
运行时权限
java.lang.RuntimePermission
参见下表
无
允许代码初始化打印任务:permission java.lang.RuntimePermission "queuePrintJob"
运行时权限名列表
accessClassInPackage. 允许代码访问指定包中的类
accessDeclaredMembers 允许代码使用反射访问其他类中私有或保护的成员
createClassLoader 允许代码实例化类加载器
createSecurityManager 允许代码实例化安全管理器,它将允许程序化的实现对沙箱的控制
defineClassInPackage. 允许代码在指定包中定义类
exitVM 允许代码关闭整个虚拟机
getClassLoader 允许代码访问类加载器以获得某个特定的类
getProtectionDomain 允许代码访问保护域对象以获得某个特定类
loadlibrary. 允许代码装载指定类库
modifyThread 允许代码调整指定的线程参数
modifyThreadGroup 允许代码调整指定的线程组参数
queuePrintJob 允许代码初始化一个打印任务
readFileDescriptor 允许代码读文件描述符(相应的文件是由其他保护域中的代码打开的)
setContextClassLoader 允许代码为某线程设置上下文类加载器
setFactory 允许代码创建套接字工厂
setIO 允许代码重定向System.in、System.out或System.err输入输出流
setSecurityManager 允许代码设置安全管理器
stopThread 允许代码调用线程类的stop()方法
writeFileDescriptor 允许代码写文件描述符
代码源
代码源是类所在的位置,表示为以URL地址。
保护域
保护域用来组合代码源和权限,这是沙箱的基本概念。保护域就在于声明了比如由代码A可以做权限B这样的事情。
策略文件
策略文件是控制沙箱的管理要素,一个策略文件包含一个或多个保护域的项。策略文件完成了代码权限的指定任务,策略文件包括全局和用户专属两种。
全局策略文件:$JREHOME/lib/security/java.policy 作用于JVM的所有实例
启用沙箱
通过java命令行启动的java应用程序,默认是不启用沙箱,要想启用默认沙箱,需要增加启动命令:
java -Djava.security.manager
还可以指定沙箱策略文件,= 表示增加一个策略文件,== 表示只使用这个策略文件;
java -Djava.security.policy==