Java - 安全沙箱
2020-04-03 本文已影响0人
万福来
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.<name> 允许代码访问指定包中的类
- accessDeclaredMembers 允许代码使用反射访问其他类中私有或保护的成员
- createClassLoader 允许代码实例化类加载器
- createSecurityManager 允许代码实例化安全管理器,它将允许程序化的实现对沙箱的控制
- defineClassInPackage.<name> 允许代码在指定包中定义类
- exitVM 允许代码关闭整个虚拟机
- getClassLoader 允许代码访问类加载器以获得某个特定的类
- getProtectionDomain 允许代码访问保护域对象以获得某个特定类
- loadlibrary.<name> 允许代码装载指定类库
- 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 <other args>
还可以指定沙箱策略文件,= 表示增加一个策略文件,== 表示只使用这个策略文件;
java -Djava.security.policy==<filepath>