具体策略的查询
关于 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
参考资料:
-
更多工具:
-
HowTos/SELinux , CentOS Wiki
策略转换
日志转策略
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
,这么设计的目的是为了简化策略的开发。
参考资料:
- SELinux Tutorials: What is this unconfined thingie and tell me about attributes , Gentoo Wiki
- 3.2. Unconfined Processes in SELinux User’s and Administrator’s Guide for RHEL 7
二进制策略文件解析
获取 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