我们口中的操作系统,一般指的是:一个操作系统核心+各种扩展应用程序。但从专业的角度来讲,操作系统就是那个核心(通常称之为内核),就是将底层硬件进行抽象和虚拟化,并向使用者提供各种功能接口的软件程序。这是一种非常特殊的软件程序,它的特殊之处就在于:操作系统是使用者运行其他应用程序的底层软件基础,也是硬件功能被集中管理和调用的统一接口。它向上层隐藏了硬件结构的丑陋和不易操作,使得使用者在使用计算机时变得更加简单;向下层屏蔽了底层硬件无法理解的使用者发出的复杂指令,将其翻译成二进制序列,使得硬件可以更加快捷的予以执行。
Linux内核,从它诞生的那天开始,变表现出极强的生命力,源自于UNIX的很多的哲学思想被沿用在Linux中。一切皆文件!多么简单但却又复杂的一句话。说它简单,是因为对于用户来讲,每一个系统的资源,包括各种硬件(磁盘、内存、网络等)和软件都是以一种可访问甚至是可编辑可修改的文件的方式来展现,用户不必再去思考底层的技术了;说它复杂,是因为这种抽象和虚拟是在大量的驱动程序和数以百计的接口函数的支撑下得以完成的。
在这样的一套系统中,使用者可以用自己掌握的自然语言向计算机发号施令,而计算机也会非常忠诚地予以执行,无论成功与否。这种简化给使用者带来了极大的便利,但也同时会给计算机带来很多的安全问题。比如说:谁能在什么时间对什么文件进行什么操作?结果如何,成功还是失败?如果成功会有怎样的影响?如果失败,是否会予以记录?……等等。
安全秘笈第一式——自主访问控制(DAC)
要知道,在操作系统出现之初,是没有用户的概念的,那个时候每个使用者都会在获得计算机使用权时,将自己所携带的键盘及显示器等设备连接到计算机所提供的某个接口上,这些设备被统一的称为“终端设备”。只要使用者将这些设备接入,即可使用计算机的各种资源。而且计算机的资源是公共的,不属于任何人的。一开始,资源充足,大家相安无事;但是随着使用者数量的增加,资源却没有本质的变化,从而必然会导致资源危机。这个时候,就会出现资源竞争的问题了。每个人都企图占用更多的CPU计算时间,占用更多的内存空间,设置后来磁盘存储介质发明之后,这样的外部存储空间也成为竞争极为激烈的一种资源。甚至到了后来,这种竞争变得极其的残酷。那么,会不会有某些使用者在不经其他使用者同意的情况下,将其他使用者的数据修改或删除,或者将其他使用者正在运行的程序强行终止呢?因为通过这种方式可以很直接的获取到很多的可用资源。而在整个过程中,操作者是这个操作的主体,即使其操作不当也不会有任何的惩罚,全靠其自身的道德规范来约束,但有时这种约束显得螳臂挡车,毫无力度可言。操作系统的开发和维护人员很显然想到了这个问题,所以,为了防止这样的恶性事件的发生,他们在操作系统中给每个用户定义了一个身份,只有使用以这个身份来接受系统的认证,已确定使用者的合法性。在文件系统出现之后,定义了使用者所对应的用户身份对于各种资源的访问权限,只有满足权限要求才能继续使用计算机的资源。于是这样一来,用户能否完成某个操作,不取决于使用者本身是怎么样的社会角色,而是使用者在计算机中的身份映射——用户,能不能完成对资源的访问以及后续的如删除、修改等操作。后来我们把这种资源管理的机制称为自主访问控制(DAC,Discretionary Access Control)。那么,什么是DAC呢?
DAC主要的内容包括以下几个概念:主体、客体、权限(rwx)、所有权(ugo)。
在这个模型中,主体是用户的身份,客体是资源或者说是文件(切记:一切皆文件)。由客体的属主对自己的客体进行管理,由主体自己决定是否将自己的客体访问权限或部分访问权限授予其他主体,这种控制方式是自主的。也就是说,在自主访问控制下,用户可以按自己的意愿,有选择地与其他用户共享他的文件。
DAC是一种相对比较宽松但是却很有效的保护资源不被非法访问和使用的手段。说它宽松,是因为他是自主控制的,在保护资源的时候是以个人意志为转移的;说它有效,是因为可以明确的显式的指出主体在访问或使用某个客体时究竟是以何种权限来实施的,任何超越规定权限的访问行为都会被访问控制列表判定后而被阻止。
接下来我们来看看DAC到底是怎么工作的。但是,我们需要了解一个前提,我们需要知道这样的一个问题:在访问客体资源的时候,并不是使用者进入到计算机中,以主体的身份来完成这样的访问工作。每当我们需要使用计算机系统资源的时候,我们都需要去打开一个应用程序,在操作系统中,我们可以把这样的已经被启动并加载至内存中的应用程序称为进程。但是,不管是应用程序还是要访问的文件资源,都是存储在外部存储设备中的数据,想要定位和查找他们,就必须依靠文件系统才能实现。这个时候,文件系统所规定的权限就会生效了。
因此,我们所定义的DAC系统有两个至关重要的标准:
1.文件的所有权:系统中的每个文件(一些特殊文件可能没有,如块设备文件等)都有所有者。在DAC系统中,文件的所有者是创建这个文件的计算机的使用者(或事件,或另一个文件)。那么此文件的自主访问控制权限由它的创建者来决定如何设置和分配;
2.访问权限:文件的所有者拥有访问权限,并且可以将访问权限分配给自己及其他用户。
上述两个标准说明:
1.文件的所有权的优先级高于访问权限
1)文件的所有者即便没有任何权限,也可以在为自己分配权限之后获得访问文件的能力。
2)非文件的所有者即便已经获得了访问权限,也可能会被所有者随时收回,从而导致无权访问该文件。
2.权限是文件访问的关键
1)无论是不是文件的所有者,关系到使用者能否访问文件的最直接的因素是其所对应的用户是否获得了可访问该文件的权限
2)使用者被分配的何种权限,就只能以该权限所规定的操作来访问文件,无法越权。
那么所有权和权限是如何规定和标识的呢?
在Linux所支持的默认的文件系统(早期的是ext系列,后来是xfs)中,所有权被分成三类,即:文件的拥有者,文件的所属组,其他人
1.文件的拥有者:也称为属主,标记为u,默认情况下,创建文件的用户就是其属主;
2.文件的所属组:也称为属组,标记为g,除了属主之外,还可以被哪些用户共同拥有。由于这样的用户可能不止一个,所以不方便用某个用户名来标识,因此以组的方式来标识。
3.其他人:标记为o,除了文件的属主和属组之外的其他所有使用者的统称。
在在Linux所支持的默认的文件系统(早期的是ext系列,后来是xfs)中,权限被分成三种,即:读权限,写权限,执行权限
<