查看原文
其他

SELinux 教程之 Permissive VS Enforcing

2017-03-17 ghostway 看雪学院

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 编译

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


 热 门 阅 读:



《走进企业看安全.易宝支付》第9站 开始报名!

对 Samsung S6 的 SBOOT 逆向工程(一)

MySQL Out-of-Band 注入攻击

安卓勒索软件的发展趋势(一)

在 Linux 上使用 AFL 对 Stagefright 进行模糊测试

......

更多优秀文章点击左下角“关注原文”查看!


看雪论坛:http://bbs.pediy.com/

微信公众号 ID:ikanxue

微博:看雪安全

投稿、合作:www.kanxue.com

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存