文件系统将主设备号和次设备号存放在i节点中的磁盘地址表内,所以没有磁盘空间分配给设备文件(除i节点本身占用的磁盘区外).当程序试图在设备文件上执行I/O操作时,系统识别出该文件是一个特别文件,并调用由主设备号指定的设备驱动程序,次设备号作为调用设备驱动程序的参数.
(5)安全考虑
将设备处理成文件,使得Unix程序独立于设备,即程序不必一定要了解正使用的设备的任何特性,存取设备也不需要记录长度,块大小,传输速度,网络协议等这样一些信息,所有烦人的细节由设备驱动程序去关心考虑,要存取设备,程序只须打开设备文件,然后作为普通的UNIX文件来使用.从安全的观点来看这样处理很好,因为任何设备上进行的I/O操作只经过了少量的渠道(即设备文件).用户不能直接地存取设备.所以如果正确地设置了磁盘分区的存取许可,用户就只能通过UNIX文件系统存取磁盘.文件系统有内部安全机制(文件许可).不幸的是,如果磁盘分区设备得不正确,任何用户都能够写一个程序读磁盘分区中的每个文件,作法很简单:读一i节点,然后以磁盘地址表中块号出现的顺序,依次读这些块号指出的存有文件内容的块.故除了root以外,决不要使盘分区对任何人可写.因为所有者,文件存取许可方式这样一些信息存放于i节点中,任何人只要具有已安装分区的写许可,就能设置任何文件的SUID许可,而不管文件的所有者是谁,也不必用chmod()命令,还可避过系统建立的安全检查.
以上所述对内存文件mem,kmem和对换文件swap也是一样的.这些文件含有用户信息,一个"耐心"的程序可以将用户信息提取出来.要避免磁盘分区(以及其它设备)可读可写,应当在建立设备文件前先用umask命令设置文件建立屏蔽值.
一般情况下,UNIX系统上的终端口对任何人都是可写的,从而使用户可以用write命令发送信息.虽然write命令易引起安全方面的问题,但大多数用户觉得用write得到其他用户的信息很方便,所以系统将终端设备的存取许可设置成对所有用户可写.
标签: