java安全管理器类SecurityManager简单剖析:

javadoc介绍:

SecurityManager是一个允许应用实现一种安全策略的类。它允许一个应用去明确,在执行一个可能安全或者敏感的操作之前,此操作是否允许在一个安全的上下文中被执行。
应用可以同意或者拒绝执行操作。
SecurityManager类包含许多以check开头命名的方法。java库中的各种方法在执行一些敏感的操作时可以调用这些方法。对check方法典型的调用如下:
SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkXXX(argument);
}

SecurityManager通过抛出异常来阻止没有权限或敏感操作的完成。 如果操作被允许执行,则简单的返回,如果操作被拒绝,则抛出一个SecurityException。
对于这种处理方式唯一的例外就是checkTopLevelWindow方法,此方法返回boolean值。 当前安全管理器被设置通过System类的setSecurityManager方法。获取当前安全管理器用System类的getSecurityManager方法。
SecurityManager中特定的方法checkPermission(java.security.Permission)负责明确允许还是拒绝由指定权限所指示的访问请求,默认的实现是:
AccessController.checkPermission(perm);
若果一个请求访问被允许,则checkPermission安静的返回,如果被拒绝,则抛出一个SecurityException异常。
从Java 2 SDK v1.2 开始,SecurityManager 中其他所有 check 方法的默认实现都是调用 SecurityManager checkPermission
方法来确定调用线程是否具有执行所请求操作的权限。 注意,只带有单个权限参数的 checkPermission 方法总是在当前执行的线程上下文中执行安全检查。
有时,应该在给定上下文中进行的安全检查实际上需要在不同 的上下文(例如,在一个辅助线程中)中进行。
Java 为这种情况提供了包含有上下文参数的 getSecurityContext方法和 checkPermission方法。
getSecurityContext 方法返回当前调用上下文的一个“快照”(默认的实现返回一个 AccessControlContext 对象)。下面是一个示例调用:
Object context = null;
SecurityManager sm = System.getSecurityManager();
if (sm != null) context = sm.getSecurityContext();
checkPermission 方法使用一个上下文对象,以及根据该上下文而不是当前执行线程的上下文作出访问决策的权限。
因此另一个上下文中的代码可以调用此方法,传递权限和以前保存的上下文对象。下面是一个示例调用,它使用了以前示例中获得的 SecurityManager sm:
if (sm != null) sm.checkPermission(permission, context);

权限分为以下类别:文件、套接字、网络、安全性、运行时、属性、AWT、反射和可序列化。管理各种权限类别的类是
  java.io.FilePermission、
  java.net.SocketPermission、
  java.net.NetPermission、
  java.security.SecurityPermission、
  java.lang.RuntimePermission、
  java.util.PropertyPermission、
  java.awt.AWTPermission、
  java.lang.reflect.ReflectPermission
  java.io.SerializablePermission

除前两个(FilePermission 和 SocketPermission)类以外的所有类都是 java.security.BasicPermission 的子类,
而 java.security.BasicPermission 类又是顶级权限类 java.security.Permission 的抽象子类. BasicPermission 定义了所有权限所需的功能,
这些功能的名称遵从分层属性命名惯例(例如“exitVM”、“setFactory”、“queuePrintJob”等等)。
在名称的末尾可能出现一个星号,前面是“.”或星号,这表示通配符匹配。例如:“a.*”、“*”是有效的,而“*a”或“a*b”是无效的。
FilePermission 和 SocketPermission 是顶级权限类 (java.security.Permission) 的子类。像这些命名语法比 BasicPermission
所用的语法更为复杂的类都直接是 Permission 的子类,而不是 BasicPermission 的子类。例如,对于 java.io.FilePermission 对象而言,权限名就是文件(或目录)的路径名。 某些权限类具有一个“动作”列表,告知允许对象所执行的动作。例如,对于 java.io.FilePermission 对象,
动作列表(如“读、写”)指定了允许对指定文件(或指定目录中的文件)执行哪些动作。 其他权限类是“指定的”权限 - 有名称但没有动作列表的类;您也许有指定的权限,也许没有。 注:还有一个暗指所有权限的 java.security.AllPermission 权限。该权限是为了简化系统管理员的工作而存在的,因为管理员可能需要执行很多需要所有(或许多)权限的任务。

SecurityManager应用场景:

当运行未知的Java程序的时候,该程序可能有恶意代码(删除系统文件、重启系统等),为了防止运行恶意代码对系统产生影响,需要对运行的代码的权限进行控制,这时候就要启用Java安全管理器。

