本文首发:看雪论坛 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,来查看当前的状态信息。
使用 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 编译
声明:转载请保留文章的完整性,注明作者、译者及出处, 并附上原文链接。