众所周知Java语言具有完善的安全框架从编程语言编译器解释程序到Java虚拟机都能确保Java系统不被无效的代码或敌对的编译器暗中破坏基本上它们保证了Java代码按预定的规则运作但是当我们需要逾越这些限制时例如读写文件监听和读写Socket退出Java系统等就必须使用数字签名或安全策略文件(*Policy)
在企业内部网中本文提出了使用安全策略文件来设置java程序权限的一种简单的方法由于企业内部网中各台计算机的位置用途和安全性明确更适于使用安全策略文件来设置java的权限软件的安装设置升级和迁移都非常的方便并且还可以和数字签名配合使用更重要的是可以细分每个java程序的权限使用起来灵活方便
一 Java中安全策略的概念
Java应用程序环境的安全策略详细说明了对于不同的代码所拥有的不同资源的许可它由一个Policy对象来表达为了让applet(或者运行在SecurityManager下的一个应用程序)能够执行受保护的行为例如读写文件applet(或Java应用程序)必须获得那项操作的许可安全策略文件就是用来实现这些许可
Policy对象可能有多个实体虽然任何时候只能有一个起作用当前安装的Policy对象在程序中可以通过调用getPolicy方法得到也可以通过调用setPolicy方法改变Policy对象评估整个策略返回一个适当的Permissions对象详细说明那些代码可以访问那些资源
策略文件可以储存在无格式的ASCII文件或Policy类的二进制文件或数据库中本文仅讨论无格式的ASCII文件的形式
二 Policy文件的格式
为了能够更好地理解下面的内容建议在阅读时参照\jdk\jre\lib\security\javapolicy文件和\jdk\jre\lib\security\javasecurity文件的内容
. Policy文件的语法格式与说明
一个Policy文件实质上是一个记录列表它可能含有一个keystore记录以及含有零个或多个grant记录其格式如下
keystore some_keystore_url
keystore_type;
grant [SignedBy signer_names]
[ CodeBase URL] {
Permission permission_class_name
[ target_name ]
[ action] [ SignedBy signer_names];
Permission
};
keystore记录
一个keystore是一个私有密钥(private keys)数据库和相应的数字签名例如X证书Policy文件中可能只有一条keystore记录(也可能不含有该记录)它可以出现在文件中grant记录以外的任何地方Policy配置文件中指定的keystores用于寻找grant记录中指定的签名者的公共密钥(public keys)如果任何grant记录指定签名者(signer_names)那么keystore记录必须出现在policy配置文件中
some_keystore_url是指keystore的URL位置keystore_type是指keystore的类型第二个选项是可选项如果没有指定该类型则假定由安全属性文件(javasecurity)中的keystoretype属性来确定keystore类型定义了keystore信息的存储和数据格式用于保护keystore中的私有密钥和keystore完整性的算法Sun Microsystems支持的缺省类型为JKS
grant记录
在Policy文件中的每一个grant记录含有一个CodeSource(一个指定的代码)及其permission(许可)
Policy文件中的每一条grant记录遵循下面的格式以保留字grant开头表示一条新的记录的开始Permission是另一个保留字在记录中用来标记一个新的许可的开始每一个grant记录授予一个指定的代码(CodeBase)一套许可(Permissions)
permission_class_name必须是一个合格并存在的类名例如javaioFilePermission不能使用缩写(例如FilePermission)
target_name用来指定目标类的位置action用于指定目标类拥有的权限
target_name可以直接指定类名(可以是绝对或相对路径)目录名也可以是下面的通配符
directory/* 目录下的所有文件
*当前目录的所有文件
directory/目录下的所有文件包括子目录
当前目录下的所有文件包括子目录
《ALL FILES》文件系统中的所有文件
对于javaioFilePermissionaction可以是
read write delete和execute
对于SocketPermissionaction可以是
listenacceptconnectreadwrite
Policy文件中的属性扩展(Property Expansion)
属性扩展与shell中使用的变量扩展类似它的格式为
${someproperty}
实际使用的例子为
permission javaioFilePermission
${userhome} read;
${userhome}的值为d:\Project
因此下面的语句和上面的语句是一样的
permission javaioFilePermission
d:\Project read;
三 实例
当初始化Policy时首先装载系统Policy然后再增加用户Policy如果两者都不存在则使用缺省的Policy即原始的沙箱模型
系统Policy文件的缺省位置为
{javahome}/lib/security/javapolicy (Solaris)
{javahome}\lib\security\javapolicy (Windows)
用户Policy文件的缺省位置为
{userhome}/javapolicy (Solaris)
{userhome}\javapolicy (Windows)
其实在实际使用中我们可能不会象上面介绍的那么复杂特别是在不使用数字签名时这时我们完全可以借鑒JDK 提供给我们的现成的\jdk\jre\lib\security\javapolicy文件根据我们的需要作相应的修改本文就针对不使用数字签名情况详细说明安全策略文件的用法
下面是一个完整的在Windows //NT下使用的javapolicy文件在文件中分别使用注释的形式说明了每个permission记录的用途
// For LanServerTalkjava and LanClientTalkjava
grant {
//对系统和用户目录读的权限
permission javautilPropertyPermission
userdir read;
permission javautilPropertyPermission
userhome read;
permission javautilPropertyPermission
javahome read;
permission javautilPropertyPermission
javaclasspath read;
permission javautilPropertyPermission
username read;
//对线程和线程组的操作权限
permission javalangRuntimePermission
modifyThread;
permission javalangRuntimePermission
modifyThreadGroup;
//操作Socket端口的各种权限
permission SocketPermission
listen;
permission SocketPermission
accept;
permission SocketPermission
connect;
permission SocketPermission read;
permission SocketPermission write;
//读写文件的权限
permission javaioFilePermission read;
permission javaioFilePermission write;
//退出系统的权限例如Systemexit()
permission javalangRuntimePermission exitVM;
};
四 javapolicy文件的使用
对于windows //NT使用javapolicy文件的方法主要有下面两种
. 使用缺省目录
我们可以简单地将编辑好的javapolicy文件拷贝到windows //NT的HOME目录这时所有的applet(或Java应用程序)可能都拥有某些相同的权限使用起来简单但不灵活(例如对于javaioFilePermission 其目标类的target_name必须使用绝对路径)如果不是在企业内部网中使用还可能存在一定安全隐患
. 在命令行中指定
在命令行如果我们希望传递一个Policy文件给appletviewer还可以使用JDjavasecuritypolicy参数来指定policy的位置
appletviewer JDjavasecurity
policy=pURL myApplet
pURL为Policy文件的位置下面是一个实际的例子以当前目录的javapolicy文件所指定的安全策略运行当前目录的l(文件中装载并运行LanServerTalkjava)
appletviewer JDjavasecuritypolicy
=javapolicy l
这种方法使用灵活特别是作为一个软件包在企业内部网中发布时安装设置和迁移软件基本无须修改Policy文件的内容使用起来相当简单而且安全许可的范围控制较精细