`
totoxian
  • 浏览: 1032639 次
  • 性别: Icon_minigender_2
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

基于主体和对象的访问控制--附:计算机安全的层次

 
阅读更多

安全在很多情况下体现为访问控制,因此访问控制模型就显得十分重要,美妙的是,从处理器硬件到 操作系统到应用软件甚至我们的现实生活,基于主体和对象的访问控制模型竟然是大大的相似,甚至相同。这其实没有什么奇怪的,本身计算机就是人设计出来的, 人的一些根深蒂固的观念便自然在计算机中继续发挥着作用。
intel的特权环检测十分的形象但是十分的复杂,其实这种检查机制正好映射了安全模型中的一个很一般的机制,那就是将安全事件分为主体,对象,主体通过 类型unix能力的概念被约束行为,而对象拥有访问控制列表来约束主体的行为,一个主观和一个客观同时允许访问的时候,访问才可以进行,这样的机制避免了 访问控制时一厢情愿带来的灾难。cpl和rpl位于段选择子中,代表的就是主体能力的含义,而dpl位于段描述符中,代表的是对象的访问控制列表的含义, 更为复杂的在于rpl的设置,它可以使当前代码代理别的特权级来执行,想想看,只有在rpl大于cpl的时候,这个约束才有现实意义,因为如果rpl小于 等于cpl,那么它自己就可以搞定了,又何必让更低特权级的cpl代码帮忙呢?当rpl大于cpl的时候,此时的代码代表更低特权级的代码在执行,从而执 行严格地访问控制,防止高特权级的代码滥用职权。当然,intel特权级的概念远远不止这些,还有一致性代码,非一致性代码等复杂概念以及加之于上的行 为。
基于主体,对象的访问控制是最基本的模型,intel特权环用了,操作系统内核同时也用了,linux中的用户代表的是一个主角,而进程代表主体,进程代 理用户去做事,访问控制就在进程代表的用户是谁,进程本身是谁,进程要访问的对象这三者之间展开,有的时候,虽然进程本身可以访问某个对象,但是由于进程 此时是在代理别人做事,访问控制机制还是可能会拒绝这次访问的,这个意义和intel特权环的rpl的意义类似。linux安全控制沿袭了unix的能力 模型,能力模型规定了主体可以访问哪些对象并且进行哪些操作,而对象的安全不仅仅信任能力模型,毕竟安全领域没有完全的信任,对象还要通过一个访问控制列 表来限制哪些主体可以对自己访问以及进程哪些操作,合二为一就构成了安全领域的基本法则。在linux中,访问控制机制首先进行能力判断,然后进行访问控 制列表判断,注意这两个判断是互不相干的分别进行的。在更加安全的SELinux中,引入了一个新的主角,就是安全ID,SELinux的机制看似很复 杂,实际上只是扩充了能力模型和对象的访问控制列表,具体来说就是以前的能力可能只有读,写,执行,而SELinux的能力可能还包括更加复杂的行为或者 行为集合,同样对对象的保护上,也不再仅仅是当前的访问控制列表那么简单。举个最简单的例子就是如果一个用户的安全ID没有变,即使他su成了root用 户,他的行为照样受到控制。
我们来看看windows的访问控制,它实质上和linux差不多,更确切的说应该和SELinux差不多,它更加在乎对主体的控制,但是对对象的保护方 面用力也不小,主体还是进程,主体的行为被放到了一个叫做令牌的数据结构中,从令牌中可以看到该进程在代表谁执行以及它可以访问哪些对象以及进行哪些操 作,令牌是一个很紧凑的数据结构,而linux中的能力判断和访问控制判断却是松散的进行的。几乎所有的东西在windows中都是对象,而 windows访问控制机制保护的对象就是这些叫做对象的东西,因此每一个对象都拥有安全描述符,这个安全描述符相当于一个访问控制列表,注意,进程本身 也是一个对象,一切皆对象的精髓是博大精深的,用好了将是一副美丽的图景,用不好将会带来更多安全隐患,linux中进程不在安全保护范围内,而只是一个 主体,受到更低一级别的操作系统地址空间隔离机制的保护,这种保守的做法使得一个进程无论如何也不能操控别的进程而只能进行进程间通信。windows敢 于提出一切皆对象,就是由于它拥有着强大的访问控制机制,令牌,安全描述符合力促使了一切皆对象成为了现实。在进行访问控制验证的时候,windows不 是分别进行的,而是统一判断的,这一点和linux有所不同。
最后,我们来总结一下,主体,对象是访问控制的两大实体,如果偏向于对对象的保护,那么最终就发展成了unix的能力模型,能力表示对主体的简单限制,而 对象的保护体现在一个复杂得多的访问控制列表;如果偏向于对主体的控制,那么最终就会发展成windows的基于令牌和安全描述符的访问控制机制,令牌和 安全描述符可以轻松控制每一个主体的行为,它们的数据结构要复杂的多。因此如果安全访问控制点离人-机标尺的人近一些,那么就会形成(主体-操作集 合)->对象的保护方式,反之,如果安全访问控制点离人-机标尺的机器近一些,那么就会形成主体->(用户/组-对象)的保护方式,对象的保 护基本在于允许谁进行什么样的操作,因此用户或者组需要和允许以及拒绝的操作和对象绑定在一起,而用户的行为约束基本在于限定用户可以进行操作的集合,因 此需要将主体用户和它被限制的操作集合绑定在一起。
附:计算机安全的层次
计算机安全体现在任何方面,分页,分段,地址空间隔离,这些都是 基础的安全控制机制,我们之所有感到编程有的时候很困难就是因为有安全控制,如果你写了一个程序去访问NULL指针,结果就是你的程序崩溃,随后你疯狂的 调试找不到原因,然后抱怨破事儿怎么如此之多!其实这正是一种安全的体现,用户的数据在内存中,不管是用户的名字还是用户的银行卡号,而安全机制要求内存 在释放了都要清0,并且使用的时候必须首先分配,而为了效率往往是在分配的时候才将内存清0,用户空间安全机制要求用户释放了指针之后,一定要将指针赋值 为NULL,如果NULL指针可以随意访问,那么恶意用户进程就可能访问到已经被释放但是还没有清0的内存,另外还有很多别的方面的原因导致了NULL不 能被随意访问。如果你想在4G的虚拟地址空间驰骋,那么守规矩是必要的,毕竟不是你一个人在跑,自己跑偏没有问题,破坏了别人的数据就不好了,越简单的计 算机编程约束越少,这也是显然的,如果底层的操作系统构建了一个安全的多用户多任务的平台,那么可以保证的仅仅是这个平台本身不会出问题,靠的就是内存管 理,MMU,进程调度等等,但是操作系统的目的就是提供给用户使用,而用户在使用机器的时候,他们所关心的不是机器的安全而是他们的数据安全,因此就出现 了基于主体和对象的安全访问控制,访问控制本质上保护的还是计算机上的东西,因为计算机没有别的更好的办法来控制用户对他们存入机器的资源的访问,访问控 制其实还是计算机内在的安全机制,因为你不能将主体或者对象的任何一方带出计算机,比如打印出来,甚至带到别的计算机都不可能,但是无论如何,访问控制的 保护向用户的方向更加接近了,最终,用户数据的保护还是落实到了最古老也是最有效的密码学上,密码保护是计算机外围的保护,你可以将计算机加密后的数据打 印出来然后笔算解密,在这个层次上,计算机真正退化成一个更加快速的工具。
总之,计算机安全分为机器安全(分段,分页,地址空间隔离等),操作系统安全(用户对资源的访问控制等),数据安全(整个数据的安全),越往上的层次越抽象,到了密码学安全领域,计算机成了工具,这也回归了计算机的本质。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics