text: 操作系统是计算机系统的基础软件，而系统虚拟化已成为云计算平台的核心技术，没有它们提供的安全性，这些计算机系统及其上数据的安全性都将无法保障。本课程将从理论与工程实践相结合的角度，介绍操作系统(Linux)与系统虚拟化(Xen)安全相关理论、技术和方法，包括：安全概念、安全机制、安全模型、安全体系结构、安全开发方法、安全标准与评测方法等，帮助你深入学习和理解该领域的知识体系、实践技术和方法。
  [音乐][音乐]同学们好！上次课我们讲到了这个安胜的安全系统、安全体系结构的设计那么今天我们介绍一下基于这个体系结构以及我们前面给出的安全策略我们在这个安胜的、在Linux系统里面，如何来实现我们的安全策略？在实现安全策略之前，我们来看一下系统的，我们怎么样在系统里面去加入我们的安全机制？首先我们要对整个Linux系统里面进行一个安全性的分析在它的文件子系统、进程子系统、IPC子系统，或内存子系统、网络子系统等里面去找到这个跟安全性有关的部分到底是什么？当然这个工作其实我们的LSＭ框架已经提供了相关的一个支持我们可以在这些支持的框架里面，找到跟我们安全策略有关的那些钩子函数。第二个工作呢就是我们要把我们模型相关的策略和规则对应到相关的这个子系统里面的功能这些子系统里面的功能，当然最后的实现应该是一个独立的或者多个安全功能的子系统，就是我们的安全模块在整个这个分析完之后我们就要来给我们各个安全功能做一些相关的这个机制的实现在实现的时候，我们按照前面我们所提到的这个安胜系统的这个总体结构来一一地介绍其中一些主要的安全机制的实现方法。接下来我们看一下这个用户标识与鉴别这一部分呢其实跟传统的用户标识与鉴别的一个很大的不同在于在标识与鉴别的过程当中，用户除了要去提供用户名和口令之外还需要增加两个功能：第一个功能就是要去鉴别用户登录的这个用户，当前应该以什么样的安全级来进入这个系统，他所处的这个安全级是不是允许在我们所定义的安全级范围之内如果是，才允许他进行进入进入所以这个是我们在登录的时候要确定的再一个登录的时候，还要确定这个安全级的用户，它当前所担任的角色是什么？它的角色是否是在允许的这个，是在它这个UA指派关系里面所授权的这个指派角色范围之内如果是，它才可以继续进入。第二个要验证的呢是在鉴别机制里面，进行了一个增强。其实就是我们前面提到，用了一个我们自主研发的一个通过OS管理局这个认、认可的这样的一个算法，叫QC算法来进行这个身份卡的一个认证，就是相当于一个强身份认证这就是我们在安胜安全操作系统的标识与鉴别主要要做到的两个工作那么关于第一个工作，我们要做的一个主要是修改就是在login的这个相关的，或者是loginftp这样的一种登录程序里面要去修改在鉴别之后要增加相关的一些安全上下文，就是安全级别角色域这样一些鉴定。另外就是关于整个为了做这样一个用户的标识与鉴别，我们还需要在修改相关的useradd和user相关就是用户管理相关的一些命令那么这些命令为什么要做修改？主要是因为涉及到这些用户在登录的时候，它要去指派相关的一些上下文，比如说安全级别啊、它的角色啊等等这些所以我们在这样的管理命令里面，也要考虑在增加用户的同时，怎么样为它赋予这样的安全属性这是标识与鉴别部分第二个关于这个自主访问控制，自主访问控制这部分，其实我们前面讲安全机制的时候曾-经提到过我们主要是在传统的9betav的基础之上增加了一个ACL，就是访问控制列表的这样的一个实现机制那么这个实现机制呢在实现的时候我们主要是要考虑到怎么样在客体，就是我们的相关的客体，包括我们的文件目录也包括我们的一些IPC的客体，比如说我们的消息、我们的队列在这后面怎么样附上相关的一个表项、表项当然，同时我们要还要考虑这个ACL如何来提供相关的一些管理命令。那么文件系统这一块我们要实现相关的这个ACL的技术，其实要做的实现呢设计到了内存和磁盘两个部分比如说为了增加ACL表项，我在系统里面要专门建立一个aclbuf这样一个空间这个空间里面来借、存放所有的跟文件有关的一些ACL的表项。那么在相关的每一个文件，或者相关的这个客体的inode这样的一些节点上面，我们要建立一个链接就是一个索引指针，叫aclbuf，ACL的指针。那么这个指针它会去指向跟它关联的这个ACL的项，这是我们在实现的时候的一个做法。第二个呢就是磁盘里面ACL，因为我们知道这些ACL的数据在系统起来的时候，是内存当中是需要初始化的，它要初始化的这个来源来哪？肯定是要从静态的磁盘上导入系统、导入内核的所以我们需要在磁盘上保留一份ACL的相关的值所以ACL的file这个文件，主要是来存放对应不同的节点它上面的ACL的表项的值当然我们在ACL的这个存取和删除一个列表的时候，也要考虑怎么样在删除一个ACL的表项的时候，能够对应地把相关的这些数据进行一个更新，包括内存的和磁盘上的数据要做对应的更新这样才能保证策略的一致性。这是ACL数据结构在安胜系统里面的三个主要的部分：一个是关于这个ACL表项的类型第二个是关于这个类型用户的ID，或者用户组的ID。下面是它的许可权这是具体的在super_block，就是在我们的超级块，就是文件系统的这个表示的这个数据块、数据结构当中加入的这个voidsecurity这个指针这个指针的所对应的这个就是我们关于DAC的这部分的定义结构体的定义。大家可以看一下，这个结构体里面包含了一些相关的信息呀，包含了它对应的这个安全信息永久存放的文件的指针也包含了这个ACL表项在内存里面的，这个刚才我们提到那个buffer的指针，同样当然也包含了一些数、比如说DAC模块是否加载这样一个这样一个标志位。这是关于DAC策略在我们的系统当中的一个实现就是DAC的就是自主访问的机制。我们再来看一下这个强制的完整性的访问控制机制它在系统的这个实现方法，这个方法呢其实我们前面也提到过它主要是针对DTE，RBAC和Posix权能机制三者的结合的一种实现方法所以这个方法其实很重要的一点就是要为主体客体都打上相关的标签，主体打上域，客体打上型然后还要建立相关的这个表项，就是主域和型的表项，和域和域之间的转换的这样的一个表。所以这个系统里面我们其实在建立的时候，对系统里面定义了6个域一个是daemon_d，这个是系统初始起来的时候所处的一个域login_d呢是系统在进入login程序的时候，这个login程序所处的一个域那么user_d和admin_d还有operate_d这其实都是指的用户，比如说是一个普通用户的时候他进入的域，如果他是一个管理员是进入-一个管理域然后是操作员是进这个操作域。此外呢，我们对所有的文件和相关的这些对象进行了27种型的划分、型的划分那么这些型的划分主要是针对我们要保护的对象，比如说对于我们的这个可执行文件bin，我们专门定义一个型对于我们的配置文件，专门定义了型，对于我们审计文件，audit_t也专门定义了一个型这样便于对于我们的要保护的这个数据做相关的策略的制定这是我们的一个实例的一个配置那么这个实例配置里面，大家可以看到主要有前面、前面两排，其实指的是我们所给出的这个型的标识第二排给的是我们所给出的域的标识，就是刚才我们提到的四个域然后、后面给出了这个相关的这个每一个域它跟型的这样的一个策略和域和域转换的策略，都在后面给出最后这个assign这部分持续指出的是每一个这个客体就是或者一个目录，它应该被指派为什么样的型，这样一个分配的一个关系这就是强制策略的一个规范啊。前面刚才我们说到，第一部分是列出所有的型第二部分是列出所有的域，第三部分是指定初始的域，系统进入以后的一个初始域第四部分呢，是给出这个系统里面文件根和它的这个指定文件系统根，和这个孩子的这个缺省类型第五部分其实是给出域的规范，第六部分是给出型的分配的规则那么同样在这个DTE完整性策略的实现的过程当中，我们同样也要考虑，怎么样去系统里面进行建立相关的数据结构，和进行内存和磁盘的这个策略的一致性的这样的一些实现。所以我们在这策略里面，第一首先要考虑建立，要把这个void*security加到对应的inode的结构体里面去，那么inode的结构体要对应专门定义一个跟我们这个完整性策略有关的一个数据结构此外呢就是，我们要考虑，就是系统在初始化的时候，它应该有一个初始策略配置文件的从静态的磁盘加载到内核的这样一种方式所以我们这里考虑了，建立了一个外属性文件，叫DTE的eaf，那么这个文件其实里面就是为我们这个系统提供了一个初始的规则来怎么样来为初始加载的这个系统指定相关的一些型。这是关于DTE的策略或者说我们完整性地把握策略的一个实现机制那么关于机密性这一部分的访问控制机制呢，其实跟DTE有非常类似的地方但是它因为是不同的策略，所以主要是跟我们前面说的多节安全规则的实践方法是类似的但是这里重点要考虑的就是说，我们在实现的时候，可能要考虑，要保护的客体可能不仅仅是-我们的文件系统可能还包括我们的IPC的客体，就是我们的进程之间通讯的这些客体，也要做相应的一些保护那么具体的实现方法呢，其实在安胜的系统里面主要是把这个安全级就是我们的这个，它对所有的这个信息呢，划分成了三个区就是我们的数据，它进行了区的划分什么样的区呢？一种叫这个系统管理区，一个是用户空间区，还有一个病毒保护区也就是说，第一部分这个数据，相当于系统管理区，就是相当于我们系统里面的一些数据。它一般情况下，是不允许用户去读，也不允许用户写那么这种数据，它的这个机密性很重要。所以我们对这部分要单独制定，做一个保护第二是关于用户空间区，就是我们用户可以读，可以写那么这个其实是，安全级别要求比较低的一些数据。第三个是病毒保护区，就是，有一些数据包括我们的一些命令，或者一些这个配置文件，那么可以让一些用户进程去读，或者去执行但是它绝对不允许他去写，或者修改。那么这样的数据，就会归在这个病毒保护区那么系统里面的用户呢，也分成两类用户，一类是不具有特权的用户，一类是普通用户所以我们在制定规则的时候呢，会根据这个数据，处于不同的这样的一个区来给它打不同的标签，安全标签那么由于它是处于这个用户空间，还是防护区空间，还是属于这个管理空间那么它所给的安全级别是不一样的。那么安全级不同，那么用户根据用户的安全级不同，他其实能访问的这样的数据是不一样的。就是按照这个规则啊，不可上读，不可下写这样一个规则我们做了一些修改，然后它在实现的时候呢，可以对相关的一些数据进行隔离在多级安全这个访问控制机制里面。其实还有一个很重要的一个实现方法，就是多级分层的文件系统那么这个多级分层的文件系统，其实主要是指的，在这个文件系统里面，我们经常会建立就是有一个层次关系。有一个父目录，子目录，子目录下面再有文件，这样一个层次化的一个管理结构，那么在这个管理结构下面我们到底应该如何来实现这个多级安全？其中很重要的一个部分呢，其实就是有一个叫多级目录的概念大家知道，在很多的系统里面，都会有一个共享的一个目录。比如在Linux环境之下就有一些像tmp，还有这个VAR下面的tmp目录，User下面的tmp目录，这种tmp目录，是一些叫临时目录，看起来是个临时目录。它，但是它是希望所有不同安全级的用户，都可以去进入这个系统进入这个目录，然后建立自己的文件，进入。但是呢，因为是多级安全系统，所以它又不希望不同的用户在这样一个目录下，可以看到别的这个用户的这个文件所以它在这样的目录下面，应该如何来实现不同的用户，有不同的视图呢？所以在这个方面，采取了一个多级目录的一个思想就是相当于把第二级目录，是这个安全级第三级目录才是真正的用户所建立的文件，或者是目录。那么第二级这个目录，叫做安全级的目录，对用户来讲，是可见的比如说我们看这张图。tmp目录下有个Level1和Level2，两个安全级的目录下面，Level1下面有两个文件file1file2，2下面有这个file3file4假如用户可以进入L1的目录，Level1这个目录级别，他是属于这个级别，可以查看这个目录的话。它ls/tmp执行这个操作的时候，他直接看到的是file1file2而不是像我们传统的，比如说ls/tmp，他看到的是Level1和Level2这两个名字，对吧？所以这种做法呢，其实就是相当于做了一层屏蔽让用户呢，可以，在一个目录下，可以显示出不同的视图，根据你的安全级不同可以看到不同的文件。那么这种模式如果处于工作状态的时候，我们叫实状态。如果这个状态处认为是一个虚模式，如果这个状态属于不工作的情况下，比如说就ls/tmp的时候，能看到，Level1和Level2这两个目录的话，那么我们叫实模式。所以我们在工作的时候，通常会把它设为虚模式来工作，这就是我们多级目录的一种实现方式强制信息策略同样会涉及到两个部分啊，就是内存和磁盘，永久存储的问题那么这个实现，跟我们前面提到DAC的这个实现方法非常类似，就是在内存里面要考虑我们要建立相关的数据结构，然后我们怎么样去跟inode关联起来那么在磁盘上呢，也是我们要考虑怎么样做持久化的一个保护好，我们再来看一下最小特权控制这一部分那么最小特权控制，其实在我们前面的课程里面都提到过我们这里再简单说一下，这个安胜4.0它这个最小特权控制的一个实现方法3.0里面我们说了，它主要是建立了四个角色这四个角色其实就是四组管理命令那么在安胜的4.0里面，我们是在内核级做了这个权能的划分然后我们采用了，刚才说的POSIXRBAC和DTE的一个组合的三个层次的这样的一个最小特权的管理方法所以，它的实现方法呢，主要是在登录的时候我们要去鉴别它的用户，所处的安全级别，它担任的角色和所属的域，这样三个层面进行验证在实现的时候，这个系统里面，这个角色我们其实只定义了4个角色，就是安全员，操作员和审计员和网络员，他们分别负责不同的工作安全员负责策略，安全性相关的一些决策，或者安全相关的一些策略配置操作员负责日常的，比如说开机，关机，装载设备，卸载设备。审计员负责这个审计日志的这个设置，审计记录的查看，等等这样的一些操作。那么网络员呢，他负责网络环境的配置和这个网络服务的开启和停止这样一些管理那么，在系统工作的时候，我们知道，就是我们允许一个进程在登录的时候，进入某些域所以我们还设置了两个域，一个叫管理域和操作域。那么前面我们同学刚才看到，我们DTE策略里面其实设置了一个adminD和一个operateD那么针对这两个，四个管理员可以进入不同的域其实我们可以将4乘2变成8个角色比如说安全员进入管理域，他是安全管理员安全员如果进入操作域，他是安全操作域，那么我们这样的话可以把这个相关的角色其实可以变成8个角色这是最小特权管理的部分的实现。那么我们再看一下隐蔽通道分析隐蔽通道分析，其实在安胜的安全操作系统里面，我们主要是要考虑隐蔽存储的分析因为它是安胜的4.0，是满足，是要达到这个第四级，第四级要求里面，只要求分析隐蔽存储文档那么在做隐蔽通道分析的时候，其实首先要解决的是两个问题。第一个问题呢，是这个搜索的彻底性大家知道大型的操作系统一般是上百万行那么这么多的代码，我们通过人工来做肯定有困难的，我们怎么样找一些辅助工具来帮助我们做这种彻底性的分析第二个问题就是处理这个"伪非法流"的问题比如说我们在构造出来可能的这个潜在隐蔽通道的时候我们怎么知道哪些是可以排除掉，它是不是隐蔽通道，对吧？就是伪非法流那么这个排除的方法应该怎么样去考虑那么在安胜的4.0系统里面，我们采用了一个叫回溯搜索法这回溯搜索法我们主要的思想是结合了两部分就是我们采用的方法其实是采用了两种，首先我们采用了前面说的这个共享资源矩阵法，当然是改进后的这个共享资源矩阵法做辅助。然后我们还重点采用了是这个回溯搜索法就是代码级的这个方法来进行彻底的搜索。那么具体的这个分析方法第一步是列出源代码当中所有的这个持久变量，比如说在内核级，我们要去找到所有的static，或者是extend这样的因为Linux是用C写的，所以我们去找这个static和这个extend这种存储变量。那么这是我们所说的持久变量，找到这样的持久变量之后，我们再去看、分析、反向推，这些变量被哪个函数内核函数调用这个内核函数又被哪个内核函数调用，最后它能不能够被一个系统调用所调用？所以通过这个关系的分析来分析这些变量里面哪些变量是对于某个系统调用是可以写的，就可以改变它另外，哪些这个变量是可以通过某个系统调用去获取，去读所以我们要去做这个写访问的分析和读访问的分析分析出来某个TCB，最后对这个共享变量的一个读的途径，或者是对它的一个写的途径找出来那么有了这样的途径之后，我们就来，最后来构造，并且查一些潜在隐蔽通道什么样的潜在隐蔽通道呢？就是说如果某个变量可以找到一个TCB或一个系统调用，对它进行写的这样一个这个一个流动的操作。另外我们还可以找到一个系统调用，对它进行什么？进行读，刚才是写，这一个是读，对同一个变量，如果存在这样的两个操作也存在这样一个变量，那么我们就可以构造一个隐蔽通道的三元组那么这个三元组其实就是我们希望去找到的潜在隐蔽通道那么我们通过这种方法去找到系统里面的所有的潜在隐蔽通道，然后找出之后呢我们再去构造实际的应用场景，利用这两个操作去构造场景，实现。这个场景的构造我们在隐蔽通道的这个分析里面曾经讲过，同学们可以再去回顾一下那么通过这个场景构造来判定这个通道是不是一个真实存在的隐蔽通道所以这个回溯搜索法呢其实是在'iii'的隐蔽流信息，就是语义信息流分析法的基础之上做的一个改进那么这是一个反向的一个做法。那么利用这个方法，我们在安胜的4.0里面找到了18条隐蔽通道并且构造了场景，进行了带宽的估算和进行了有效的处理最后我们再看一下这个密码服务，密码服务其实刚才在讲标识与鉴别的时候曾经提到过了我们其实主要做了两个密码相关的支持，第一个就是IC卡的强身份认证这一块就是我们在登录的时候，除了检查口令，还要基于我们的IC卡进行一次基于卡的这个认证方式，强身份认证的方式，叫双因素认证，对吧？第二个呢我们就是要实现这个加密文件系统，那么加密文件系统主要是对我们某指定的目录或指定的文件我们可以采取一种更强的一个可选择密码可选择算法的方法来进行加密的这样的一种机制我们是利用了这个loopback这样一个设备技术去对文件系统实现的这样一个加减密，透明的加减密的这样一种技术。好，这就是我们在安胜安全系统里面对这些相关的访问控制机制、加密机制，还有我们的隐蔽通道分析等等最小特权管理等等方面的一些机制的实现方法这次课我们就讲到这，谢谢！