[音乐]
[音乐]
好 刚才我们看到了这个视频其实给出的是一种非常简单的一个实现方法
那么它主要是在用户层来实现的一个 方法,那么它不需要去内核级提供相关的一些支持
那么第二种实现方法呢事实上是我们在安胜的4.0采取的一种方法
也是post标准非常建议的一种实现方法
那么这种实现方法我们需要在内核集进行相关的一些 修改。
我们先来看一下这个策略 如果在内核集实现的话,我们要做一些什么事情
第一呢,我们要在系统里面要去考虑怎么样为静态的
可执行文件,或者说我们所说的这个程序来赋予一个这样的特权集合
第二呢,是我们要考虑怎么样为系统里面的每一个进程
就是说工作起来的这个可执行文件和程序 那么为它去根据不同的这个用户
来给它赋予相应的一些特权。
第三个呢 其实是要考虑,因为大家知道,每个用户在启动一个进程的过程当中
它有可能会动态地通过执行exec这样的一些系统调用
改变自己的一些进程镜像,比如说在它的这个进程的生命周期里面 它会改变进程镜像,那么大家知道不同的这个进程镜像
其实就是不同的程序逻辑,它 执行的是不同的功能,所以它所需要的特权应该是不同的
所以为了实现动态的最小特权,那么我们还希望 就是说一个进程在执行exec系统调用的时候
能够动态地修改这个进程当前的 这样的特权集合,或者说我们所说的权能
大家看这张图,这张图其实 表达的就是在系统里面我们每一个这个
主体它在执行的过程当中 就是在它整个生命周期,我们把它叫做一个进程链
在这个过程当中它通过执行exec这样一个系统调用 大家知道exec里面一定会要去写一个它要
改变,它要执行哪个程序,会有一个静态的程序的名字 所以当前进程的这个权能状态
要受什么样的影响呢?要受它将要执行的这个程序的 这样的权能状态的影响。
当然了,还可能会有一些其他的相关的上 下文会产生一些影响。
所以我们要给出一个权能 遗传的一个算法,就是说我们要计算这个进程在每次转换它的进程镜像的时候
如何来转变它当前的这样的一个权能状态
为了实现这样一个机制呢,post标准给出了这个系统
里面,我们应该为这个进程,和应该为静态的程序或者可执行文件
赋予什么样的一个权能状态给出了一个建议
那么建议是这样的,就是说每一个进程和每一个程序文件
都应该有三个权能集合,这三个权能集合是什么呢?一个是可继承集
可继承集里面表达的就是指
我这个主体当前所拥有的权能能不能够遗传给下一个这个进程状态
如果可以,那么你就可以把它设成可继承的一个权能
第二个呢是许可级,那么许可级里面表达的是这个进程或者这个可执行文件的功能
它要完成它的功能所需要的最大的这个权能集合
第三个是有效集,那么有效集表达的是这个进程或者是这个文件
它当前在执行的时候,就是执行它当前功能的时候 所需要生效的这些功能。
当然了 很明显这个有效集合应该是许可集合的一个子集
那么我们可以看到在可继承集、 许可集和有效集 它的表示方法呢都跟它的这个英文的名字相关联
有了这个概念之后呢,或有了这样的一个建议的这个权能集合的划分之后
那么很多的这个系统呢也采取这样一些建议来进行相关的一些实现
下面我们来举一些例子,看一下这些系统里面是 如何来实现这样一个权能表示和权能的一个遗传算法的
第一个例子是关于我们现在的这个Linux系统里面它的这个权能遗传算法
这个权能遗传算法我们可以看一下这张
这个图,也可以看一下这个公式 这个公式其实我们可以很明显地看到,一个进程
从上个进程镜像变到下一个进程镜像的时候,它的可遗传的这个集合是不变的
第二呢,就是说这个新的这个权能状态的这个permission,就是我们最大的许可集合
它会通过这样一个公式来计算,这个公式里面我们解释一下
就是说因为它改变了进程镜像,所以呢新的这个
程序的这个最大权能集合应该是下一个进程状态的非常主要的一个部分 也就是说这个fP,那么里面呢还有一个X
这个X代表的是什么呢?代表的是Linux系统里面对所有进程 的一个最大权能集合的一个上限
就是说所有的进程你要拥有的权能都不能超过这个X,比如说X里面它
我们知道Linux系统里面有三十几个,有二十几个权能定义 那么不是所有的都可以赋给每一个进程
那么其实比如说有一个权能是所有的进程都不能 给的,那么这个其实就表示在这个X里面
fI和pI表示的是这个 文件的可遗传权能和这个前一个进程的可遗传权能的集合
那么这两个集合的这个与,其实就是它两的 交集,才可以继续遗传给下一个进程状态
那么fP'就是我们指的这个下一个进程的这个E'的状态,它是由
这个pP'和这个文件要执行所需要的这个有效集合fE的一个交集 这是关于这个Linux权能遗传算法。
此外呢,在这个DG/UX系统里面
也有一个相应的权能遗传算法,那么这个算法其实跟前面那个算法的一个不同,就是说它对
进程还有静态的文件的,可执行文件的这个权能集合都多了一个
多了一个bounding,就是Bounding集合,大家可以看到这个 左侧的是这个进程的这个进程的这个
四个权能集合,那么中间这一列呢其实指的是我们所说的可执行文件的四个权能集合
那么具体的算法呢这里给出来了,我就不再详细解释,同学们有兴趣可以去参考
一些,参考这个DG/UX系统的这个技术文档 那么关于这个权能遗传算法
在系统里面,就是第二种这个最小特权管理里面,刚才我们提到 很重要的一点,就是说,系统里面可能要定义权能
另外呢,要为每一个进程赋予权能,还要为每一个可执行文件赋予权能
另外在内核里面,还要实现一个权能遗传的算法 这是它要做的主要工作
那么当然,还有一个很重要的工作,我们不要遗忘的是,就是说系统在刚刚起来,启动的时候
那么系统的第一个进程它的这个初始权能状态是必须赋予的
因为如果没有初值,那么你这个权能遗传算法是没有办法往下去计算的 再有第二个就是说,每一个这个
用户在初始登录的时候,我怎么样为他赋予这个初始的这个权能状态?
这两个工作在我们系统设计的时候需要考虑。
那么我们这里给出了安胜系统里面实现的一种方法 比如说我们在这个第一个问题,就是关于每一个用户通过登录的时候
怎么样获取它的初始权能?这里在登录状态的时候 我们可以在登录的过程当中,根据用户的属性
来给它赋予相关的权能状态 第二个呢,就是关于第二个问题,就是系统里面第一个进程
就是我们通常所说的这个0号进程或者说1号进程 那么这个进程的权能状态应该如何来赋值?
我们的做法其实也是对这个 进程的权能状态我们通常就默认开启的是所有
当然这个做法是否是最好,其实
是要去系统地分析的,我们当初在实现这个系统的时候也做过大量的分析
那么发现其实它在启动的时候,会涉及到很多的一些操作,需要很大的一个权限
所以基本上在这个过程里面我们把最大的权限给了第一个进程
好,我们最后小结一下最小特权的这个实现方法
那么最小特权这个机制呢,其实我们主要包括,需要大家掌握的一个是最小特权原则
第二个就是关于这个操作系统里面的特权的含义 以及特权如何划分,划分的标准
以及在系统里面应该到底如何来进行划分的 第三个是这个最小特权管理机制在系统里面的实现方法
那么我们这里呢给出了两种实现方法,一种方法是关于这个在用户层的这个
实现方法,还有一种是基于post标准所实现的 基于权能遗传算法的一个这样的实现方法。
好,这次课就到这,谢谢