分类: LINUX
2008-04-23 08:21:34
在SELinux下安全策略的实施是在基于角色的访问控制(RBAC)下的类型增强(TE),(SELinux也能实现多级安全(MLS)的实施,MLS在本文范围之外),类型增强(TE)是最常见的,但也是最不容易理解的,因为它强制实施更细粒度的许可:当某些东西因为异常访问拒绝而遭到破坏时,类型增强(TE)是最可靠的,在TE中,一个进程的安全域(它的影响超过了系统)是由任务历史和当前执行的程序决定的
RBAC的概念并不象TE一样被经常提到,并且因为他与TE集成的原因,总是让人难以理解,你通常会认为RBAC是按照用户被分配的角色进行访问的,从TE方面来说SELinux明确指出了基于角色的访问,因此SELinux下RBAC的目标是允许基于角色的权限管理,然后限制一个角色的权利域,合成一个有效的安全上下文。
要知道这是如何工作的,请看一个简单的现金帐簿会计系统是如何使用SELinux提供安全保护的,你将在两个完全不同的环境(看这两个环境相关的下载,附录A)下看到一样的解决方案:
在developerWorks网站上有一篇文章“从零开始SELinux”介绍了如何从零开始一个SELinux系统,这个系统显示在内核和用户空间里的部分是绑定在一起的。
Fedora Core 8 系统,Fedora Core 8 系统(写本文时的最新版本)展示了SELinux与RBAC是如何高度地集成在一起的。
与角色一起工作
假设你已经要求一个库房部门部署一套安全登记库存会计系统,因为每天都进行现金帐簿,最终数量必须同时被出纳和经理统计,因此我们首先定义两个角色,出纳和经理,然后我们将角色赋予了需要它的雇员,即赋予出纳和经理。
在两个系统上的策略文件或许会稍微不同,在两个系统上都使用现金帐簿系统,数据一样,所有数据存储在/data目录下,并且只能通过/bin/register.py程序进行访问,register.py能同时被经理和出纳使用,用于存储数值,为了保持代码简洁,缺少一些特点,出纳每天为他自己存储现金帐簿值,经理能为其他雇员存储数值,当出纳与经理为同一个出纳存储相同的数值时,经理能够提交这个数值。
在2007/12/12晚上9点,当出纳Bob使用register.py存储了一个数值109.95时,文件/data/cashier_r/bob/12-12-2007被创建,内容是"bob 09:00 109.95.",后来,经理Mary在9:25存储了一个相同的数值,结果文件/data/cashier_r/bob/12-12-2007被覆盖,内容为"mary 09:25 109.95.",最后,Mary在晚上9:27提交了这个数值,bob使用register.py提交后创建了文件/data/final/bob/12-12-2007,内容为"mary 09:27 bob mary 109.95."。
如果Bob和Mary对他们的数值都不同意,Mary将不能为Bob提交数值了,他不得不去找Bob协商,除非他们两个都同意,否则这两个数值都必须重新计算,重新运行register.py命令用前面的数值再计算一次,新的结果将附加到先前的结果后以便仓库管理员稍后容易阅读,bob使用/bin/register.py命令提交时将使用最后的那个数值而不是/data/cashier_r/bob/12-12-2007和/data/mgr_r/bob/12-12-2007。
注意:在这个例子中讨论的代码都为访问控制需要使用了SELinux,我们的例子简单地允许所有拥护都能完全往/data目录下的文件和目录中进行写入访问,在一个真实的部署环境中,你可能会想到使用DAC[译者注:即传统的linux权限控制,使用访问控制列表ACL]许可来进行深度防御,所有经理都希望在/data/mgr_r/bob/和/data/final/bob/目录下创建文件,牵涉到UNIX组权限的小心使用,但是更简单的办法是,完全依靠SELinux来实现强制访问控制。
首先阻止经理和出纳访问/data目录下的任何文件,除非通过register.py程序,实际上,Bob将以cashier_t类型登陆到角色cashier_r,但是cashier_t不能读取/data目录下的内容,为了能读取,他必须进入cashier_register_t类型,进入后也只能执行/bin/register.py程序,类似地,Mary将以mgr_t登陆到角色mgr_r,但是他必须进入mgr_register_t类型后才能执行/bin/register.py程序来访问/data目录下的内容。
第一个访问控制实际上发生在登陆的时候,PAM模块认为Bob必须登陆到cashier_r角色,当在内核中的SELinux类型增强服务器拒绝同意bob_u:cashier_r:cashier_t进入bob_u:cashier_r:cashier_register_t时也会发生,除了执行cashier_exec_t类型的文件,cashier_exec_t是管理员仅仅为/bin/register.py指定的类型。
当register.py拒绝同意出纳提交数据或为另一个用户存储数据时也会发生,将来通过SELinux策略进行加强,并且内核代码也会加强策略的控制,它不允许cashier_register_t访问/data/mgr_r或/data/final目录下的文件。