SELinux 教程之 Permissive VS Enforcing
SELinux-hardened 系统通常运行在 Enforcing 模式下,即意味着安全策略决定你是否可以执行你想执行的动作。但是,当你尝试调试 Permissive 的问题时,你需要临时性的关闭 SELinux,你可以选择使 SELinux 运行在 Permissive 模式下,或者整个系统关闭 SELinux,或者对某一类型使用 Permissive 模式。
❤ Permissive 和 Enforcing 之间切换
支持 Permissive 策略的目的是为了即使在 SELinux 系统运行下,那些应用程序依然有权限执行它们想执行的那些动作。在 SELinux 的 Permissive 模式下运行的程序不会被 SELinux 的安全策略保护,而该模式真正的目的是要记录若程序运行在 Enforcing 模式下,它的哪些行为会被拒绝,以便管理员有一个整体的感知。
如果 Kernel 启动的时候支持 SELinux 开发者模式( CONFIG_SECURITY_SELINUX_DEVELOP=y ),则支持在 Enforcing 和 Permissive 模式之间切换。否则,内核默认会以 Enforcing 模式启动,而且不允许切换,这样的 Kernel 被认为是最安全的(即使一个黑客已经获得管理员权限,并且成功的执行了关闭 SELinux 的指令,SELinux 也不会被关闭)。大部分的发布版本都拥有开发者模式。之后,一旦你拥有管理员权限,你可以 rebuild 策略,随心所欲的添加到 privileges 中。处于开发者模式下的Kernel还可以再加固,有一个 boolean 选项 secure_mode_policyload 来禁止切换到 Permissive 模式下,直到你重启系统。
使用命令 getenforce 或者 sestatus ,来查看当前的状态信息。
🔻 使用 setenforce 命令
Enforcing和 Permissive 之间的切换使用 setenforce 命令。该命令支持 4 个参数:Enforcing, Permissive, 1, 0 。
该命令可以临时调整模式。比如,你系统是以 Permissive 模式启动的,你在启动后想调整到 Enforcing 模式,你可以执行 setenforce 1 来启用 Enforcing 模式。
🔻 SELinux 配置文件
当系统启动时从配置文件 /etc/selinux/config 读取参数 SELinux 的默认值。
上图中,系统默认启动 Enforcing 模式。
🔻 使用 enforcing 内核启动选项
另一个决定哪种模式启动的方法是使用 enforcing 启动参数。该参数会覆盖配置文件中的设置,所以即使设置了 SELinux=Enforcing ,然而你启动参数 enforcing=0 ,则系统依然会以 Permissive 模式启动。
🔻 应用程序行为上的不同
当我们观察运行在 Permissive 模式下的程序,SELinux 策略似乎没有起作用,其实不完全是,还是有一点作用的。有一种程序可以称为 SELinux-aware 的应用程序,这种程序知道当前系统的 SELinux 处于哪种模式下,而且在 Permissive 和 Enforcing 两种模式下,程序的行为是不同的。大部分的应用程序在 Permissvie 和 Enforcing 模式下的行为没有什么不同。SELinux-aware 的应用程序通常链接着 libselinux.so 库,可以使用 scanelf 工具查看。
该例子程序在 Permissive 模式下运行会发生错误 ENTRYPOINT FAILED
❤ 标记一类型为 Permissive
之前介绍的都是整体上的切换,系统要么运行在 Enforcing 下,要么运行在 Permissive 下。
幸运地是,SELinux 有一个巧妙的特性,你可以指定一个特定的 domain 运行 Permissive,而其他的仍然运行 Enforcing 模式。你所做的只是告诉 semanage 哪个 domain 你想让它处于 Permissive 模式下。
可以使用 semanage permissive ‐l 查看当前 Permissive 模式下的 domain。
❤ 完全关闭 SELinux
如果你需要完全关闭 SELinux,有两个选择:更新配置文件,使用启动参数。然而,在执行之前,你需要了解关闭后的结果:关闭 SELinux 同时关闭了 context 的产生。意味着,每一个文件的创建和修改(使用替换文件方式的修改,像 vim 之类的)都不会使用 SELinux context 了。如果你之后又以 SELinux 开启的方式启动了,SELinux 将拒绝加载/读取这些文件(它们会被赋予 default_t context (没有扩展属性),只有默认的行为(不是所有的 domain 可以读取和使用))。
因此,当你以 SELinux 关闭的方式启动系统后,你再以 SELinux 开启的方式启动,你需要做整个文件系统的 relabel 操作,而且需要在 Permissive 模式下操作。这之后,你才能再以 Enforcing 模式启动。
🔻 通过启动参数禁用 SELinux
如果 CONFIG_SELINUX_BOOTPARAM 参数启用,你可以使用 selinux=0 来禁用SELinux
🔻 通过配置文件来禁用 SELinux
编辑配置文件 /etc/selinux/config ,设置 SELinux=disabled
❤ 你需要明确的几点
SELinux 有两种模式:Permissive 和 Enforcing。
在 Permissive 模式下,SELinux 不会强制执行它的策略,但是会记录它应该block(或者 grant)的动作的行为。
SELinux-aware 的应用程序,在 Permissive 模式下和 SELinux 完全关闭的情况下,可能有不同的行为。
特定的类型可以指定为 Perssive 模式,而系统中其他的仍以 Enforcing 模式运行。
完全关闭的 SELinux 会导致文件 context 的不同,所以之后恢复时,需要整个文件系统 relabel。
原文链接:https://wiki.gentoo.org/wiki/SELinux/Tutorials/Permissive_versus_enforcing
本文由 看雪翻译小组 ghostway 编译
声明:转载请保留文章的完整性,注明作者、译者及出处, 并附上本文链接。
热 门 阅 读:
在 Linux 上使用 AFL 对 Stagefright 进行模糊测试
......
更多优秀文章点击左下角“关注原文”查看!
看雪论坛:http://bbs.pediy.com/
微信公众号 ID:ikanxue
微博:看雪安全
投稿、合作:www.kanxue.com