---- 众所周知,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文件格式---- 为了更好地理解以下内容,建议在阅读时参考\jdk1.2\jre\lib\security\java.policy文件和jdk1.2\jre\lib\security\java.security文件的内容。---- 1. 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 ...};---- 1.1"keystore"记录---- 一个keystore是私钥(private keys)X等数据库和相应的数字签名.509证书。Policy文件中可能只有一个keystore记录(也可能不包括此记录),它可以出现在文件中grant记录以外的任何地方。Policy配置文件中指定的keystores用于寻找grant记录中指定的公共密钥(public keys),任何grant记录指定签名者(signer_names),那么,policy配置文件中必须出现keystore记录。---- "some_keystore_url“是指Keystore的URL位置,”keystore_type“指keystore的类型。---- "some_keystore_url“是指Keystore的URL位置,”keystore_type“指keystore的类型。第二个选项是可选的。如果没有指定,则假设该类型是由安全属性文件制成的。(java.security)中的"keystore.type确定属性。keystore类型定义了keystore信息的存储和数据格式,用于保护keystore中的私密钥和keystore的完整性。Sun Microsystems支持的缺失类型是“JKS”。---- 1.2"grant"记录---- Policy文件中的每个grant记录都包含一个Codesource(指定代码)及其permission(许可)。---- Policy文件中的每个grant记录都遵循以下格式,以保留单词“grant“开头,表示新记录的开头,”Permission在记录中标记新许可证的开始是另一个保留字。每个grant记录授予指定的代码(CodeBase)一套许可(Permissions)。---- permission_class_name必须是一个合格的类名,如java.io.FilePermission,不能使用缩写(例如,FilePermission)。---- target_name用于指定目标类的位置,action用于指定目标类的权限。---- target_name可以直接指定类名(绝对或相对路径)、目录名或以下通配符:directory/* directory/-目录下的所有文件*目录中的所有文件,包括子目录- 目录下的所有文件,包括子目录《ALL FILES》java文件系统中的所有文件.io.FilePermission,action可以是:read, write, delete和execute。java.net.SocketPermission,action可以是:listen,accept,connect,read,write。---- 1.3 Policy文件中的属性扩展(Property Expansion)---- 属性扩展类似于shell中使用的变量扩展,其格式为:“${some.property}“实际使用的例子如下:permission java.io.FilePermission"${user.home}", "read";"${user.home}"的值为"d:\Project因此,下面的句子与上面的句子相同:permission java.io.FilePermission "d:\Project ", "read";
三. 实例---- Policy初始化时,首先装载系统Policy,然后添加用户Policy,如果两者都不存在,则使用缺失的Policy,即原始沙箱模型。---- 缺少系统Policy文件的位置如下:{java.home}/lib/security/java.policy (Solaris){java.home}\lib\security\java.policy (Windows)用户Policy文件的缺失是:{user.home}/.java.policy (Solaris){user.home}\.java.policy (Windows)---- 其实,在实际使用中,我们可能不会像上面介绍的那样复杂,尤其是在不使用数字签名的情况下。在这个时候,我们可以从JDK中学习 1.2提供给我们的现成\jdk1.2\jre\lib\security\java.policy文件,根据我们的需要进行相应的修改,本文详细说明了不使用数字签名的安全策略文件的用法。---- 下面,Windows是一个完整的 在95/98/NT下使用.java.policy文件。---- 下面,Windows是一个完整的 95/98/NT下使用.java.policy文件。在文件中,每个“permission"记录的目的。// For LanServerTalk.java and LanClientTalk.javagrant (///permision,“读取”系统和用户目录的权限 java.util.PropertyPermission"user.dir", "read";permission java.util.PropertyPermission"user.home", "read";permission java.util.PropertyPermission"java.home", "read";permission java.util.PropertyPermission"java.class.path", "read";permission java.util.PropertyPermission"user.name", "read";///对线程和线程组的操作权限permision java.lang.RuntimePermission"modifyThread";permission java.lang.RuntimePermission"modifyThreadGroup";///操作Socket端口的各种权限permision java.net.SocketPermission"-", "listen";permission java.net.SocketPermission"-", "accept";permission java.net.SocketPermission"-", "connect";permission java.net.SocketPermission "-", "read";permission java.net.SocketPermission "-", "write";////读写文件的权限permision java.io.FilePermission "-", "read";permission java.io.FilePermission "-", "write";///退出系统的权限,比如System.exit(0)permission java.lang.RuntimePermission "exitVM";};四. java.使用policy文件---- windows 95/98/NT,使用.java.policy文件主要有以下两种方法。---- 1. 使用缺省目录---- 我们可以简单地编辑编辑.java.policy文件复制到windows 在95/98/NTHOME目录中,所有applet(或Java应用程序)可能都有一些相同的权限,使用简单但不灵活(例如:Java.io.FilePermission ,其目标类target_name必须使用绝对路径),如果不在企业内部网络中使用,也可能存在一定的安全隐患。---- 2. 指定命令行---- 如果我们想在命令行上向apletviewer传递一份Policy文件,也可以使用“也可以使用”-J-Djava.security.policy“指定policy位置的参数:appletviewer -J-Djava.security.policy=pURL myApplet---- Policy文件的位置是Policy。下面是一个实际的例子,在当前目录中.java.Lanservertalk,policy文件指定的安全策略运行当前目录.html(文件中装载并运行LanServertalk.java):appletviewer -J-Djava.security.policy=.java.policy LanServerTalk.html---- 该方法使用灵活,特别是在企业内部网络上发布软件包时,安装、设置和迁移软件基本上不需要修改Policy文件的内容,使用相当简单,安全许可范围控制相对较好。
![](/images/780-200-2.jpg)