对照访问的三个要素,有了主体标记和客体标记,只要有一种方法规定哪个主体可以对哪个客体进行何种操作就可以做到访问控制了。所以内核需要在系统调用中判断相应的操作许可。那么极端的设计就是为每一个系统调用规定一种或几种操作许可,专门在这个系统调用中判断。如此一来,几百个系统调用就要对应几百个甚至更多个操作许可。显然这种设计是不好的。
UNIX的设计是简单而有效的。它对操作进行了合并,只定义出很少的操作许可。它的思路是,客体是用户的数据,主体是代表用户来执行任务的进程。人对数据的基本操作就是两个:读和写。因此,读和写是主体对客体的基本操作。此外,不同的客体还有自己的额外操作。
(1)文件
文件额外的操作是执行。执行的本质是进程替换自身的内存,拿什么替换呢?或是用文件的内容(二进制可执行文件),或是用文件中规定的另一个文件的内容(脚本语言)。进程执行“执行”操作后,进程id没有变,进程父子关系没有变,但进程内容变了。再深究其本质,文件“读”操作是将文件内容置入进程的数据空间,文件“执行”操作是将文件内容置入进程的代码空间和数据空间。所以有的访问控制模型将读和执行等价。
(2)目录
目录在文件系统中就是一种特殊的文件。对目录的读操作就是列出目录的内容;对目录的写操作就是自目录中删除文件/子目录或添加文件/子目录,这也可以看作是修改目录的内容。对目录的执行操作有些难理解,可以用一个词“通过”来概括其含义。比如访问文件“/usr/bin/bash”,内核根据路径名查找文件的过程是这样的:先找到根路径“/”,在“/”下查找“usr”,找到后,在“usr”下查找“bin”,最后在“bin”下查找“bash”。内核依次“通过”了三个目录:“/”、“usr”、“bin”,内核要求发起请求的进程具有这三个目录的执行许可。目录的读操作和执行操作的区别可以用下面这个例子解释。键入命令“ls/usr/bin”,Linux系统启动一个进程运行ls,这个进程需要具有“/”和“usr”的执行许可,具有“bin”的读许可。
关于目录的写操作有一点需要指出,删除一个文件不需要文件本身的任何操作许可,需要的只是对文件所在目录的写操作许可。这一点常常让新用户迷惑,不能写文件,却可以把文件删掉!
(3)管道
(4)命名管道
(5)设备
在Linux内核中,管道是创建于pipefs文件系统上的匿名文件,命名管道和设备是特殊类型的文件。它们都是文件,也就都有执行操作许可,尽管执行对它们没有意义。
(6)IPC(进程间通信)
IPC(进程间通信)是指消息队列(Message Queue)、信号灯(Semaphore)、共享内存(Shared Memory)。IPC在内核中不是作为特殊文件实现的,所以可以做得彻底些,IPC只有两个操作许可:读和写。(www.xing528.com)
(7)socket(套接字)
Linux内核没有对套接字定义操作许可。
(8)key(密钥)
key是密钥,keyring是密钥环。key可以类比文件,和文件一样,key也有属性,比如类型和描述;文件有内容,key的内容是payload(负载),即实际的密钥数据。keyring可以类比目录,目录包含文件和子目录,keyring包含key和子keyring。key上的操作类型比较多,有六个。
1)read——读。对于key是允许读出key的payload(负载,实际的密钥数据);对于keyring是列出keyring上附着的key或子keyring。
2)write——写。对于key是初始化或修改payload;对于keyring是在其下增加或删除key或keyring。
3)search——搜索。search包含两层意思,一是搜索,二是被搜索。进程在某一个keyring 上搜索一个key,一般是通过keyring的id和key的描述进行,那么进程需要具有keyring上的search许可(搜索),还要具有key的search许可(被搜索)。
4)link——链接。将key链接到一个keyring上,既需要keyring的写操作许可,又需要key的link操作许可。
5)view——查看。查看key或keyring的属性,比如类型和描述。
6)setattr——设置属性。修改key的属主、属组、允许位。
通过和文件及目录的对比,我们可以发现,上面的search操作是在目录的执行操作基础上增加文件/子目录的被搜索语义。link操作是为了弥补删除文件或添加文件的链接 [5] ,不需要文件本身的操作许可。view和setattr是增加了对属性的操作控制。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。