Java安全管理器

总的来说,Java安全应该包括两方面的内容,一是Java平台(即是Java运行环境)的安全性;二是Java语言开发的应用程序的安全性。由于我们不是Java本身语言的制定开发者,所以第一个安全性不需要我们考虑。其中第二个安全性是我们重点考虑的问题。

一般我们可以通过安全管理器机制来完善安全性,安全管理器SecurityManager是安全的实施者,可对此类进行扩展,它提供了加在应用程序上的安全措施,通过配置安全策略文件达到对网络、本地文件和程序其它部分的访问限制的效果。

Java在应用层为我们提供了安全管理器,每个Java应用都可以拥有自己的安全管理器,它会在运行阶段检查需要保护的资源的访问权限及其它规定的操作权限,保护系统免受恶意操作攻击,以达到系统的安全策略。如图展示了安全管理器的工作机制,当运行Java程序时,安全管理器会根据policy文件所描述的策略给程序不同模块分配权限,假设把应用程序分成了三块,每块都有不同的权限,第一块有读取某文件的权限,第二块同时拥有读取某文件跟内存的权限,第三块有监听socket的权限。通过这个机制就能很好地控制程序各个部分的各种操作权限,从应用层上为我们提供了安全管理策略。

下图为安全管理器对文件操作进行管理的工作过程,当应用程序要读取本地文件时,securitymanager就会在读取前进行拦截,判断是否有读取此文件的权限,如果有则顺利读取,否则将抛出访问异常。SecurityManager类中提供了很多检查权限的方法,例如checkPermission方法会根据安全策略文件描述的权限对操作进行判断是否有操作权限,而checkRead方法则用于判断对文件访问权限。一旦发现没有权限都会抛出安全异常。

一般而言,Java程序启动时并不会自动启动安全管理器,可以通过以下两种方法启动安全管理器:

  • 一种是隐式,启动默认的安全管理器最简单的方法就是:直接在启动命令中添加-Djava.security.manager参数即可。
  • 一种是显式,实例化一个java.lang.SecurityManager或继承它的子类的对象,然后通过System.setSecurityManager()来设置并启动一个安全管理器。

在启动安全管理器时可以通过-Djava.security.policy选项来指定安全策略文件。如果没有指定策略文件的路径,那么安全管理器将使用默认的安全策略文件,它位于%JAVA_HOME%/jre/lib/security目录下面的java.policy。需要说明一下的是,=表示这个策略文件将和默认的策略文件一同发挥作用;==表示只使用这个策略文件。policy文件包含了多个grant语句,每一个grant描述某些代码拥有某些操作的权限。在启动安全管理器时会根据policy文件生成一个Policy对象,任何时候一个应用程序只能有一个Policy对象。

那么如何才能实现自己的安全管理器,并且配置权限呢?下面将通过一个简单的例子阐明实现步骤,一般可以分为以下两步:
1. 创建一个SecurityManager子类,并根据需要重写一些方法。
2. 根据应用程序代码的权限需要配置策略文件。如果使用默认安全管理器则省略第一步,下面用个例子说明安全管理器的使用:

public class SecurityManagerTest {
        public static void main(String[] args)throws FileNotFoundException {
         System.out.println("SecurityManager: " + System.getSecurityManager());
         FileInputStreamfis = new FileInputStream("c:\\protect.txt");
         System.out.println(System.getProperty("file.encoding"));
        }
}

分下面几种情况运行程序:

  • 假如不添加启动参数直接运行,则相当于没有启动安全管理器,SecurityManager打印出来为null,且能正确读取protect.txt文件跟file.encoding属性。
  • 添加启动参数-Djava.security.manager-Djava.security.policy=c:/protect.policy,俩参数分别代表启动默认安全管理器和指明策略配置文件路径。此时SecurityManager打印出来为不为null,但由于此时protect.policy里面并没有做任何授权,所以在读取文件的时就抛出AccessControlExcepti on异常。
  • 在protect.policy文件添加以下授权语句,此时SecurityManager不为空,并且有权限读取protect.txt文件,但最终还是会抛一个AccessControlException异常,因为并没有权限读取file.encoding系统属性。
grant {
    permissionjava.io.FilePermission "c:/protect.txt", "read";
};
  • 将protect.policy授权语句改为如下,这次读取文件跟读取系统属性的权限都有了,程序正常运行,不再抛出安全异常。
grant {
    permissionjava.io.FilePermission "c:/protect.txt", "read";
    permissionjava.util.PropertyPermission "file.encoding", "read";
};

由上面几种情况我们清晰了解安全管理器的使用,通过简单地配置策略文件能达到应用安全的管理。Java的Permission类是用来定义类所拥有的权限,Java本身包括了一些 Permission类,如下:

Permission 权限
java.security.AllPermission 所有权限的集合
java.util.PropertyPermission 系统/环境属性权限
java.lang.RuntimePermission 运行时权限
java.net.SocketPermission Socket权限
java.io.FilePermission 文件权限,包括读写,删除,执行
java.io.SerializablePermission 序列化权限
java.lang.reflect.ReflectPermission 反射权限
java.security.UnresolvedPermission 未解析的权限
java.net.NetPermission 网络权限
java.awt.AWTPermission AWT权限
java.sql.SQLPermission 数据库sql权限
java.security.SecurityPermission 安全控制方面的权限
java.util.logging.LoggingPermission 日志控制权限
javax.net.ssl.SSLPermission 安全连接权限
javax.security.auth.AuthPermission 认证权限
javax.sound.sampled.AudioPermission 音频系统资源的访问权限

========广告时间========

鄙人的新书《Tomcat内核设计剖析》已经在京东销售了,有需要的朋友可以到 https://item.jd.com/12185360.html 进行预定。感谢各位朋友。

