接前一篇文章:SELinux零知识学习十二、SELinux策略语言之客体类别和许可(6)
一、SELinux策略语言之客体类别和许可
4. 客体类别许可实例
为了更好地理解许可是如何控制对系统资源的访问的,下面进一步讨论以下两个客体类别和许可:file(见SELinux零知识学习十、SELinux策略语言之客体类别和许可(4))和process(见上一篇文章)。
(1)访问撤销
撤销前面授予的访问权限是创建有关灵活和动态的安全机制非常重要的部分,当策略发生变化或客体安全上下文发生变化时,就需要撤销之前授予的权限。例如:如果某个文件的安全上下文发生了变化,打开那个文件的进程可能不再有相同的访问权,这是由新的策略决定的,系统不得不撤销现有的与变化不一致的访问权。对于复杂的操作系统,确保在所有环境下访问权的撤销是一件困难的任务。
SELinux支持多种环境下的撤销,比标准Linux支持要多得多。例如:每次对文件进行读和写时都会检查文件的访问权,因此,如果文件的安全上下文发生了变化,在下一次读或写时访问权就会被撤销掉。
有很多时候访问权是不会被撤销的,如内存映像的文件访问和未完成的异步I/O请求,在SELinux中很可能还会对撤销支持进程增强,但不可能覆盖全部范围,部分是由于unix应用程序编程接口(API)的性质决定的,部分是由于社区反对对内核子系统做入侵性的改变,还有部分是由于任务本身的复杂性。
通常,通过设计系统不重新标记客体实现,可以避免大多数撤销问题,SELinux提供了许可(relabelfrom和relabelto)来限制这个能力。
(2)文件客体类别许可
文件客体类别有三类许可:直接映像到标准Linux访问控制许可的许可、标准Linux许可的扩展和SELinux特定的许可。下表列出了与文件有关的客体类别许可(即file客体类别许可):
许可 | 描述 |
append | 附加到文件内容(即用O_APPEND标记打开) |
create | 创建一个新文件 |
entrypoint* | 通过域转换,可以用作新域的入口点的文件 |
execmod* | 使被修改过的文件可执行(含有写时复制的意思) |
execute | 执行,与标准Linux下的x访问权限一致 |
execute_no_trans* | 在访问者域转换的执行文件(即没有域转换) |
getattr | 获取文件的属性,如访问模式(例如:stat、部分ioctls) |
ioctl | ioctl(2)系统调用请求 |
link | 创建一个硬链接 |
lock | 设置和清除文件锁 |
mounton | 用作挂载点 |
quotaon | 允许文件用作一个限额数据库 |
read | 读取文件内容,对应标准Linux下的r访问权 |
relabelfrom | 从现有类型改变安全上下文 |
relabelto | 改变新类型的安全上下文 |
rename | 重命名一个硬链接 |
setattr | 改变文件的属性,如访问模式(例如:chmod、部分ioctls) |
swapon | 不赞成使用。其用于将文件当作换页/交换空间 |
unlink | 移除硬链接(删除) |
write | 写入文件内容,对应标准Linux下的w访问权 |
注:上表中execute_no_trans、entrypoint和execmod是特定给file客体类别的(这些许可都加了星号*)。