java SecurityManager

---- 众所周知,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),那么,keystore记录必须出现在policy配置文件中。

---- "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文件。在文件中,分别使用注释的形式说明了每个“permission”记录的用途。

// For LanServerTalk.java and LanClientTalk.java

grant { 
//对系统和用户目录“读”的权限
permission 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";

//对线程和线程组的操作权限
permission java.lang.RuntimePermission
"modifyThread";
permission java.lang.RuntimePermission
"modifyThreadGroup";

//操作Socket端口的各种权限
permission java.net.SocketPermission
"-", "listen";
permission java.net.SocketPermission
"-", "accept";
permission java.net.SocketPermission 
"-", "connect";
permission java.net.SocketPermission "-", "read";
permission java.net.SocketPermission "-", "write";

//读写文件的权限
permission 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/NT的HOME目录,这时,所有的applet(或Java应用程序)可能都拥有某些相同的权限,使用起来简单,但不灵活(例如:对于java.io.FilePermission ,其目标类的target_name必须使用绝对路径),如果不是在企业内部网中使用,还可能存在一定安全隐患。

---- 2. 在命令行中指定

---- 在命令行,如果我们希望传递一个Policy文件给appletviewer,还可以使用"-J-Djava.security.policy"参数来指定policy的位置:

appletviewer -J-Djava.security.
policy=pURL myApplet

---- pURL为Policy文件的位置。下面,是一个实际的例子,以当前目录的.java.policy文件所指定的安全策略运行当前目录的LanServerTalk.html(文件中装载并运行LanServerTalk.java): 
appletviewer -J-Djava.security.policy
=.java.policy LanServerTalk.html

---- 这种方法使用灵活,特别是作为一个软件包在企业内部网中发布时,安装、设置和迁移软件,基本无须修改Policy文件的内容,使用起来相当简单,而且,安全许可的范围控制较精细。

时间: 2024-10-12 07:48:02

java SecurityManager的相关文章

Using Java SecurityManager to grant/deny access to system functions

In Java it is possible to restrict access to specific functions like reading/writing files and system properties, thread control, networking, object serialization and much more for the running application. Such restrictions may be crucial(重要的:决定性的:定局

Java Annotations: Explored & Explained--转载

原文地址:http://www.javacodegeeks.com/2012/08/java-annotations-explored-explained.html One of the many wonderful features of Java 5 SE is the introduction of the Annotations construct.Annotations are tags that we can insert into our program source code f

测试人机问答系统智能性的3760个问题

本文给出了3760个问题,这些问题来自于广大网友对QuestionAnsweringSystem的测试. 在面对这些问题的时候,我们人类是怎么思考回答的呢? 对我们来说,回答这些问题是一个很自然甚至很简单的思考过程,可是我们却很难把我们的思考过程严格地描述清楚.我们从小到大,积累了很多的经验和知识,这些经验和知识来自我们的社会实践和学校学习. 我们所处的世界不是完美的,我们本身也不是完美的,人与人的相互交流也不是完美的,我们经常需要反复地沟通,尽管这样,有时候我们还是不能完全理解对方的意思,有可

【转】 SSI(Server Side Includeds)使用详解

SSI使用入门: 什么是SSI技术? SSI(Serve Side Includes),通常称之为服务器端包含,使用SSI技术文件默认的后缀名为.shtml,SSI技术通过在html文件中加入SSI指令,让服务器端在输出html之前解释SSI指令,并把解释完的结果和html代码一同输出给客户端.SSI指令实在服务器端执行的. 在大部分项目中我们主要使用SSI的包含指令<!--#include virtual="/globle/foot.jsp"--> 标签. 为什么要使用S

配置tomcat6.41支持SSI

tomcat官方文档 CAUTION - SSI directives can be used to execute programs external to the Tomcat JVM. If you are using the Java SecurityManager this will bypass your security policy configuration in catalina.policy. To use the SSI servlet, remove the XML c

Java安全管理器——SecurityManager

总的来说,Java安全应该包括两方面的内容,一是Java平台(即是Java运行环境)的安全性:二是Java语言开发的应用程序的安全性.由于我们不是Java本身语言的制定开发者,所以第一个安全性不需要我们考虑.其中第二个安全性是我们重点考虑的问题,一般我们可以通过安全管理器机制来完善安全性,安全管理器是安全的实施者,可对此类进行扩展,它提供了加在应用程序上的安全措施,通过配置安全策略文件达到对网络.本地文件和程序其它部分的访问限制的效果. Java从应用层给我们提供了安全管理机制--安全管理器,每

java基础系列--SecurityManager入门(转)

转载作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/yiwangzhibujian/p/6207212.html 一.文章的目的 这是一篇对Java安全管理器入门的文章,目的是简单了解什么是SecurityManager,对管理器进行简单配置,解决简单问题. 比如在阅读源码的时候,发现这样的代码,想了解是做什么的: 1 SecurityManager security = System.getSecurityManager(); 2 if (security !

java IO之输入流——InputStream

java的基本输入流是java.io.InputStream,该抽象类定义了输入流的基本输入操作方法,实现自该抽象类的子类都有定义自己的数据源,例如ByteArrayInputStream的构造函数指定了ByteArrayInputStream输入流的数据源必须是一个字符数组.这就可以有多种不同的数据源,包括:字符数组.String对象.文件."管道".一个由其他种类的流组成的序列... 1 public ByteArrayInputStream(byte buf[]) {} 2 3

java实例 把一个整形n强制转化为字符串

n的范围是-100--100 如果成功转换,则打印Good job ,若不成功则打印Wrong answer: import java.util.*; import java.security.*; public class Solution { public static void main(String[] args) { DoNotTerminate.forbidExit(); try { Scanner in = new Scanner(System.in); int n = in .n