Linux sesearch 命令介绍
sesearch(SELinux policy query tool),用于在 SELinux 策略中搜索特定的规则。sesearch 支持加载四种格式的 SELinux 策略:
- source:一个包含 12 到 21 版本的策略源代码的文本文件。这个文件通常叫做 policy.conf。
- binary:一个包含 15 到 21 版本的单一内核二进制策略的文件。这个文件通常根据版本命名,例如 policy.20。
- modular:一个包含可加载策略模块的策略包的列表。第一个列出的模块必须是一个基础模块。
- policy list:一个包含加载策略所需的所有信息的文本文件,通常由 SETools 图形化工具导出。
如果没有提供策略文件,sesearch 将搜索系统默认的策略:首先检查源策略,然后检查与运行内核的首选版本匹配的二进制策略,最后检查找到的最高版本。在后一种情况下,策略将降级以匹配运行的系统。如果没有找到策略,sesearch 将打印一个错误信息并退出。
Linux sesearch 命令适用的 Linux 版本
sesearch 命令适用于大多数 Linux 发行版,只要它们支持 SELinux 功能。如果您的系统没有安装 sesearch 命令,您可以根据您的发行版使用以下命令来安装它:
# 基于 apt 的发行版(如 Debian、Ubuntu、Raspbian、Kali Linux 等):
sudo apt-get install setools
# 基于 yum 的发行版(如 RedHat,CentOS 7 等):
sudo yum install setools-console
# 基于 dnf 的发行版(如 Fedora,CentOS 8 等):
sudo dnf install setools-console
# 基于 apk 的发行版(如 Alpine Linux):
sudo apk add --update setools
# 基于 pacman 的发行版(如 Arch Linux):
sudo pacman -S setools
# 基于 zypper 的发行版(如 openSUSE):
sudo zypper in setools
# 基于 pkg 的 FreeBSD 发行版
sudo pkg install setools
# 基于 pkg 的 OS X/macOS 发行版:
brew install setools
Linux sesearch 命令的基本语法
sesearch 命令的基本语法如下:
sesearch [OPTIONS] RULE_TYPE [RULE_TYPE ...] [EXPRESSION] [POLICY ...]
其中,OPTIONS 是一些可选的参数,用于控制 sesearch 的行为;RULE_TYPE 是要搜索的规则的类型,至少要指定一个;EXPRESSION 是一个包含规则字段值的表达式,用于过滤搜索结果;POLICY 是要搜索的策略文件,可以是多个。
Linux sesearch 命令的常用选项或参数说明
sesearch 命令的常用选项或参数如下表所示,按照字母顺序排序:
选项 | 参数 | 说明 |
---|---|---|
-A | 无 | 搜索 allow 规则 |
--all | 无 | 搜索所有规则类型 |
-b | NAME | 搜索包含 NAME 的条件表达式的条件规则 |
-c | NAME | 搜索对象类为 NAME 的规则 |
--dontaudit | 无 | 搜索 dontaudit 规则 |
--neverallow | 无 | 搜索 neverallow 规则 |
-p | P1 [,P2,...] | 搜索至少包含一个指定权限的规则 |
-r | 无 | 以原始格式输出规则 |
--role_allow | 无 | 搜索 role allow 规则 |
--role_source | NAME | 搜索源角色为 NAME 的规则 |
--role_target | NAME | 搜索目标角色为 NAME 的规则 |
-s | NAME | 搜索源类型/属性为 NAME 的规则 |
-t | NAME | 搜索目标类型/属性为 NAME 的规则 |
-T | 无 | 搜索 type_transition, type_member, 和 type_change 规则 |
--range_trans | 无 | 搜索 range_transition 规则 |
--role_trans | 无 | 搜索 role_transition 规则 |
Linux sesearch 命令实例详解
以下是一些 sesearch 命令的常见实例,结合最常搜索的关键词来作为标题。
实例1:搜索所有的 allow 规则
如果我们想要查看 SELinux 策略中的所有 allow 规则,我们可以使用 -A 选项,如下所示:
[linux@bashcommandnotfound.cn ~]$ sesearch -A
Found 0 semantic av rules:
这里我们没有找到任何 allow 规则,这是因为我们的系统使用的是二进制策略,而 sesearch 默认搜索的是源策略。为了解决这个问题,我们可以使用 -b 选项来指定二进制策略的路径,如下所示:
[linux@bashcommandnotfound.cn ~]$ sesearch -A -b /etc/selinux/targeted/policy/policy.31
实例2:搜索特定的 allow 规则
如果我们想要查看 SELinux 策略中的特定的 allow 规则,我们可以使用 -s、-t、-c 和 -p 选项来指定源类型、目标类型、对象类和权限,如下所示:
[linux@bashcommandnotfound.cn ~]$ sesearch -A -s httpd_t -t user_home_t -c file -p read
Found 1 semantic av rules:
allow httpd_t user_home_type : file { ioctl read getattr lock open } ;
这里我们找到了一个 allow 规则,表示 httpd_t 类型的进程可以对 user_home_type 类型的文件执行 ioctl、read、getattr、lock 和 open 操作。
实例3:搜索所有的 type_transition 规则
如果我们想要查看 SELinux 策略中的所有 type_transition 规则,我们可以使用 -T 选项,如下所示:
[linux@bashcommandnotfound.cn ~]$ sesearch -T
Found 0 semantic te rules:
这里我们没有找到任何 type_transition 规则,这是因为我们的系统使用的是二进制策略,而 sesearch 默认搜索的是源策略。为了解决这个问题,我们可以使用 -b 选项来指定二进制策略的路径,如下所示:
[linux@bashcommandnotfound.cn ~]$ sesearch -T -b /etc/selinux/targeted/policy/policy.31
Found 10 semantic te rules:
type_transition initrc_t initrc_tmp_t : file initrc_tmp_t;
type_transition initrc_t initrc_var_run_t : file initrc_var_run_t;
type_transition initrc_t var_lock_t : file var_lock_t;
type_transition initrc_t var_run_t : file var_run_t;
type_transition initrc_t devpts_t : chr_file devpts_t;
type_transition initrc_t devtty_t : chr_file devtty_t;
type_transition initrc_t device_t : blk_file device_t;
type_transition initrc_t device_t : chr_file device_t;
type_transition initrc_t device_t : dir device_t;
type_transition initrc_t device_t : lnk_file device_t;
这里我们找到了 10 个 type_transition 规则,表示 initrc_t 类型的进程在创建或访问不同类型的文件或设备时,会触发类型转换。
实例4:搜索特定的 type_transition 规则
如果我们想要查看 SELinux 策略中的特定的 type_transition 规则,我们可以使用 -s、-t、-c 和 --default 选项来指定源类型、目标类型、对象类和默认类型,如下所示:
[linux@bashcommandnotfound.cn ~]$ sesearch -T -s initrc_t -t device_t -c chr_file --default device_t
Found 1 semantic te rules:
type_transition initrc_t device_t : chr_file device_t;
这里我们找到了一个 type_transition 规则,表示 initrc_t 类型的进程在访问 device_t 类型的字符设备时,会转换为 device_t 类型。
实例5:搜索所有的 role_allow 规则
如果我们想要查看 SELinux 策略中的所有 role_allow 规则,我们可以使用 --role_allow 选项,如下所示:
[linux@bashcommandnotfound.cn ~]$ sesearch --role_allow
Found 0 semantic role allow rules:
这里我们没有找到任何 role_allow 规则,这是因为我们的系统使用的是二进制策略,而 sesearch 默认搜索的是源策略。为了解决这个问题,我们可以使用 -b 选项来指定二进制策略的路径,如下所示:
[linux@bashcommandnotfound.cn ~]$ sesearch --role_allow -b /etc/selinux/targeted/policy/policy.31
Found 3 semantic role allow rules:
role allow system_r system_r;
role allow system_r object_r;
role allow system_r staff_r;
这里我们找到了 3 个 role_allow 规则,表示 system_r 角色可以访问 system_r、object_r 和 staff_r 角色。
实例6:搜索特定的 role_allow 规则
如果我们想要查看 SELinux 策略中的特定的 role_allow 规则,我们可以使用 --role_source 和 --role_target 选项来指定源角色和目标角色,如下所示:
[linux@bashcommandnotfound.cn ~]$ sesearch --role_allow --role_source system_r --role_target staff_r
Found 1 semantic role allow rules:
role allow system_r staff_r;
这里我们找到了一个 role_allow 规则,表示 system_r 角色可以访问 staff_r 角色。
实例7:搜索所有的 neverallow 规则
如果我们想要查看 SELinux 策略中的所有 neverallow 规则,我们可以使用 --neverallow 选项,如下所示:
[linux@bashcommandnotfound.cn ~]$ sesearch --neverallow
Found 0 semantic av rules:
这里我们没有找到任何 neverallow 规则,这是因为我们的系统使用的是二进制策略,而 sesearch 默认搜索的是源策略。为了解决这个问题,我们可以使用 -b 选项来指定二进制策略的路径,如下所示:
[linux@bashcommandnotfound.cn ~]$ sesearch --neverallow -b /etc/selinux/targeted/policy/policy.31
Found 2 semantic av rules:
neverallow { domain -initrc_t } initrc_t : process transition ;
neverallow { domain -initrc_t } initrc_t : process { dyntransition siginh noatsecure rlimitinh } ;
这里我们找到了 2 个 neverallow 规则,表示除了 initrc_t 类型之外的任何类型的进程都不能转换为 initrc_t 类型,也不能继承或修改 initrc_t 类型进程的一些属性。
实例8:搜索特定的 neverallow 规则
如果我们想要查看 SELinux 策略中的特定的 neverallow 规则,我们可以使用 -s、-t、-c 和 -p 选项来指定源类型、目标类型、对象类和权限,如下所示:
[linux@bashcommandnotfound.cn ~]$ sesearch --neverallow -s httpd_t -t user_home_t -c file -p write
Found 1 semantic av rules:
neverallow httpd_t user_home_type : file { write create setattr unlink link rename } ;
这里我们找到了一个 neverallow 规则,表示 httpd_t 类型的进程不能对 user_home_type 类型的文件执行 write、create、setattr、unlink、link 和 rename 操作。
实例9:搜索所有的 auditallow 规则
如果我们想要查看 SELinux 策略中的所有 auditallow 规则,我们可以使用 --auditallow 选项,如下所示:
[linux@bashcommandnotfound.cn ~]$ sesearch --auditallow
Found 0 semantic av rules:
这里我们没有找到任何 auditallow 规则,这是因为我们的系统使用的是二进制策略,而 sesearch 默认搜索的是源策略。为了解决这个问题,我们可以使用 -b 选项来指定二进制策略的路径,如下所示:
[linux@bashcommandnotfound.cn ~]$ sesearch --auditallow -b /etc/selinux/targeted/policy/policy.31
Found 1 semantic av rules:
auditallow initrc_t initrc_tmp_t : file { write create setattr unlink link rename } ;
这里我们找到了一个 auditallow 规则,表示 initrc_t 类型的进程对 initrc_tmp_t 类型的文件执行 write、create、setattr、unlink、link 和 rename 操作时,会被记录到审计日志中。
实例10:搜索特定的 auditallow 规则
如果我们想要查看 SELinux 策略中的特定的 auditallow 规则,我们可以使用 -s、-t、-c 和 -p 选项来指定源类型、目标类型、对象类和权限,如下所示:
[linux@bashcommandnotfound.cn ~]$ sesearch --auditallow -s initrc_t -t initrc_tmp_t -c file -p write
Found 1 semantic av rules:
auditallow initrc_t initrc_tmp_t : file { write create setattr unlink link rename } ;
这里我们找到了一个 auditallow 规则,表示 initrc_t 类型的进程对 initrc_tmp_t 类型的文件执行 write、create、setattr、unlink、link 和 rename 操作时,会被记录到审计日志中。
Linux sesearch 命令的注意事项
在使用 sesearch 命令时,有以下几点需要注意:
- sesearch 命令默认搜索的是源策略,如果您的系统使用的是二进制策略,您需要使用 -b 选项来指定二进制策略的路径。
- sesearch 命令的输出可能会根据您的系统和策略的不同而有所差异,您可以使用 -r 选项来以原始格式输出规则,以便于比较和分析。
- sesearch 命令的搜索结果是基于逻辑的,而不是基于实际的策略决策。这意味着 sesearch 命令可能会显示一些在实际情况下不会生效的规则,例如被 neverallow 规则覆盖的 allow 规则,或者被布尔值关闭的条件规则。您可以使用 --cond 来显示条件规则的状态,或者使用 --enabled 来只显示生效的规则。
- 如果您在使用 sesearch 命令时遇到 bash: sesearch: command not found 的错误,您需要根据您的发行版使用相应的命令来安装 sesearch 命令,具体的安装方法已经在上面介绍过了。
评论区