LWN: 配置lockdown security module

640点击上方蓝色字关注我们~



Lockdown as a security module

By Jonathan Corbet
June 24, 2019


像UEFI secure boot(安全引导)这一类的技术,目的都是为了保证运行的系统软件是发布者指定的版本(这里定义一下发布者,是指firmware所成人的签名秘钥的拥有者)。不过,假如运行的系统软件能有什么方法修改正在运行的kernel,那这里就很难保证发生什么事情了。因此secure-boot技术的拥护者一直在试图能把安全系统的kernel中的各种功能也都锁定(lock down)。最近,Matthew Garrett在他提出的第34版(这么多次尝试!太夸张了)patch set里面,就希望能采用Linux security module (LSM)来管理系统的锁定(lock down)功能。


这组lockdown patch已经有很长的争议史了。LWN最早在2012年就写过相关的综述。反对者有各种各样的反对理由,有些人认为lockdown会把系统的控制权从用户手中夺走,其他人觉得这是一个完全无用的安全方案。不过,它其实在某些方面确实还是有用的,能让系统尽量抵抗攻击。因此这组patch一直存在,并且有些发行版已经包含了这组patch。对于最新版本的lockdown patch set的争议,主要是在一些细节问题,例如lockdown是否应该跟secure boot绑定,以及怎么跟integrity-measurement instrastructure集成。


最近讨论中有一个共识,就是lockdown patch在kernel里面塞进了太多policy。kernel里面很长时间以来一直希望把security-policy的决策都推给user space来做,就是所谓的security-module机制。因此按理来说应该把lockdown决策机制都放进LSM里面,因此最近的几个版本patch set都在做这件事情。


不过,最开始就碰到了初始化的难题。LSM用来响应user space的一些policy,因此只要user space启动之前确保LSM infrastructure跑起来就足够了。不过lockdown就需要更早跑起来了,因为它有可能需要用来组织一些种类的command-line parameters,因此需要在security policy能被load进来之前就需要开始生效了。所以这组patch set增加了一类所谓的“early security module”,能够在kernel启动阶段早期就初始化起来。在这个阶段,这个新module做不了太多事情,连最基本的kmalloc()等都用不了,不过还是能够注册hook函数并且接管一些控制权了。


接下来,也增加了一个新的security hook给LSM用:


这个hook会让LSM来决定kernel里的lockdown机制是否会拒绝某个行为(由参数what指定)。哲理的行为包括加载未签名的module(LOCKDOWN_MODULE_SIGNATURE),访问某些特定文件例如/dev/port (LOCKDOWN_DEV_MEM),让系统休眠(LOCKDOWN_HIBERNATION),使用用那些perf函数(LOCKDOWN_BPF_READ),等等等等。从这里看来,root用户有这么多种方法来攻击kernel或者从kernel提取一些敏感信息,不过lockdown patch已经尽了最大能力来关闭这些渠道了。


在此前一版patch set里面,Andy Lutomirski反对提供给LSM locked_down() hook这些具体的action list,他觉得应该提供两个值:“confidentiality”(针对那些可能泄露kernel信息的action)和“integrity”(针对那些可能攻破kernel的action)。他认为定义得太多,今后就有更大可能需要对这些action进行扩展或者更改,增加维护困难。Garrett则认为提供详细信息会有帮助,不太担心今后的兼容性改动。因此目前最新patch set还是详细列举了这些action的名字。

不过patch set里也相应做了修改,对confidentiality和integrity这两类lockdown做了区分。所有的LOCKDOWN_* 常量都是排好序的,integrity相关的action要比confidentiality相关的action的定义值更小。所有integrity相关的action都要比LOCKDOWN_INTEGRITY_MAX小,而其他action的值都比LOCKDOWN_CONFIDENTIALITY_MAX小。所以代码里要想判断是哪类action的话,可以直接跟这两个常量比较一下就可以了,不需要真的理解每个action的详细含义。


这些改动都会被patch set里新增的static lockdown policy module所使用。一些用户可能想放复杂的LSM policy进lockdown,不过其他多数用户可能只是想把一切都lock down然后再也不要管它了。这个static policy module可以根据kernel的config选项,来用多种方式来打开lockdown。比如可以用lockdown=这种kernel启动参数来设置integrity或者confidentiality,从而打开lockdown。也可以在系统正常运行的时候通过/sys/kernel/security/lockdown这个sysfs节点来控制。还可以用kernel config选项来让这两种lockdown模式打开或者关闭。


多年以来,lockdown patch一直争议不断。肯定还有一些开发者仍然反对这个概念,不过看起来大多数的反对意见经过这些年对patch set的耐心重构之后得到了解决。没人能确定第34版是不是可以合入mainline kernel了,不过看起来概率很高哦,终于有希望能把这个讲了很多年的故事给讲完了。


全文完

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

极度欢迎将文章分享到朋友圈 
热烈欢迎转载以及基于现有协议上的修改再创作~


长按下面二维码关注:Linux News搬运工,希望每周的深度文章以及开源社区的各种新近言论,能够让大家满意~


640?wx_fmt=jpeg

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值