启动安全管理器:

  • 参数启动(指定 -Djava.security.manager)
  • 通过程序打开SecurityManager SecurityManager sm = new SecurityManager(); System.setSecurityManager(sm);

关闭安全管理器:

程序关闭: SecurityManager sm = System.getSecurityManager(); if(sm != null){ System.setSecurityManager(null); }

注意:上面的代码只有你在位于${JDK_HOME}/jre/lib/security目录下或者其他指定目录下的java.policy文件中指定了一个权限才会奏效。 这个权限是:

permission java.lang.RuntimePermission "setSecurityManager";

默认配置文件:(默认的安全管理器配置文件是 $JAVA_HOME/jre/lib/security/java.policy,即当未指定配置文件时,将会使用该配置。内容如下:)

// Standard extensions get all permissions by default

grant codeBase "file:${{java.ext.dirs}}/*" {
permission java.security.AllPermission;
}; // default permissions granted to all domains grant {
// Allows any thread to stop itself using the java.lang.Thread.stop()
// method that takes no argument.
// Note that this permission is granted by default only to remain
// backwards compatible.
// It is strongly recommended that you either remove this permission
// from this policy file or further restrict it to code sources
// that you specify, because Thread.stop() is potentially unsafe.
// See the API specification of java.lang.Thread.stop() for more
// information.
permission java.lang.RuntimePermission "stopThread"; // allows anyone to listen on dynamic ports
permission java.net.SocketPermission "localhost:0", "listen"; // "standard" properies that can be read by anyone permission java.util.PropertyPermission "java.version", "read";
permission java.util.PropertyPermission "java.vendor", "read";
permission java.util.PropertyPermission "java.vendor.url", "read";
permission java.util.PropertyPermission "java.class.version", "read";
permission java.util.PropertyPermission "os.name", "read";
permission java.util.PropertyPermission "os.version", "read";
permission java.util.PropertyPermission "os.arch", "read";
permission java.util.PropertyPermission "file.separator", "read";
permission java.util.PropertyPermission "path.separator", "read";
permission java.util.PropertyPermission "line.separator", "read"; permission java.util.PropertyPermission "java.specification.version", "read";
permission java.util.PropertyPermission "java.specification.vendor", "read";
permission java.util.PropertyPermission "java.specification.name", "read"; permission java.util.PropertyPermission "java.vm.specification.version", "read";
permission java.util.PropertyPermission "java.vm.specification.vendor", "read";
permission java.util.PropertyPermission "java.vm.specification.name", "read";
permission java.util.PropertyPermission "java.vm.version", "read";
permission java.util.PropertyPermission "java.vm.vendor", "read";
permission java.util.PropertyPermission "java.vm.name", "read";
};

配置文件简单解释:

配置基本原则:

在启用安全管理器的时候,配置遵循以下基本原则:

  1. 没有配置的权限表示没有。
  2. 只能配置有什么权限,不能配置禁止做什么。
  3. 同一种权限可多次配置,取并集。
  4. 统一资源的多种权限可用逗号分割。

默认配置文件解释:

第一部分授权:授权基于路径在"file:${{java.ext.dirs}}/*"的class和jar包,所有权限。

grant codeBase "file:${{java.ext.dirs}}/*" {
permission java.security.AllPermission;
};

第二部分授权:这是细粒度的授权,对某些资源的操作进行授权。具体不再解释,可以查看javadoc

grant {
permission java.lang.RuntimePermission "stopThread";
……
}

