关于 SELinux 策略的各种操作

具体策略的查询

关于 SELinux 策略,我们时常要去了解:关于系统中的一个操作,为什么 SELinux 会允许/拒绝;其背后具体的规则是怎样的。此时我们可以使用 sesearch 来查询策略中具体的规则:

1# 探究【主体 A】对【客体 B】是否有【类型 C】的【权限 D】:
2#   sesearch -A -s A -t B -c C -p D
3sesearch -A -s kernel_t -t unconfined_t -p setsched
4sesearch -A -s kernel_t -t unconfined_t -c key -p view

在查出对应的规则后,可以配合 seinfo 进一步了解规则中主、客体的具体信息:

1# 探究某属性包含有哪些类型:
2seinfo -a unconfined_domain_type -x
3# 探究某类型加入了哪些属性:
4seinfo -t kernel_t -x

可用于解析二进制策略的一个交互式工具:

1dispol /etc/selinux/targeted/policy/policy.33 # Fedora/RHEL 上命名为 sedispol

参考资料:

策略转换

日志转策略

1audit2allow -i selinux_log -p ./policy.0110
2audit2allow -i selinux_log -p ./policy.0110 -x # allowx

te 转 cil

自己搞的正则表达式转换,基于 regex101 开发,其正则语法在 Linux 上可通过 perl -pe 直接使用。

1# 普通 allow 规则
2audit2allow ... | perl -pe 's/allow (\S+) (\S+):(\S+) {?(.+?)}?;/(allow $1 $2 ($3 ($4)))/'
3
4# allowxperm 规则
5# 注意:涉及类似“0x7703-0x7706”的要手动改成“(range 0x7703 0x7706)”
6audit2allow ... | perl -pe 's/allowxperm (\S+) (\S+):(\S+) ioctl {?(.+?)}?;/(allowx $1 $2 (ioctl $3 ($4)))/'

cil 转 te

1# allow 单个权限
2perl -pe 's/\(allow (\S+) (\S+) \((\S+) \((\S+)\)\)\)/allow $1 $2:$3 $4;/'
3# allow 多个权限
4perl -pe 's/\(allow (\S+) (\S+) \((\S+) \((.+ .+)\)\)\)/allow $1 $2:$3 {$4};/'
5# allowx 太复杂,不搞了

unconfined_t

该类型/域的语义是“SELinux(几乎)不做任何限制”1,而不是我一开始以为的“没打标签”。

在默认的 targeted 策略2下,由 ssh 连接产生的进程都为 unconfined_t 域;实际上,所有经过网络产生的本地进程都为 unconfined_t 域。根据 Gentoo 的 Wiki ,这么设计的目的是为了简化策略的开发。

参考资料:

二进制策略文件解析

获取 policy.xx 文件:

1# 读取 /etc/selinux/targeted/policy/policy.xx
2# 或者:
3cat /sys/fs/selinux/policy &> ~/policy.xx

解析 policy.xx 文件:

1cd /etc/selinux/targeted/policy/
2checkpolicy -MbF policy.31 -o policy.conf
3vim policy.conf
4
5# 其实上述的 sesearch 可以直接用于搜索 policy.xx 中的策略:
6sesearch --allow -c perf_event -p read,write,... policy.31

解析 CIL 文件

1cp /var/lib/selinux/targeted/active/modules/100/base/cil .
2bunzip2 cil
3vim cil.out
4mv cil.out base.cil
5semodule -i base.cil
6semodule -r base -X 400 # -X: priority

  1. 注意,对于拥有这些类型/域的资源/进程,虽然 SELinux 不做限制,但系统上的其他安全机制还是生效的,例如 DAC,ACL 等。 ↩︎

  2. 根据相关文档 ,这套策略之所以叫“targeted”,就是因为它只限制特定类型的进程,如其中提到的涉及网络监听的服务、需要 root 权限运行的服务等;而对其他的进程它(几乎)是撒手不管的。 ↩︎


SELinux:系统启动时通过用户态配置动态关闭的流程
用户态进程:如何创建,如何销毁