为什么写《Tomcat内核设计剖析》

=========================

欢迎关注:

时间: 2024-09-20 00:09:16

Java安全管理器的相关文章

Java安全——安全管理器、访问控制器和类装载器

标签: Java 安全 [toc] 安全管理器:SecurityManager 安全管理器在Java语言中的作用就是检查操作是否有权限执行.是Java沙箱的基础组件.我们一般所说的打开沙箱,也是加-Djava.security.manager选项. 其实日常的很多API都涉及到安全管理器,它的工作原理一般是: 1. 请求Java API 2. Java API使用安全管理器判断许可权限 3. 通过则顺序执行,否则抛出一个Exception. 比如在之前的"理解沙箱"这一章提到的,开启沙

《Java安全编码标准》一1.9 安全管理器

1.9 安全管理器 SecurityManager?是Java中定义安全策略的类.当一个程序在没有安装安全管理器的环境中运行时,它是不受限制的,它可以使用任何Java API提供的类和方法.当使用安全管理器时,它会明确哪些不安全和敏感的操作是允许的.任何违反安全策略的操作都会导致抛出SecurityException异常,代码可以向安全管理器查询某些动作是否允许.同时,安全管理器可以控制受信的Java API能够执行的功能.当非受信的代码不允许读取系统类的时候,应该赋予这些类最低的权限,以防止特

实现高性能Java解析器

备注: 本篇文章是关于先前相同主题文章的最新版本.先前文章主要介绍创建高性能解析器的一些要点,但它吸收了读者的一部分批评建议.原来的文章进行了全面修订,并补充了相对完整的代码.我们希望你喜欢本次更新. 如果你没有指定数据或语言标准的或开源的Java解析器, 可能经常要用Java实现你自己的数据或语言解析器.或者,可能有很多解析器可选,但是要么太慢,要么太耗内存,或者没有你需要的特定功能.或者开源解析器存在缺陷,或者开源解析器项目被取消诸如此类原因.上述原因都没有你将需要实现你自己的解析器的事实重

java构建器初始化

可考虑用构建器执行初始化进程.这样便可在编程时获得更大的灵活程度,因为我们可以在运行期调用方法和采取行动,从而"现场"决定初始化值.但要注意这样一件事情:不可妨碍自动初始化的进行,它在构建器进入之前就会发生.因此,假如使用下述代码: class Counter { int i; Counter() { i = 7; } // . . . 那么i首先会初始化成零,然后变成7.对于所有基本类型以及对象句柄,这种情况都是成立的,其中包括在定义时已进行了明确初始化的那些一些.考虑到这个原因,编

java视频播放器怎么实现一个组件的全屏

问题描述 java视频播放器怎么实现一个组件的全屏 这是我做的播放器 我想让中间黑色屏幕实现无边框的全屏播放 我的思路是让上边 右边 和下边的三部分不可见setVisible(false) 然后效果如下 基本实现了全屏 但不能去掉边框 setUndecorated方法可以不显示边框但是他使用的前提是在窗口没有执行任何显示的前提下才能实现 请问 有没有窗体已经显示出来的情况下 能够去掉边框的方法...... 解决方案 已经解决了,还是通过setUndecorated方法,用两个窗口实现 解决方案二

Java装饰器设计模式初探_java

本篇随笔主要介绍用Java实现简单的装饰器设计模式: 先来看一下装饰器设计模式的类图: 从图中可以看到,我们可以装饰Component接口的任何实现类,而这些实现类也包括了装饰器本身,装饰器本身也可以再被装饰. 下面是用Java实现的简单的装饰器设计模式,提供的是从基本的加入咖啡入手,可以继续加入牛奶,巧克力,糖的装饰器系统. interface Component { void method(); } class Coffee implements Component { @Override

一篇文章读懂Java类加载器

Java类加载器算是一个老生常谈的问题,大多Java工程师也都对其中的知识点倒背如流,最近在看源码的时候发现有一些细节的地方理解还是比较模糊,正好写一篇文章梳理一下. 关于Java类加载器的知识,网上一搜一大片,我自己也看过很多文档,博客.资料虽然很多,但还是希望通过本文尽量写出一些自己的理解,自己的东西.如果只是重复别人写的内容那就失去写作的意义了. 类加载器结构 类加载器结构 名称解释: 根类加载器,也叫引导类加载器.启动类加载器.由于它不属于Java类库,这里就不说它对应的类名了,很多人喜

视频播放器的源码求教-如何写一个完整的java视频播放器?诚望高手们指点!

问题描述 如何写一个完整的java视频播放器?诚望高手们指点! 高手们,你们好.我在网上搜了几个java视频播放器的代码,带是均不能正常运行.我不知道是怎么回事,我想请教下你们,同时如果你们有完整的java视频播放器代码,能否提供一份?望指导! 我的代码为: package com.bird.jmf; import java.awt.*; import java.awt.event.*; import java.io.*; import java.net.*; import javax.swin

JAVA混淆器设计

问题描述 我的毕业设计题目是JAVA混淆器,有很多问题希望大家帮忙解答一下,谢谢!1做JAVA混淆器需要重点了解哪些知识?2在分析完CLASSFILE文件结构之后,具体应该使用什么样的方法来进行代码混淆?3为什么混淆后的代码仍然可以正常运行? 解决方案 解决方案二:现在混淆器一般是把变量名和方法名改变使其反编译后可读性很差,几乎不可读.高点的混淆器做到第一步后还把其中一些语句变成虚拟机语言.混淆是可以正常运行的混淆的作用只是反编译后可读性差.可以自己改变一下class文件格式自己写classlo