补充:当批量配置的时候(例如第一部分授权),有三种模式:

  • directory/ 表示directory目录下的所有.class文件,不包括.jar文件
  • directory/* 表示directory目录下的所有的.class及.jar文件
  • directory/- 表示directory目录下的所有的.class及.jar文件,包括子目录

  可以通过${}来引用系统属性,如: "file:${{java.ext.dirs}}/*"

问题解决:

当出现关于安全管理的报错的时候,基本有两种方式来解决。

取消安全管理器:

一般情况下都是无意启动安全管理器,所以这时候只需要把安全管理器进行关闭,去掉启动参数即可。

增加相应权限:

若因为没有权限报错,则报错信息中会有请求的权限和请求什么权限,如下:

Exception in thread "main" java.security.AccessControlException: access denied (java.io.FilePermission E:\pack\a\a.txt write)

上面例子,请求资源E:\pack\a\a.txt,的FilePermission的写权限没有,因此被拒绝。

  也可以开放所有权限:

grant {
permission java.security.AllPermission;
};

java安全管理器SecurityManager介绍的更多相关文章

  1. java安全管理器SecurityManager

    本文转载自java安全管理器SecurityManager 导语 这是一篇对Java安全管理器入门的文章,目的是简单了解什么是SecurityManager,对管理器进行简单配置,解决简单问题. 比如 ...

  2. java安全管理器SecurityManager入门

    table { margin-left: 30px; width: 95%; border: 1px; border-collapse: collapse } img { border: 1px so ...

  3. Java安全管理器——SecurityManager

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

  4. 安全管理器SecurityManager

    一.文章的目的 这是一篇对Java安全管理器入门的文章,目的是简单了解什么是SecurityManager,对管理器进行简单配置,解决简单问题. 比如在阅读源码的时候,发现这样的代码,想了解是做什么的 ...

  5. Java安全管理器

    启动SecurityManager开关: 隐式: 启动时添加JVM启动参数: -Djava.security.manager :启动默认的安全管理器: -Djava.security.policy=& ...

  6. java安全沙箱(四)之安全管理器及Java API

    java是一种类型安全的语言,它有四类称为安全沙箱机制的安全机制来保证语言的安全性,这四类安全沙箱分别是: 类加载体系 .class文件检验器 内置于Java虚拟机(及语言)的安全特性 安全管理器及J ...

  7. java jvm学习笔记六(实现写自己的安全管理器)

    安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用AccessController的checkPerssiom方法,访问控 ...

  8. java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

    java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...

  9. java之jvm学习笔记六(实践写自己的安全管理器)

    安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用AccessController的checkPerssiom方法,访问控 ...

随机推荐

  1. 用python处理csv文件

    1.准备csv文件(这里是平安银行的统计表:下载并另存为pingan.csv) >>> from urllib import urlretrieve >>> url ...

  2. 与其他相似软件对比,win10中个人助理conrtana具备哪些独特的功能

    目前,Cortana 可以回答各种口头问题,直接设置提醒,或者提供位置导航,并支持语音命令处理各项事务,而且随时间的推移学习更多内容,从而变得更加个性化和实用.简单而言,集成在 Edge 浏览器中的 ...

  3. Oracle 树操作、递归查询(select…start with…connect by…prior)

    一.Oracle中start with…connect by prior子句用法 connect by 是结构化查询中用到的,其基本语法是:select … from tablename start ...

  4. 「ZJOI2016」解题报告

    「ZJOI2016」解题报告 我大浙的省选题真是超级神仙--这套已经算是比较可做的了. 「ZJOI2016」旅行者 神仙分治题. 对于一个矩形,每次我们从最长边切开,最短边不会超过 \(\sqrt{n ...

  5. Java 使用 int 数据计算百分比

    int diliverNum=3;//举例子的变量 int queryMailNum=9;//举例子的变量 // 创建一个数值格式化对象 NumberFormat numberFormat = Num ...

  6. Android自定义控件总结

    自定义控件分类: 1.使用系统控件,实现自定义的效果 2.自己定义一个类继承View ,如textView.ImageView等,通过重写相关的方法来实现新的效果 3.自己定义一个类继承ViewGro ...

  7. table-layout引起的探索——fixed和auto的区别

    问题:最近想把mui提供的底部导航组件样式单独抽出来,遇到一个问题:给底部图片下的文字设置了超出隐藏,但没有生效,如下图: 注:该底部导航为mui提供的组件 解决:这让我百思不得其解,经过一些琢磨后发 ...

  8. Kali学习笔记27:Burpsuite(上)

    文章的格式也许不是很好看,也没有什么合理的顺序 完全是想到什么写一些什么,但各个方面都涵盖到了 能耐下心看的朋友欢迎一起学习,大牛和杠精们请绕道 如果我只能选择一款工具进行Web渗透,那么一定就是Bu ...

  9. PyTorch--双向递归神经网络(B-RNN)概念,源码分析

    关于概念: BRNN连接两个相反的隐藏层到同一个输出.基于生成性深度学习,输出层能够同时的从前向和后向接收信息.该架构是1997年被Schuster和Paliwal提出的.引入BRNNS是为了增加网络 ...

  10. python中的进制转换

    python中常用的进制转化通常有两种方法: 1.用内置函数hex(),oct(),bin(),对应的数字表示为0x,0o,0b,功能是把十进制数字转化为其他进制  >>> int( ...