Security1 1(三)|学习笔记

简介: 快速学习 Security1 1(三)

开发者学堂课程【高校精品课-上海交通大学-企业级应用体系架构:Security1 1】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/75/detail/15823


Security1 1(三)

 

内容介绍:

一、Java 的类加载器

二、 字节码的校验        

三、安全管理器和权限


将代码下载下来换到本地,所以后来就不进行区分,将所有的代码无论是远程的还是本地的进行转运,不同的转运就是不同权限,将一个个的代码无论是远程的还是本地的都转化为 domain,根据不同的 domain 设置不同的权限。Domain 是要么按照位置划定,要么按照谁签名划定,要么按照谁来执行程序划定,三种执行方式都可以,三种都是划定 domain 的方式,需要做的就是将不同的代码划分到 domain,domain 里的代码具有不同的权限集,同一个 domain 具有同一个权限集,需要做这样的事情。

image.png

这样会比较抽象,举例下图为 Java 权限的类的类图,有很多权限网络权限、文件读写权限、socket 权限等等,在 policy 权限里面用刚才定义的权限类描述。

image.png

比如有一个 policy 文件,首先 grant 是关键词需要授权,codeBase 是刚才定义的三种按照代码的位置,按照执行的线程的特征,按照谁来签名。codeBase 是按照代码的位置划分,即凡是来自http://www.horstmann.com/classes的代码,就是class来自这里的类授权,permission 是一个关键词,后面可以有多个权限,java.io.Filepermission代码具有文件操作的权限,能操作哪里即对着谁在授权也就是能够操作 tmp 目录所有的文件,能对目录进行读和写。这就是 policy 文件,可以看到整个 Java 平台,在 Java 平台的后面有 java.policy 文件,相当于在 jre 环境里面有 java platform home directory 文件,即在一个计算机里有多个用户,每个用户都可以有自己的 policy,这个细节可以不管。接下来看 policy是怎样写的,policy 一般的写法是 grant 关键字,底下是三种授权方式之一,有位置、有特征或者是谁签名过的代码三种方式。后面是对三种方式不同的描述,代码机给出了代码的位置,里面给出了一系列的权限,相当于给 codesource 定义了 domain,下面的permission 1和2就是权限集,domain 代码就具有 permission,写完之后会有很多的写法,举例写一个类叫做 getprops,getprops没有做很复杂的东西,就是读取当前系统的属性,Java 的版本、os的名字、Java 的 home,这个非常简单就是读了三个系统属性然后分别输出,类直接去运行没有问题,三个属性就会出来,但是如果在安装 Java 安全管理器的情况下就需要带参数,编写 policy 文件,这里写的 grant,将 policy 文件和刚才的类放到一起,grant后面什么都不加意思就是当前目录里面所有的类文件授予下面的权限,需要读 Java 的版本,有属性的权限,这时 Java 的版本、操作系统的权限、java 的 home 分别有读的权限,使用下面的命名去执行,也就是在 Java 的安全管理器下使用 GetProps.policy GetProps 使用 policy 文件夹的名 字property 在 GetProps.policy 的控制下执行GetProps. 这时会发现执行的时候会有一些差异,可以看一下代码,刚才看到的类就是获取基本属性,获取之后在控台上输出,可以看到代码就是之前的类,policy 文件和和之前看到的是相同的,可以看到二者是被放在同一目录中,所以在运行类的时候,grant文件的意思是要对当前目录中的类做授权,因为在一个目录中,所以要对 GetProps 类文件做授权,加下来拷一下代码。

现在三个权限都有可以看到会输出 Java 虚拟机13.0.2,操作系统为Mac Os.x,jre的安装环境在那里,将其中最后一个权限注释掉,编译类结束后拷贝,可以看到最后一个抛异常,抛异常就是访问控制异常 access niel,就是访问java后面被拒绝。如果什么都不要直接执行比如现在权限文件还是和之前一样,还是像之前一样执行但是不安装安全管理器,直接运行几个类。可以看到不要安全管理器去管理,安全管理器不会检查,也就不会检查 policy 文件会直接去读。可以发现三个属性被读出来了,再使用安全管理器运行一遍,又会抛异常。所以通过这个例子可以知道实际上在跑应用的时候是否要进行安全检查完全是在一开始运行Java虚拟机的时候指定的。

image.png

可以检查也可以不检查,如果不检查就像之前看到的就直接写Java GetProps ,运行 GetProps 类就可以。如果想要检查就要既安装安全管理器,又要告知 policy 是谁,之后安全管理器就会动作,按照policy 的权限去执行 class 文件,所以看到的差异就是,不用任何安全管理器进行检查的时候随便怎样读都可以读出,一旦使用了安全管理器最后一条就不好隐藏。这就是它工作的原理,在给整个当前的Java虚拟机安装安全管理器之后,才会根据指定的 policy 检查,否则是无效的,权限之前看到了 propertypermission 只对系统属性做读取,基本属性是读,还有之前的可以读和写,能有多个属性。

