通过上一篇文章我们知道,TE(Type Enforcement,类型强制)的 allow 语句中主要包括主体(source)、对象(target)、类别(class)和权限(permissions),这里我们就来看一下其中的参数信息。
一、参数详解
1、主体
在 SELinux 的上下文中,主体类型 source 是指发起访问请求的安全上下文或主体(Subject)。主体通常指的是进程、用户或者其他需要访问系统资源的实体。
在 SELinux 策略中,主体类型(source_type)是指发起访问请求的进程所属的安全类型。在 SELinux 策略文件中,source_type 通常是定义好的类型,它描述了进程的性质或功能。例如,在 Android 系统中,不同的应用和服务会运行在不同的安全上下文中,每个上下文对应着不同的类型。
在实际应用中,source 的类型会根据具体的应用场景和系统的安全需求来设定。为了确保系统的安全性,通常会对不同类型的主体设置严格的访问控制规则。
2、客体
在 SELinux 中,对象类型(target)通常指的是客体(如文件、目录、套接字等)的安全标签。与主体类型类似,一个客体也可以具有多个类型。这可以通过在安全上下文中指定多个类型来实现。
具体来说,一个客体可以在其安全上下文中被赋予多个类型,这些类型之间用逗号分隔。这意味着一个客体可以同时属于多个类型,从而可以被不同类型的主体访问。
allow httpd var_t:file read;
allow httpd httpd_sys_content_t:file read;
这里同一主体(httpd)同时允许访问不同客体 var_t 和 httpd_sys_content_t。也可以写成如下方式:
allow httpd {var_t, httpd_sys_content_t}:file read;
httpd 是主体类型,表示发起访问的进程。{var_t, httpd_sys_content_t} 表示一组对象类型,即客体可以是 var_t 类型或 httpd_sys_content_t 类型。read 表示允许读取操作。这种方式使得你能够在一条语句中定义针对多个对象类型的规则,提高了配置文件的可读性和简洁性。
多类别
上面的代码列出了多个对象时的简化写法,那如果同时又有多个对象类型时是否可以简化?
allow httpd {var_t, httpd_sys_content_t}:{file, dir} read;
httpd 是主体类型,表示发起访问的进程。{var_t, httpd_sys_content_t} 表示一组对象类型,即客体可以是 var_t 类型或 httpd_sys_content_t 类型。{file, dir} 表示一组对象类别,即客体可以是文件 (file) 或目录 (dir)。read 表示允许读取操作。这段代码等价于:
allow httpd var_t:file read;
allow httpd var_t:dir read;
allow httpd httpd_sys_content_t:file read;
allow httpd httpd_sys_content_t:dir read;
通过这种方式,你可以更简洁地定义针对多个对象类型和多个对象类别的规则,提高 SELinux 策略文件的可读性和简洁性。
3、类别
上面 :file 就是一个 Class。简单说就是将某些被访问对象归为一种 Class,比如说被访问的是文件,Class 一般就是 file;如果是目录,Class 就是 dir;如果是 socket,Class 就是 socket 等等。Class 是 AOSP 内定义好的,一般不需要自定义。
源码位置:/system/sepolicy/private/security_classes
#
# Define the security object classes
#
# Classes marked as userspace are classes
# for userspace object managers
class security
class process
class system
class capability
# file-related classes
class filesystem
class file
……
security_classes 中的定义格式如上代码所示,我们主要来看一下系统中主要设置了哪些 Class。
通用类别
Class名称 | 含义 | 作用 |
---|---|---|
security | 安全相关的类别 | 用于定义与安全相关的操作 |
process | 进程类别 | 用于定义对进程的访问控制 |
system | 系统级别的类别 | 通常涉及系统级别的操作 |
capability | 权限类别 | 用于定义与 Linux capabilities 相关的操作 |
文件相关类别
Class名称 | 含义 | 作用 |
---|---|---|
filesystem | 文件系统类别 | 用于定义对整个文件系统的访问控制 |
file | 文件类别 | 用于定义对普通文件的访问控制 |
anon_inode | 匿名 inode 类别 | 用于定义对匿名 inode 的访问控制 |
dir | 目录类别 | 用于定义对目录的访问控制 |
fd | 文件描述符类别 | 用于定义对文件描述符的操作 |
lnk_file | 符号链接类别 | 用于定义对符号链接的访问控制 |
chr_file | 字符设备文件类别 | 用于定义对字符设备文件的访问控制 |
blk_file | 块设备文件类别 | 用于定义对块设备文件的访问控制 |
sock_file | 套接字文件类别 | 用于定义对套接字文件的访问控制 |
fifo_file | 命名管道文件类别 | 用于定义对命名管道文件的访问控制 |
网络相关类别
Class名称 | 含义 | 作用 |
---|---|---|
socket | 套接字类别 | 用于定义对套接字的一般操作 |
tcp_socket | TCP 套接字类别 | 专门用于 TCP 协议的套接字操作 |
udp_socket | UDP 套接字类别 | 专门用于 TCP 协议的套接字操作 |
rawip_socket | 原始 IP 套接字类别 | 用于原始 IP 数据包的套接字操作 |
node | 网络节点类别 | 用于定义对网络节点的操作 |
netif | 网络接口类别 | 用于定义对网络接口的操作 |
netlink_socket | Netlink 套接字类别 | 用于定义对 Netlink 套接字的操作 |
packet_socket | 数据包套接字类别 | 用于定义对数据包套接字的操作 |
key_socket | 密钥套接字类别 | 用于处理密钥交换协议相关的套接字操作 |
unix_stream_socket | Unix 流套接字类别 | 用于处理 Unix 流套接字 |
unix_dgram_socket | Unix 数据报套接字类别 | 用于处理 Unix 数据报套接字 |
SysV IPC 相关类别
Class名称 | 含义 | 作用 |
---|---|---|
sem | 信号量类别 | 用于定义对信号量的访问控制 |
msg | 消息队列类别 | 用于定义对消息队列的访问控制 |
msgq | 消息队列类别 | 与 msg 类似,用于消息队列 |
shm | 共享内存类别 | 用于定义对共享内存段的访问控制 |
ipc | IPC 类别 | 用于定义对 IPC(进程间通信)资源的一般操作 |
扩展Netlink套接字类别
Class名称 | 含义 | 作用 |
---|---|---|
netlink_route_socket | 路由 Netlink 套接字类别 | 用于路由相关的 Netlink 操作 |
netlink_tcpdiag_socket | TCP 诊断 Netlink 套接字类别 | 用于 TCP 诊断相关的 Netlink 操作 |
netlink_nflog_socket | 网络过滤日志 Netlink 套接字类别 | 用于网络过滤日志相关的 Netlink 操作 |
netlink_xfrm_socket | XFRM Netlink 套接字类别 | 用于 XFRM(IPsec)相关的 Netlink 操作 |
netlink_selinux_socket | SELinux Netlink 套接字类别 | 用于 SELinux 相关的 Netlink 操作 |
netlink_audit_socket | 审计 Netlink 套接字类别 | 用于审计相关的 Netlink 操作 |
netlink_dnrt_socket | DNRT Netlink 套接字类别 | 用于 DNRT(动态路由跟踪)相关的 Netlink 操作 |
netlink_kobject_uevent_socket | 内核事件 Netlink 套接字类别 | 用于 DNRT(动态路由跟踪)相关的 Netlink 操作 |
Netlink套接字类别
Class名称 | 含义 | 作用 |
---|---|---|
netlink_iscsi_socket | iSCSI Netlink 套接字类别 | 用于处理 iSCSI 相关的 Netlink 操作 |
netlink_fib_lookup_socket | FIB 查找 Netlink 套接字类别 | 用于处理 FIB查找相关的 Netlink 操作 |
netlink_connector_socket | Connector Netlink 套接字类别 | 用于处理 Connector 相关的 Netlink 操作 |
netlink_netfilter_socket | Netfilter Netlink 套接字类别 | 用于处理 Netfilter 相关的 Netlink 操作 |
netlink_generic_socket | 通用 Netlink 套接字类别 | 用于处理通用 Netlink 操作 |
netlink_scsitransport_socket | SCSI 传输 Netlink 套接字类别 | 用于处理 SCSI 传输相关的 Netlink 操作 |
netlink_rdma_socket | RDMA Netlink 套接字类别 | 用于处理 RDMA(Remote Direct Memory Access)相关的 Netlink 操作 |
netlink_crypto_socket | 加密 Netlink 套接字类别 | 用于处理加密相关的 Netlink 操作 |
socket套接字类别
Class名称 | 含义 |
---|---|
appletalk_socket | AppleTalk 套接字类别 |
tun_socket | TUN/TAP 套接字类别 |
sctp_socket | SCTP 套接字类别 |
icmp_socket | ICMP 套接字类别 |
ax25_socket | AX.25 套接字类别 |
ipx_socket | IPX 套接字类别 |
netrom_socket | NET/ROM 套接字类别 |
atmpvc_socket | ATM PVC 套接字类别 |
x25_socket | X.25 套接字类别 |
rose_socket | ROSE 套接字类别 |
decnet_socket | DECnet 套接字类别 |
atmsvc_socket | ATM SVC 套接字类别 |
rds_socket | RDS 套接字类别 |
irda_socket | IrDA 套接字类别 |
pppox_socket | PPPoX 套接字类别 |
llc_socket | LLC 套接字类别 |
can_socket | CAN 套接字类别 |
tipc_socket | TIPC 套接字类别 |
bluetooth_socket | 蓝牙套接字类别 |
iucv_socket | IUCV 套接字类别 |
rxrpc_socket | RXRPC 套接字类别 |
isdn_socket | ISDN 套接字类别 |
phonet_socket | Phonet 套接字类别 |
ieee802154_socket | IEEE 802.15.4 套接字类别。 |
caif_socket | CAIF 套接字类别 |
alg_socket | ALG 套接字类别 |
nfc_socket | NFC 套接字类别 |
vsock_socket | 虚拟套接字类别 |
kcm_socket | KCM 套接字类别 |
qipcrtr_socket | QIPCRTR 套接字类别 |
smc_socket | SMC 套接字类别 |
xdp_socket | XDP 套接字类别 |
这些类别主要涉及各种不同的网络协议和特定用途的套接字操作。通过 extended_socket_class 策略能力,可以更细粒度地控制不同类型的套接字行为。
其他类别
Class名称 | 含义 |
---|---|
association | IPSec安全关联类别 |
packet | 数据包类别 |
key | 密钥类别 |
dccp_socket | DCCP 套接字类别 |
memprotect | 内存保护类别 |
peer | 网络对等体类别 |
capability2 | 扩展权限类别 |
kernel_service | 内核服务类别 |
binder | Binder 类别 |
infiniband_pkey | InfiniBand PKey 类别 |
infiniband_endport | InfiniBand 端口类别 |
cap_userns | 用户命名空间权限类别 |
cap2_userns | 扩展用户命名空间权限类别 |
process2 | 扩展进程类别 |
bpf | BPF 类别 |
perf_event | 性能事件类别 |
lockdown | 锁定类别 |
property_service | 属性服务类别(用户空间) |
service_manager | 服务管理器类别(用户空间) |
hwservice_manager | 硬件服务管理器类别(用户空间) |
keystore_key | 密钥存储键类别(用户空间) |
keystore2 | 密钥存储 2.0 类别(用户空间) |
keystore2_key | 密钥存储 2.0 键类别(用户空间) |
diced | Diced 类别(用户空间) |
drmservice | DRM 服务类别(用户空间) |
这些类别定义了 SELinux 中不同类型的资源,并为后续的访问控制规则提供了基础。通过这些类别,可以实现细粒度的访问控制,从而增强系统的安全性。
标签:httpd,Netlink,file,SELinux,用于,allow,类别,Android,接字 From: https://blog.csdn.net/c19344881x/article/details/142460490