Java安全之Access control

相信大家都有看到过类似下面的代码,特别是在读一些比较底层代码时。

SecurityManager sm = System.getSecurityManager();
if(sm != null){
    sm.checkRead(name)  
}

// FileInputStream.java

这段代码是什么意思呢?老实说,很长一段时间我也是似懂非懂,毕竟用的也不多。包括看了《深入理解JVM》里的介绍,也没有明白。

后面,对着官方文档和代码,仔细思考了下,它其实就是java平台提供的一套安全方案,用来保护一些安全敏感的资源(如:本地文件)和敏感的代码的。其中,SecurityManager是安全管理员,所有安全相关的决定都是由这个类来决定的。java本地应用默认没有打开,需要加上这个启动命令: -Djava.security.manager。

Permission默认权限

当类被加载器加载到内存的时候,会自动关联上以下信息:

1. 类路径。不管是从网上下载的,还是从本地文件加载的,都会有一个路径,以URL的形式表示。

2. 签名

3. 默认权限。对于从网上加载的代码,默认权限包括回连到代码源地址的权限。对于从本地文件加载的代码,默认权限包括从同级目录及子目录读取文件的权限。

policy(策列文件)

前面提到,在类加载的时候会有一些默认权限赋给被加载的代码。此外,管理员也可以通过policy文件管理额外的权限。默认策列文件路径:<java_home>/jre/lib/security/java.policy。

Java平台会把policy文件包装成Policy对象,这个Java进程只有一个Policy对象。Policy的主要任务就是判断被访问的资源是否允许被调用代码访问(根据调用代码的URL,签名和默认权限做判断)

Access Control Enforcement(访问控制)

Java runtime会跟踪调用栈(调用方法的先后顺序之类的),当访问一个被保护的资源时,整个调用栈都要被评估是否有权限访问。如果任何一个没有权限,都会抛出java.lang.SecurityException

举个例子,如下图。ClassA调用ClassB的方法,ClassB创建FileInputStream, FileInputStream的构造函数会检查文件的读权限。系统只会检查ClassA和ClassB是否有权限读,因为其他的三个类都是都自动有全部权限。可查看java.policy文件。

参考:https://docs.oracle.com/javase/8/docs/technotes/guides/security/overview/jsoverview.html

猜你喜欢

转载自www.cnblogs.com/lzmrex/p/12469752.html