当前位置:   article > 正文

JVM的安全管理_jvmcontroller安全设置

jvmcontroller安全设置

本文涉及的代码在github上:https://github.com/singgel/eight-sorting-algorithms/tree/master/src/test/java/com/hks/eightsortingalgorithms/securityManager

java的沙箱

在了解java虚拟机的类装载器之前,有一个概念我们是必须先知道的,就是java的沙箱,什么是java的沙箱,java的沙箱总体上经历了这么一个过程,从简单的java1.0的基础沙箱到java1.1的基于签名和认证的沙箱到后来基于基础沙箱+签名认证沙箱的java1.2的细粒度访问控制。

                  java的沙箱是你可以接受来自任何来源的代码,但沙箱限制了它进行可能破坏系统的任何动作,因为沙箱相对于系统的总的访问能力已经被限制,所以沙箱形象的说更像是一个监狱,把有破坏能力的代码困住了。

                  java沙箱的基本组件如下:

                   1.类装载器结构(可以由用户定制)

                   2.class文件检验器

                   3.内置的java虚拟机

                   4.安全管理器(可以由用户定制)

                   5.java核心API

                   java的沙箱中类装载器和安全管理器可以由用户定制的,但是这样就加大了java代码安全的风险,所以java有一个叫访问控制体系结构,他包括安全策略规范运行时安全策略实施,java有一个默认的安全策略管理器,用户可以使用默认的安全策略管理器也可以在它之上进行扩展。

安全管理器

安全管理器是一个单独的对象,在java虚拟机中,它在访问控制-对于外部资源的访问控制-起到中枢作用

                如果光看概念可能并不能很好的理解,或者说比较抽象,下面是ClassLoader其中的一个构造函数,先简单的看看它在初始化ClassLoader之前会做一些什么操作

  1. protected ClassLoader(ClassLoader parent) {
  2. SecurityManager security = System.getSecurityManager();
  3. if (security != null) {
  4. security.checkCreateClassLoader();
  5. }
  6. this.parent = parent;
  7. initialized = true;
  8. }

这个构造函数的第一话(当然还有隐式调用)就是System.getSecurityManager();这行代码返回的就是一个安全管理器对象security,这个对象所属的目录为java.lang.SecurityManager。

这个构造函数先判断如果已经安装了安全管理器security(在前面类装载器的章节,我们提到过,类装载器和安全管理器是可以由用户定制的,在这里有了体现吧!!既然有System.getSecurityManager();你当然也应该猜到有System.setSecurityManager();),也就是安全管理器不为空,那么就执行校验,跳到checkCreateClassLoader();

 

实践写自己的安全管理器

下面来尝试一下写一个非常简单的demo,旨在让你有一个比较形象的思维,不会在概念上打转。

                第一步,定义一个类继承自SecurityManger重写它的checkRead方(如果你有兴趣可以先跳到super.checkRead(file, context);看看,当然不看也没有关系,我们后面的章节会基于这个demo做扩展的时候也会讲到)。

  1. package com.hks.eightsortingalgorithms.securityManager;
  2. /**
  3. * 第一步,定义一个类继承自SecurityManger重写它的checkRead方(如果你有兴趣可以先跳到super.checkRead(file, context);
  4. *
  5. */
  6. public class MySecurityManager extends SecurityManager{
  7. @Override
  8. public void checkRead(String file) {
  9. //super.checkRead(file, context);
  10. if (file.endsWith("test"))
  11. throw new SecurityException("你没有读取的本文件的权限");
  12. }
  13. }


                第二步,定义一个有main函数的public类来验证自己的安全管理器是不是器作用了。

  1. package com.hks.eightsortingalgorithms.securityManager;
  2. import java.io.FileInputStream;
  3. import java.io.IOException;
  4. /**
  5. * 第二步,定义一个有main函数的public类来验证自己的安全管理器是不是器作用了。
  6. */
  7. public class TestMySecurityManager {
  8. public static void main(String[] args) {
  9. System.setSecurityManager(new MySecurityManager());
  10. try {
  11. FileInputStream fis = new FileInputStream("test");
  12. System.out.println(fis.read());
  13. } catch (IOException e) {
  14. e.printStackTrace();
  15. }
  16. }
  17. /**
  18. * 第三步,运行代码查看控制台输出
  19. */
  20. }


                  第三步,运行代码查看控制台输出

  1. Exception in thread "main" java.lang.SecurityException: 你没有读取的本文件的权限
  2. at com.hks.eightsortingalgorithms.securityManager.MySecurityManager.checkRead(MySecurityManager.java:13)
  3. at java.io.FileInputStream.<init>(FileInputStream.java:127)
  4. at java.io.FileInputStream.<init>(FileInputStream.java:93)
  5. at com.hks.eightsortingalgorithms.securityManager.TestMySecurityManager.main(TestMySecurityManager.java:14)

 从上面的异常我们发现,安全管理器起作用了。读过笔记四的人应该会发现,这里我们用到了一个笔记四提到的方法:System.setSecurityManager(new MySecurityManager());这个是安装安全管理器的另外一种方法,笔记四中我们曾经用-Djava.security.manager安装过默认的安全管理器,有印象不?

 

拓展内容

好了,我们的安全管理器是怎么被执行的呢?如果你有兴趣可以继续往下看一下,也可以跳过,这里只是简单的介绍一下,也是本人习惯的学习思路

直接跳到FileInputStream的构造函数里,下面贴出代码,简单阅读一下

  1. public FileInputStream(File file) throws FileNotFoundException {
  2. String name = (file != null ? file.getPath() : null);
  3. SecurityManager security = System.getSecurityManager();
  4. if (security != null) {
  5. security.checkRead(name);
  6. }
  7. if (name == null) {
  8. throw new NullPointerException();
  9. }
  10. fd = new FileDescriptor();
  11. open(name);
  12. }

发现没?它首先执行SecurityManager security = System.getSecurityManager();,然后再调用security的checkRead方法,就是这么简单。

 

如果你还有兴趣那么继续往下读,在使用java的File时,你是否用过setWritable(boolean, boolean),让你可以指定创建文件的权限,学习了安全管理器之后你有没有有豁然开朗的感觉,它是怎么实现的,相信你已经猜到了,没有错就是安全管理器设置权限啦。下面贴出它的代码,同时也引入一个新的概念Permission

  1. public boolean setWritable(boolean writable, boolean ownerOnly) {
  2. SecurityManager security = System.getSecurityManager();
  3. if (security != null) {
  4. security.checkWrite(path);
  5. }
  6. return fs.setPermission(this, FileSystem.ACCESS_WRITE, writable, ownerOnly);
  7. }
Permisson就是权限的意思,它仅仅取出安全管理器然后将文件的权限设置了一下而已,这个也是后面所有关于权限的一个不可或缺的类!

参考:https://blog.csdn.net/yfqnihao 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/911183
推荐阅读
相关标签
  

闽ICP备14008679号