在这一小节中我们将要介绍一下在FC4中可用的内核客体类.我们的目标是描述客体类并且描述清楚这些系统资源如何被映射到那些客体类上的.
FC4系统有超过40个内核客体类,代表着内核提供的所有资源.客体类的数量阐述了在SELinux中尽可能完整并且精确地代表内核资源的思想.Linux的丰富度和复杂度意味着这个精确的代表也是有必要非常丰富和复杂的.他的复杂度可能看上去是让人非常畏惧的,但是有必要使SELinux在解决Linux面临的安全挑战上具有更加的灵活度.工具和科技使用SELinux的丰富度来提供复杂的安全特性,而不需要用户去了解底层的复杂性.
为了减轻理解,我们将内核客体类分成四个类:文件相关,网络相关,system V IPC 还有其他.
4.3.1 文件相关客体类
第一个客体类的类别是那些与文件和存储在文件系统上的其他资源相关的.这些是对大多数用户来说非常熟悉的.包含在这个类别中的是那些与持久的,磁盘上的文件系统和在内存中的文件系统,例如proc或者是sysfs有关系的客体类.
在类UNIX系统中,一个基本的概念就是"所有的事情都是文件",这个在很多方面是正确的.但是这掩盖了一个事实就是不是所有的文件都是一样的.事实上,在现代类UNIX系统,例如Linux,除了那些用于数据存储的标准文件之外,对于设备和IPC有特殊的文件.SELinux事实上代表了内核的更加细化的试图.下面总结了文件相关的客体类.
客体类 | 描述 |
---|---|
blk_file | 块文件 |
chr_file | 字符文件 |
dir | 目录 |
fd | 文件描述符 |
fifo_file | 有名管道 |
file | 普通文件 |
filesystem | 文件系统 |
lnk_file | 链接文件 |
sock_file | UNIX域套接字 |
客体类file和dir分别代表普通文件和目录.普通文件就是那些存储数据的文件;他是在大多数系统中最常见的.目录是Linux系统上的特殊的文件,他是独一无二的,因为他们包含其他实体.
lnk_file客体类代表着是符号链接.在很多情况下区分常规文件和符号链接来阻止公共攻击是非常重要的.恶意程序和用户可以创建一个符号链接,这将导致一个进程访问或修改那些意图以外的文件。分离的link_file客体类允许编写策略来阻止这一类的攻击.
客体类fifo_file和sock_file代表着被用于IPC的特殊的文件.filo_file客体类代表着管道文件,也被称作有名管道.sock_file客体类控制对于UNIX域套接字有关的文件相关的实体的创建,访问等的能力.
在下一个小节中我们讨论UNIX的域套接字客体类和他们相关的套接字文件.
在Linux中,设备以特殊的文件的形式挂载到/dev/目录.这些文件通过最大和最小设备号来代表快设备和字符设备.字符设备事那些内部的数据能够以byte流的形式进行流入和流出的设备.块设备是那些内部的数据需要更大的块进行传递的设备.chr_file和blk_file分别代表着字符设备和块设备.
在这一类别中的最后两个客体类是文件系统和文件描述符,这两个不是Linux中典型的实体.filesystem客体类代表着一个挂载的文件系统.这个客体类控制着全局的操作,例如挂载或者是查询引用.例如,使用文件系统客体类,我们能够仅允许支持安全上下文存储的文件系统挂载.所有特定类型的文件系统都会在策略中使用fs_use语句获取一个默认的标签,该标签被描述为”对象标签”.当分区以上下文挂载选项挂载的时候,默认类型可能会被重载.
文件描述符是句柄,代表着打开的文件相关的对象,存储在进程中.虽然和文件相关的对象不同,他们代表着内核中的数据结构,将文件描述符看做是底层的文件相关的对象是非常常见的.确实是,标准Linux的访问控制不会单独对文件描述符提供访问控制.这忽略了一个事实就是文件描述符是不同的资源,并且能够在进程之间进行传递,大多数是当一个孩子从他的父母中继承自文件描述符.这种继承不是一直都是理想的,并且好像在很多Linux程序指导中警告减少文件描述符的继承,特别是守护进程.为了解决这个问题和其他一些问题,我们存在一个fd客体类,该客体类代表SELinux中的文件描述符.使用这个客体类,这可能能够阻止在进程之间文件描述符的传递和继承.我们需要知道,访问底层的文件相关的对象的时候,使用一个文件描述符的权限是不充分的.该进程必须还要又对这个底层对象其他相关的权限.
4.3.2 网络相关客体类
网络相关客体类代表着网络资源,例如网络接口,各种类型的套接字和主机.在一个单一的系统上,当前的客体类已经对允许对网络复杂的访问非常充分了.在这个领域更好的较强,例如标签化的网络数据包,可能会在以后发展起来.下面这个表总结了网络和套接字相关的客体类.
客体类 | 描述 |
---|---|
association | IPsec 安全关联 |
key_socket | 协议家庭PF_KEY的套接字,被用于IPsec中的key管理 |
netif | 网络接口(例如,eth0) |
netlink_audit_socket | 控制审计NetLink套接字 |
netlink_dnrt_socket | 控制DECnet路由套接字 |
netlink_firewall_socket | 创建用户空间防火期过滤器netlink套接 |
netlink_ip6fw_socket | 创建用户空间防火期过滤器netlink套接 |
netlink_kobject_uevent_socket | 在用户空间接受内核事件通知netlink套接字 |
netlink_nflog_socket | 接受网络过滤器日志信息netlink套接字 |
netlink_route_socket | 控制和管理网络资源例如路由表和IP地址的netlink套接字 |
netlink_selinux_socket | 接受策略加载,强制策略触发和AVC缓存清空通知的netlink套接字 |
netlink_tcpdiag_socket | 监视TCP连接netlink套接字 |
netlink_socket | 所有其他的netlink套接字 |
netlink_xfrm_socket | 获取,维持和设置IPsec参数netlink套接字 |
node | 被一个IP地址和一个范围的地址代表的主机 |
packet_socket | 协议在用户空间实现的原始套接字 |
rawip_socket | 既不是TCP也不是UDP的IP套接字 |
socket | 所有其他的套接字 |
tcp_socket | TCP套接字 |
udp_socket | UDP套接字 |
unix_dgram_socket | 在本地机器上的IPC 数据报套接字 |
unix_stream_socket | 在本地机器上的IPC流套接字 |
node, netif, packet_socket, rawip_socket, tcp_socket, udp_socket,和socket客体类控制对网络的访问.netif客体类代表网络接口.每一个命名的网络接口都被一个netif客体类的实例所代表.在网络上的远程主机,被IP地址和一个范围内的地址被标示,被node客体类所代表.通过使用node客体类,我们能够限制主机对网络上的哪一个进程交互.上面列出的各种各样的客体类代表着由协议分出的各种各样的套接字.成功发送或接收网络数据需要与netif,node和socket客体类的实例相关的权限.
标准网络套接字通过协议被分开(在创建的时候,被socket(2)系统调用决定).不同的套接字客体类允许我们限制一个应用能否发送或者是接收某个类型的数据包.在限制程序发送原始数据包的时候是尤为有用的.客体类tcp_socket和udp_socket客体类分别代表着TCP和UDP套接字.rawip_socket代表着发送原始IP数据报的套接字,packet_socket客体类代表着发送任何类型原始数据报的套接字.所有其他的套接字被socket客体类代表.
使用IPsec的交流有额外的被客体类association和key_socket代表的资源.一个IPsec安全联系是一个连接,他承担着所在的通路的安全服务.association客体类代表着IPsec连接.IPsec需要通过一个key管理套接字来进行keys的管理,他是由key_socket客体类代表的.
在Linux盒子中的本地交流能够使用UNIX域套接字完成(PF_UNIX).这些套接字通常被用来本地IPCs.面向连接的套接字,也被称为流套接字,是被unix_stream_socket客体类代表的.数据报套接字是被unix_dgram_socket客体类代表的.UNIX的域套接字在一个文件系统中能够和一个特殊的文件关联起来来允许其他应用很容易连上套接字.这个文件是被sock_file客体类代表,这个sock_file是前面描述的那个文件相关的客体类.
套接字的最后一个组是Netlink套接字.这些套接字刚开始被设计来在Linux中提供一个标准的配置网络的方法.他们现在被用来在内核和用户空间之间进行信息的交流.有很多基于协议类型的代表Netlink套接字的客体类,并且常用的netlink_socket是用于任何其他没有特定客体类的协议的.
4.3.3 系统V IPC客体类
IPC相关的客体类代表着system V IPC资源.msgq和msg客体类代表着信息队列和信息队列中的信息.sem客体类代表着信号量.shm客体类代表着共享内存段.注意访问关于所有的system V IPC资源的全局系统信息是由系统类上的权限控制的.
下面是IPC相关的客体类
客体类 | 描述 |
---|---|
ipc | 不再使用 |
msg | 在信息队列中的信息 |
msgq | 信息队列 |
sem | 信号量 |
shm | 共享内存段 |
4.3.4 其他客体类
下面的表列出了那些不容易列入其他类别当中的剩下的客体类.
客体类 | 描述 |
---|---|
capability | Privileges that are implemented as capabilities in Linux |
process | 在SELinux中也是客体的进行 |
security | 内核中的SELinux安全服务器 |
system | 作为一个整体的系统. |
capability客体类代表着在标准Linux访问控制模型中的进程的能力.这个客体类允许SELinux控制
授予"root"进程的能力.这些能力的例子包括重写DAC的能力(permission模式)和发送原声网络数据报的能力.这个客体类和他对应的权限允许控制一个进程能否使用已经被标准Linux授权的能力.
剩下的两个客体类,security和system,分别代表着对SELinux安保全服务器和系统的特殊文件的访问.他们是独一无二的,因为仅仅有一个他们客体类的实例,反射出仅仅有一个安全服务器和系统.