说到MAC强制访问控制就不得不说它的前辈自主访问控制。自主访问控制又叫DAC(Discretionary Access Control)。传统的操作系统,Windows、MacOS、以及包括Linux在内的各种Unix的系统权限管理都是采用的自主访问控制,自主访问控制将用户(或用户组)简化为一个标识,系统中的资源(比如文件)都会带上用户标识和对应的访问权限信息,通过这种方式赋予不同用户不同的访问权限,操作系统通过对用户标识的比对和权限信息决定一个用户是否能访问某个资源。打个比方,你认为你家里的东西是只属于你的,在DAC看来,只要能进屋的人都对这个屋子里的东西拥有权限,那么你自己开门进屋睡觉也好,小偷撬门进去拿走金银细软也好,隔壁老王每天不请自来到你家蹭饭也好,都是合法的。 在操作系统中也是如此,几乎所有操作系统中都有一个身影,叫管理员,Administrator也好,root也好,都是一群在系统中权力无限大,对任何资源都有完全访问权限的家伙。多数系统服务是以管理员权限运行的,如果它们存在漏洞,被劫持去做一些它们本不该做的事情的时候,DAC是不会阻拦的,因为它无法区分某个动作是程序正常行为还是恶意行为,在它眼里,身份就是权力的象征,只要认可了你的管理员身份,你说什么都是对的,你做什么都是合法的。所以我们说,在DAC机制下,不能用来获取管理员权限的漏洞不是好漏洞,不想获得管理员权限的入侵者不是好入侵者。 那么MAC机制又是怎样的呢?与DAC中的混沌不同,MAC是一个充满秩序的世界,一个每天需要早请示,晚汇报,一举一动要提出申请的世界。在MAC中,一切访问计划都要事先写入安全策略,没有明确的策略允许的任何访问都会被禁止。在上个例子中,作为家中的主人,你需要能够在家睡觉,也是需要明确制定计划的,你需要添加的安全策略看起来是这样的: 定义资源类型:床 定义安全域:休息 定义角色:主人 访问规则:允许主人休息时使用床 如果系统对于你家中的资源访问只添加了这一条安全策略,那么你仍然可以安心的在家睡觉,小偷也好、老王也罢,无论用何种方式进入你家都将寸步难行,接触任何东西的行为都会被禁止,并且一切被禁止的行为尝试都将被另一套完善的监控系统:审计日志记录在案。 明白了这个例子,回到操作系统中我们就很容易看懂MAC是如何防范系统带来的安全威胁的:假设我们有一个存在缓冲区溢出漏洞的文件共享服务,与多数系统服务一样使用管理员权限运行。攻击者通过精心构建一个特殊的数据包发送给服务器,使存在漏洞服务器正常的执行流程被劫持,转而执行修改管理员密码的操作。在DAC控制下的传统操作系统中,一旦攻击生效,那么管理员密码会被这个平时八竿子打不着的文件服务器修改,攻击者随后可以很容易的登录进入系统。而在MAC系统中,文件服务器的可访问的文件是严格受限的,安全策略类似于: 允许系统管理员角色运行文件服务器该进程允许访问被共享文件。 安全策略的定义了该服务可以访问的所有资源,攻击者在攻击了文件服务器后,希望修改管理员密码,它需要访问的是SAM或passwd等的密码管理文件,由于文件服务器进程仅被策略仅允许访问需要被共享的文件,因此对密码管理文件的操作将被拒绝,攻击失效。这种情况下最坏的情形是,攻击者可能非法访问共享文件,因为它仍在安全策略允许范围内。尽管如此,一个系统级的安全漏洞对整个操作系统的影响被限制在了非常小的范围内。 通过细粒度的划分访问权限,将所有应用和服务的访问限制在最小范围内,这就是强制访问控制保护系统不受已知及未知漏洞攻击的原理。 其实强制访问控制和自主访问控制并不是水火不容的,在包括SELinux在内的多数安全框架中,它们是共同生效的,所有的资源(或者准确的说叫客体)访问请求首先要经过DAC权限判定,验证通过之后再进一步进行MAC的安全策略判定,只有同时符合自主访问控制和强制访问控制规则后才能获得访问权限。 SELinux中,有三大类MAC策略模型,分别是TE(类型增强),RBAC(角色访问控制)以及MLS(多级别安全),每一类模型都针对系统已有服务和应用提供了大量安全策略,一个使用了SELinux的典型的服务器操作系统环境,内核中会包含10万条以上的安全策略。那么如此多的安全策略,会不会导致系统每项操作都要进行大量的策略查询和判断,从而步履维艰、不堪重负呢?不会,因为SELinux中提供了策略缓存机制,叫做AVC(向量缓存),将已执行过的访问及其判定结果请求缓存起来,从而可以大幅提升强制访问控制安全策略判定效率。 计算机信息系统的安全等级 (责任编辑:本港台直播) |