您的位置:

分析SELinux的安全策略: sepolicy

一、未正确加载SELinux Policy (sepolicy)

SELinux是Linux的一个强制访问控制(MAC)系统。然而,有时候管理员会禁用SELinux机制,因为这需要更多的系统配置和管理工作以确保可靠性和安全性。当系统未正确加载SELinux Policy时,会导致各种问题,尤其是在运行需要特权(如root)用户的应用程序时。在这种情况下,应用程序可能会发现它无法访问必要的资源,例如文件、设备以及其他系统对象。

下面给出一个示例:

[root@localhost ~]# id
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[root@localhost ~]# getenforce
Permissive

上述示例中的"Permissive"意味着SELinux并没有实施策略。 在这种情况下,可以使用以下命令复制默认的SELinux策略并加载它:

[root@localhost ~]# cp -p /etc/selinux/targeted/policy/policy.24 /etc/selinux/targeted/policy/policy.24_ORG
[root@localhost ~]# setenforce 1

使用"setenforce 1"可以重新实施SELinux政策。

二、分析SELinux Policy (sepolicy) 中的文件结构

在SELinux policy文件中,规则采用不同的格式来表示。 这些规则是由文件 (type), 别名 (alias), 能力 (capability), 内核对象 (class), 和动作 (permission)组成的。其中,类型(type)是策略中最重要的组成部分之一。它们定义了一个对象的安全上下文。

类型(type)关系的例子:

# 我们需要保护foo.conf的以下几个属性
# - 文件内容 (content)
# - 文件属性 (attributes)
# - 文件目录 (directory)
# - 文件执行 (execute)
# - 文件写入 (write)

# SELinux 文件类型是 “httpd_sys_content_t”
type httpd_sys_content_t;
# 定义httpd_sys_content_t规则之间的关系
allow httpd_sys_content_t content_t:file { read getattr open };
allow httpd_sys_content_t attributes_t:file { getattr };
allow httpd_sys_content_t directory_t:dir { search read getattr open };
allow httpd_sys_content_t exec_t:file { execute };
allow httpd_sys_content_t file_t:file { read create write getattr setattr append unlink link rename };

类型(type)用于定义进程的安全上下文。 它还定义了允许进程访问哪些对象;都是哪些操作。这里展示了一个更具体的类型定义,包括了若干个SELinux规则:

# SELinux 文件类型是 “httpd_sys_script_exec_t”
type httpd_sys_script_exec_t;
# 执行权限
type_transition httpd_t httpd_sys_exec_t : httpd_sys_script_exec_t;

# 定义 “httpd_sys_script_exec_t” 对象允许操作的文件类型。
# httpd_sys_script_exec_t类型可以读取系统包含PHP脚本程序
allow httpd_sys_script_exec_t httpd_sys_content_t:file { execute_no_trans };
allow httpd_sys_script_exec_t usr_t:file execute;

三、测试并调试SELinux Policy (sepolicy) 文件

SELinux Policy通常由多个模块组成,每个模块代表一组规则或指令。 在Linux中,我们可以使用“semodule”命令创建,安装和卸载这些模块。 但在该模块安装之前,建议使用SETools库中的semodule_package命令在离线系统上构建模块。

yum install policycoreutils-python-utils
semodule_package -o example.pp -m example.te
semodule -i example.pp

一旦成功安装SELinux Policy,我们可以使用“semanage”工具查看并更改策略信息。以下是一些示例命令:

# 显示指定类型的SELinux规则信息
semanage fcontext -l -t httpd_sys_content_t | more

# 获取SELinux用户的默认上下文
semanage login -l

# 设定默认上下文
semanage login -m -s user_u test

# 设定本地启动策略
semanage boolean -l | grep audit
semanage boolean -D enableaudit off
semanage boolean -D enableaudit on

四、调试SELinux Policy (sepolicy) 文件

在调试SELinux Policy文件时,有两个主要的方法:audit2allow和audit2why。

audit2allow 命令可以处理selinux audit日志,它分析日志文件并提供用于修复访问拒绝问题的 SELinux权限修补程序。下面给出一个示例:

# 查看/目录下是否存在文件 touch
[root@localhost /]# touch /temp/hello.txt

# /var/log/audit/audit.log现在肯定现实的是“type = AVC “和“denied”的日志消息
[root@localhost /]# ausearch -m avc -ts recent | audit2allow

audit2why 命令用于分析SELinux内核日志,以确定哪些规则阻止 SELinux 在处理特定动作时工作。以下是一个示例:

audit2why < /var/log/audit/audit.log

五、总结

本文讨论了在未正确加载SELinux Policy时会面临哪些问题,以及分析SELinux Policy文件时的文件结构和配置方法。此外,我们还介绍了如何测试和调试你的SELinux策略。谷粒提醒,必须正确设置SELinux Policy文件,以保护系统免受来自外部攻击的威胁。