计算机安全入门(3)
作者:陆麟
转载请征得作者同意.
2005.8.18
上面我们讲到了OS需要保存用户名和密码,用来确定面前的这个用户到底是谁.这个最原始的需求带来了一系列的设计考
虑.
首当其冲的是用户名和密码保存到什么地方? 就目前的OS设计来看, 都是保存在文件里面的.
多数LINUX套件在/etc/目录下有数个保存用户名和密码散列值的文件.而WINDOWS NT系列则在注册表中保存用户名和密码散列值.
注册表归根结底也是一个个的文件. 但是是一个经过特殊格式进行组织的文件.
好巴, 用户帐号信息保存到了文件里面,带来了的设计考虑就是谁能访问这些文件. 显然, 不是任何人都允许访问到这些文件的.
OS设计时刻通常有一些预定的帐号可以直接访问到帐号信息. 在LINUX下,通常是root用户. 在WINDOWS下,
有管理员和帐号管理员可以访问帐号信息.
假设任意人员都能访问到帐号信息, 那帐号的安全性就弱了大半了. 因此,如果黑客有机会用任意的帐号获得帐号文件的控制,
那意味者OS的安全设计有重大缺陷.
现在OS在运行时刻知道了谁在操作,但是操作是否是允许的, 就涉及另外一个设计范畴了. 很显然, 特定的用户可以进行授权范围内的操作.
关键点就在于授权范围的确定.
依据什么原则来划分授权呢? 任何一个操作, 操作对象肯定需要有一个列表. 这个列表表名谁可以操作这个对象. 这点毋庸置疑巴. 例如文件操作,
文件对象必须有安全属性,标记admin, 可读,写,执行,修改,guest帐号可读,不可写,不可执行等属性. 这样的安全属性被NT称为ACL,
ACCESS CONTROL LIST.
但是,有些操作目标并没有空间可以保存ACL. 比如关机动作.
这个动作没有特定数据进行关联,因此到不适合用ACL的概念来记录谁可以进行关机,谁不可以进行关机. 这个情况下,
将动作的许可权限与用户帐号关联起来是比较合适的选择. admin允许关机, guest不准关机. lu0可以关机, lu1不能关机.
通过用户帐号内某个特殊标志就可以完成这样的设计. 用户可以理解为:某个操作是某个用户的特权. 这么一来,
一个被称为特权的概念就需要被加入到OS安全设计的概念中.
说到这里, 顺便提一下, LINUX和WINDOWS对于特权的实现是完全不同的, 在LINUX下完全没有特权这个概念. 而WINDOWS
NT则十分强调特权.
以关机为例. LINUX下, 一个用户要想关机, 就必须有shutdown/reboot/init命令的执行权限.
LINUX下没有在用户帐号中关联某个用户是否可以关机的标志,但是,shutdown文件的属性是root组可执行,因此,
但凡是root组的人员,都可以关机.
要某个用户可以关机,该用户又不是root组的,必须转个弯赋予这个用户对shutdown/reboot/init指令的执行权.
比如设定1个SUID的副本给用户等等.
而WINDOWS NT则并不需要这么饶弯子. 因为关机的特权是可以由管理员赋予任意的用户的.
有个比较特殊的情况必须用特权来实现,一时似乎没什么更好的解决方案.假设下列情形出现.
\forbidden\picture, forbiden目录不允许user lu0打开. 但是picture允许lu0看.
这样的目录结果大家想一下,当lu0在fopen(\forbidden\picture,xxx)时到底应该能打开文件还是不能打开文件?
能打开,则违反了forbidden目录的安全约束,不能打开,则违反了picuture的安全许可.
目前就LINUX世界而言,用户必须层层打开目录才能访问到文件,因此得到的是文件许可拒绝.(suse 9下测得).
在WINDOWS下,有个特权被设计用来解决这个离奇的情形. 这个特权的实际内容为"bypass traverse checking".
起的符号标记为"SE_CHANGE_NOTIFY_NAME", 核心内容就是当用户有SE_CHANGE_NOTIFY_NAME特权时,
可以不用理会父目录的安全权限管制. 而没有这个特权时,用户在每1层目录都必须拥有访问许可才能最终达到picture文件,并且顺利读取.
我们先来想一下没有特权这个概念时OS应当如何处理. 要么根据最终文件安全许可允许打开文件,
要么根据目录许可不允许打开文件.当有些情形需要允许打开文件,而有些情形不允许打开文件时,完全不存在一个妥协方案可以给用户以切实可行的解决办法.
现实世界并非没有这种情况. 管理员如果希望某个目录不能被list,但是里面文件可以读写,就会出现上面的状况.
今天暂且到此为止, 敬请期待下文.