Java安全管理器

原创 2017年09月25日 09:20:59

总的来说,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内核设计剖析》

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

欢迎关注:

这里写图片描述

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

java安全管理器

安全管理器与访问权限转载于http://edu.codepub.com/2010/0703/23971.php它允许应用程序在执行一个可能不安全或敏感的操作前确定该操作是什么,以及是否是在允许执行该操...
  • soliy
  • soliy
  • 2011-02-16 14:00
  • 1800

Java安全管理器——SecurityManager

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

Java安全管理器(Security Manager)

原文:http://yuanyong.iteye.com/blog/616036  每个Java应用都可以有自己的安全管理器,它是防范恶意攻击的主要安全卫士。安全管理器通过执行运行阶段检查和访问授权...

Java RMI之HelloWorld程序以及相关的安全管理器的知识

Java RMI 指的是远程方法调用 (Remote Method Invocation)。它是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法。可以用此方...

COPY Java安全管理器SecurityManager

一、JavaDoc如是说 安全管理器是一个允许应用程序实现安全策略的类。它允许应用程序在执行一个可能不安全或敏感的操作前确定该操作是什么,以及是否是在允许执行该操作的安全上下文中执行它。应用程序可以...

Java 安全管理器--SecurityManager

安全管理器是一个允许应用程序实现安全策略的类。它允许应用程序在执行一个可能不安全或敏感的操作前确定该操作是什么,以及是否是在允许执行该操作的安全上下文中执行它。应用程序可以允许或不允许该操作。 ...

Java 安全管理器--SecurityManager

安全管理器是一个允许应用程序实现安全策略的类。它允许应用程序在执行一个可能不安全或敏感的操作前确定该操作是什么,以及是否是在允许执行该操作的安全上下文中执行它。应用程序可以允许或不允许该操作。 ...

JAVA RMI远程调用Socket服务异常--安全管理器

背景要求:定时监控远程主机上mongodb数据库内存使用的情况,当内存使用过大时暂停逻辑处理线程后启动内存空间的释放处理线程,释放完成后再启动逻辑处理线程。 操作系统:CentOS 64bit (L...
  • MCpang
  • MCpang
  • 2012-09-28 16:19
  • 4599

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

摘要: 标签: Java 安全 [toc] 安全管理器:SecurityManager 安全管理器在Java语言中的作用就是检查操作是否有权限执行。是Java沙箱的基础组件。我们一般所说的打开沙箱,也...

java安全——类加载器+字节码校验+安全管理器与访问权限

【0】README0.1)本文文字描述转自 core java volume 2,旨在学习 java安全 的相关知识;【1】类加载器1)java 技术提供了以下3种确保安全的机制(mechanism)...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)