LWN:OpenWrt与SELinux!

关注了就能看到更多这么棒的文章哦~

OpenWrt and SELinux

By Jake Edge
September 30, 2020
https://lwn.net/Articles/832876/
DeepL assisted translation

SELinux 是一种常用的安全机制,能够以许多有效的方式来限制用户空间发起的攻击。它也普遍被认为是一个重量级的工具,不适合像无线路由器(wireless router)这样资源很有限的系统。一些 OpenWrt 开发者并没有被这种看法给吓倒,他们正在把 SELinux 作为保护嵌入式设备的软件发行版的一个选项加进来。

9 月中旬,Paul Spooren 的一篇博客文章(https://aparcar.gitlab.io/running-openwrt-with-selinux/ )给出了一些背景介绍,以及讲述了现在的情况。7月,W. Michael Petullo 从 Thomas Petazzoni 那里收集了一些之前的 patch。然后 Petullo 在此基础上进行了修改,包括将工具从 Python 2 切换到 Python 3。最终结果作为 OpenWrt 的一个 pull request (PR)提了出来。在 8 月 30 日,该 PR 被合并。9月 12 日的时候,Petazzoni 的一个与此相关的 PR 被合并,从而增加了一些软件包对 SELinux 的支持。

SELinux 功能为 Linux 内核增加了强制访问控制(MAC,mandatory access control)机制。此前的酌情访问控制(DAC, Discretionary access control),典型代表就是 Unix 基于 user ID 和 group ID 的文件读/写/执行权限设置。用户可以对 DAC 权限进行修改(例如使用 chmod 777 ~命令),不过 MAC 策略一般不能在运行起来之后被更改。

SELinux 使用的 MAC 策略允许管理员指定哪些应用程序可以访问系统中的对象(主要是文件和网络资源)。针对这些对象,指定了描述其范围的安全上下文(secure context),而不是基于用户的权限配置。然后,会用一些 policy 来把对象可以访问具有特定上下文的其他对象给配置关联起来。这样一来,就可以允许 Web 服务器只能访问某个目录下的文件,并且只能绑定到特定的网络端口号,以及不能发起出站连接(outbound connection)。要想改变这些限制条件的话,就需要 root 用户在启动时来换一个 policy,或者重新标记对象,使其具有允许被访问的上下文。如果内核没有被攻破,那么以这种方式限制的服务和进程等就无法被滥用。

SELinux 定义文件对象上下文的方式就是 security label(安全标签)。此信息作为一个扩展属性,存储在文件本身内。因为这些信息是属于一个受保护的"security"扩展属性命名空间的,所以普通用户无法对其进行更改。所以,会有一个 "refpolicy" 程序包,在构建映像文件时就给文件标注好这个信息。

然而,将一个发行版切换过来开始使用 SELinux 的话,涉及的不仅仅是启用一个内核选项那么简单。正如上面提到的 blog 中所描述的那样,还需要对构建系统进行更改,从而能够创建支持 SELinux 的内核。先要打开 SELinux(CONFIG_KERNEL_SECURITY_SELINUX)选项,并允许在根文件系统中使用安全标签(CONFIG_TARGET_ROOTFS_SECURITY_LABELS),这样会自动选择 refpolicy 包,并将安全标签存放在 squashfs(或 F2FS)的根文件系统文件上。

为了让 SELinux 能把这些 policy 正确用起来,系统上的启动的这些进程需要关联一个与之相关的安全上下文。init 进程会负责做这些工作。但是,目前 OpenWrt 使用的 init,也就是 procd,并没有为它启动的进程设置好这些上下文。这部分工作会计划尽快完成。管理员还需要能够查看与文件、进程和其他对象相关联的上下文具体是什么,这就需要使用 ls 和 ps 等工具的-Z 开关来完成。跟大多数嵌入式发行版一样,OpenWrt 使用了 BusyBox 来实现这些工具。因此专门创建了一个 busybox-selinux 包,来配置 BusyBox 从而增加这些需要的功能。

最初启用的 policy 是来自上游 SELinux 项目的 reference policy,"还没有专门为 OpenWrt 进行调整",Petazzoni 说。后续会根据 OpenWrt 的具体需求对该 policy 进行调整。当然,还有更多的工作要做,但目前大部分底层基础设施已经并入 OpenWrt。正如 blog 所说的,可以用支持 SELinux 的 OpenWrt 镜像来启动虚拟机,并查看 context、label 等等。等在 procd 中添加好了设置 context 上下文的功能之后, OpenWrt 就能完成绝大多数功能来支持 SELinux 了。

总的来说,SELinux 在嵌入式 Linux 场景中的作用并不大。不过一个明显的反例是 Android 上的 SELinux,它在 Android 4.x 系列中刚刚开始起步,但后来已经成长为手机发行版的安全环境中不可或缺的一部分。不过嵌入式 SELinux 的研究时间还是比较长的,只是由于资源消耗比较多,一般都是用在高端设备上。OpenWrt 支持的设备范围很广泛,因此 SELinux 很可能会在其中一些设备中找到应用价值。

家用路由器的安全状况一般来说是比较糟糕的。为 OpenWrt 添加 SELinux 保护,只会对这种情况有点帮助而已。另外,SELinux 也许比 Fedora 系统更适合路由器发行版,因为 Fedora 系统中所运行的软件会有更频繁的变化更改,也就需要对 SELinux 策略进行更多的调整才能让系统继续运行。当然,SELinux 同样也不是万能的,但它肯定可以改善家用路由器等设备的安全性。

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值