0 Java安全体系概述
从JDK 1.0开始Java就实现了一套安全架构,主要用于Applet. 在这种体系下Java Code的执行环境被严格划分为两个部分,本地代码可以访问计算机的所有资源,而远端代码(Romote Code: 主要是Applet)只能运行在严格限制的沙箱里面.安全管理器(Security Manager)作为一个子系统来决定哪些资源允许沙箱中的程序访问.
JDK 1.1引入了"签名Applet"的概念,一个被信任签名的Applet被当作和本地代码具有同等权限,可以访问全部的本地资源.
JDK 1.2做了很多改进.首先,无论本地代码还是远端代码(remote code)现在都服从于安全策略.安全策略为各种签名者和来源定义了一组许可(permission),可以由用户和系统管理员来配置各种许可.每个许可(permission)指定允许访问只用特定的资源,例如读或写一个特定的文件/目录或者可以连接到指定的地址和端口...
运行时系统将代码组织为不同的域(domain),每个域对应一组许可,在这个域中的类的实例都受这个域指定的许可的限制.
1. 控制你的Application
首先要明确的是,本地应用程序运行的时候,安全管理器(security manager)并没有被安装.所以,对于应用程序来说,默认是可以访问所有的资源,这一点和Applet不同.要启动安全管理器就是在启动命令行加上 -Djava.security.manager.默认加载的系统策略文件授予了所有代码访问一些通用属性的许可.这个文件是${jre_home}\lib\security\java.policy.在命令行上给定 -Djava.security.manager 启动应用程序,系统会首先加载${jre_home}\lib\security\java.security 在这个文件中搜索policy.url可以看到如下的两行
policy.url.1=file:${java.home}/lib/security/java.policy
policy.url.2=file:${user.home}/.java.policy
在这两行加载了默认的策略文件,我们也可以编辑自己的策略文件然后添加到java.security中使应用程序应用我们的安全策略.除此以外还有另一种指定我们自己的安全策略文件的方法,就是在命令行上使用 -Djava.security.policy=mypolicy 选项.
如果熟悉策略文件的语法,可以自己用文本编辑器编辑,推荐使用工具policytool,这是jre提供的一个专门用来编辑策略文件的工具.
2. 可信(Secure)代码和交换文件需要使用的API和工具
为了保证代码的安全性,需要确定代码或文件的来源,需要提供者进行数字签名.可以使用keytool或者security API来产生公钥/私钥对.为了验证公钥的确来自发布者,需要数字证书(certificate),数字证书由被信任的第三方提供.公钥/私钥对和证书存储在一个密码保护的数据库里,叫做keystores.
2.1 对代码签名并赋予许可
2.2 交换文件
2.3 产生和校验签名
3. 实现你自己的许可
本节中有一个例子,参见http://java.sun.com/docs/books/tutorial/security1.2/userperm/index.html
在代码中检查是否具有某种许可:
1. 调用System.getSecurityManager()来得到当前安装的security manager.
2. 如果返回结果不为null,可以进一步查询是否具有需要的许可.java.security.AccessController有个方法叫做doPrivileged,可以临时的提高某种权限来获得特定资源的访问许可,从而可以将对于特定资源的访问限定在某个类,并不对整个应用放开,只有调用特定的类才能访问特定的资源,详见New Privileged Block API相关文档.
3. java.security.Permission和java.security.BasePermission这两个类对于控制资源访问权限很重要.java.security.SecurityManager的方法checkPermission()接受的参数就是Permission极其子类.具体参见Java文档的java.security包部分.
4. 这个例子最后还详细描述了三个角色(框架开发者,资源访问类开发者和使用者)需要做的事情.
参考文献: http://java.sun.com/docs/books/tutorial/security1.2/TOC.html