SELinux 教程之 Permissive VS Enforcing

SELinux 教程之 Permissive VS Enforcing_第1张图片

本文首发:看雪论坛 http://bbs.pediy.com/thread-215552.htm

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,来查看当前的状态信息。

SELinux 教程之 Permissive VS Enforcing_第2张图片

使用 setenforce 命令

Enforcing和 Permissive 之间的切换使用setenforce命令。该命令支持 4 个参数:Enforcing,Permissive, 1, 0。


该命令可以临时调整模式。比如,你系统是以 Permissive 模式启动的,你在启动后想调整到 Enforcing 模式,你可以执行setenforce 1来启用 Enforcing 模式。

SELinux 配置文件

当系统启动时从配置文件/etc/selinux/config读取参数SELinux的默认值。

SELinux 教程之 Permissive VS Enforcing_第3张图片

上图中,系统默认启动 Enforcing 模式。

使用 enforcing 内核启动选项

另一个决定哪种模式启动的方法是使用enforcing启动参数。该参数会覆盖配置文件中的设置,所以即使设置了SELinux=Enforcing,然而你启动参数enforcing=0,则系统依然会以 Permissive 模式启动。

SELinux 教程之 Permissive VS Enforcing_第4张图片

应用程序行为上的不同

当我们观察运行在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 教程之 Permissive VS Enforcing_第5张图片

通过配置文件来禁用 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 编译

声明:转载请保留文章的完整性,注明作者、译者及出处, 并附上原文链接。

你可能感兴趣的:(SELinux 教程之 Permissive VS Enforcing)