下面自定义一个权限,然后用定义的权限控制操作,考虑权限重要的特征是什么,之前讲到的一个权限后面有两个东西,一个是 tar.g,就是一大类属性需要对哪个目标进行控制,比如系统属性的权限只对Java版本做控制,后面的“read”是 action,即对它能做什么。像之前看到的对 tmp 文件夹做文件权限的控制,控制读和写,当然可以只读不写,后面的“read和write”就叫做 action,对于一个权限来说重要的是要定义target是什么,对它做什么样的 action,target 和 action 要在构造器里面传递进去,主要是对哪个 target受 action,action 是一个列表可以有多个。有一个 get action 的方法能够将支持 action 返回回去,两个权限视频相等需要按照对象的内容来,不是按照引用是按照内容,所以必须覆盖equals和hashcode 两种方法,如果不覆盖这两种方法,默认情况下就是对象引用来比较是否相同,即使两个对象的内容比如两个权限一模一样,也是按照内存地址去比也不会判断其他不同。在比较两个权限是否相同更希望看内容,也就是给的 action list 是否相同,如果一样认为是同一个权限,这时才能判断两个权限相等用户是有这个权限的,所有要按内容比较要覆盖 equals 和 hashcode 两种方法。

无论在Java 里面的任何一个类,只要希望用内容比较都要覆盖两种方法。前面的比较简单,重点来看 implies,implies 在所学的离散数学中看就是隐含的意思,也就是在 action 类中有 implies 方法,将来也就是 a implies (b)即a隐含了b,如果返回是true,也就是a包含了b权限,如果是false即a权限不包含b权限,原因是如果有一个权限的设置像之前的tmp,就是对 tmp 里面所有的文件都要进行读和写的操作,如果有一个用户要去写tmp/a.txt的文件,马上就会去比较policy文件出现的权限是否隐含tmp/a.txt,tmp与tmp/a.txt是不相等的,需要判断tmp权限是否包含tmp/a.txt权限,必须要判断是包含的,所以一个用户要去访问tmp/a.txt是允许的,两个权限在进行比较的时候都不会直接相等或者是绝大多数情况下不会直接相等。

都是在看 policy 文件里面授的权限是否隐含现在要操作的权限,举例都是 Filepermission,一个是说对tmp里面所有的文件都有读和写的权限,一个是只有读的权限,一个是对底下的文件有读和写的权限,另一个是对tmp里面子目录所有的文件有写的权限,按照允含的关系p1是允含p3的,p1和p2一定是p1允含p2,因为p1后面为读和写包含p2的读,前面都是 tmp 是相同的,拿到p1、p2、p3、p4之后要看如果在 policy 文件里面写的是p1,当用户希望比较p2、p3、p4是 policy 权限允许的时候要去调implies,所以 implies 是最重要的一类方法,就是在自定义的权限要想好如何去实现。

image.png

相关文章
|
存储 JSON 安全
手摸手教你定制 Spring Security 表单登录
手摸手教你定制 Spring Security 表单登录
|
安全 Java 编译器
Security1 1(二)|学习笔记
快速学习 Security1 1(二)
Security1 1(二)|学习笔记
|
安全 小程序 Java
Security1 1(一)|学习笔记
快速学习 Security1 1(一)
Security1 1(一)|学习笔记
|
存储 算法 NoSQL
Caching(二)|学习笔记
快速学习 Caching(二)
123 0
Caching(二)|学习笔记
|
存储 缓存 JSON
Caching(三)|学习笔记
快速学习 Caching(三)
157 0
Caching(三)|学习笔记
|
存储 缓存 NoSQL
Caching(一)|学习笔记
快速学习 Caching(一)
143 0
Caching(一)|学习笔记
|
消息中间件 SQL Java
Messaging1(三)|学习笔记
快速学习 Messaging1(三)
125 0
Messaging1(三)|学习笔记
|
消息中间件 缓存 前端开发
Messaging2(二)|学习笔记
快速学习 Messaging2(二)
Messaging2(二)|学习笔记
|
消息中间件 存储 负载均衡
Messaging2(三)|学习笔记
快速学习 Messaging2(三)
120 0
Messaging2(三)|学习笔记
|
消息中间件 传感器 算法
Messaging1(一)|学习笔记
快速学习 Messaging1(一)
125 0
Messaging1(一)|学习笔记