lsm的含义:剖析LSM的前世今生(超详细~)

本文主要介绍了Linux Security Module (LSM)的基本原理,应用场景及编程实例。第一部分以Linux Kernel文档为基础,介绍了LSM的定义、诞生与发展,并简述了LSM的实现原理;第二部分以鼎鼎大名SELinux为例,介绍了LSM的具体实现。

本文主要基于Linux Kernel官方文档和源码撰写,如果有疏漏,欢迎指正。

一、 LSM是个啥

1. LSM的定义

TheLinux Security Module (LSM) framework provides a mechanism for various securitychecks to be hooked by new kernel extensions. The name “module” is a bit of a misnomer since theseextensions are not actually loadable kernel modules. Instead, they areselectable at build-time via CONFIG_DEFAULT_SECURITY and can be overridden atboot-time via the “security=…” kernel command line argument, in thecase where multiple LSMs were built into a given kernel.

从Linux Kernel官网页面中的介绍中可以大概总结出几个关键点:

l LSM框架基于hook机制实现内核功能扩展

l 虽然名字里带Module,但LSM并不是传统意义上的内核模块

l Kernel中可以同时编译进多个不同的LSM

l LSM并不是运行时加载,而是编译时引入,在boot阶段通过命令行加载

2. LSM的诞生与发展

在2001年的Linux Kernel峰会上,NSA代表建议在Linux Kernel 2.5中加入Security-Enhanced Linux(SELinux)。然而,这一提议遭到了Linus Torvalds的拒绝。一方面,SELinux并不是惟一用于增强 Linux 安全性的安全子系统;另一方面,并不是所有的开发人员都认为SELinux是最佳解决方案。最终SELinux没能加入到Linux Kernel 2.5,取而代之的是Linux Security Module的开发被提上日程。

LSM子系统自提出后开发了近3年,并终于在Linux Kernel 2.6正式加入到内核中,随之应运而生了大量LSM,比如Ubuntu、OpenSUSE、SUSE、Debian等发行版中默认的AppArmor,以及RHEL、Fedora、CentOS等发行版中默认的SELinux。

3. LSM的软件架构及实现原理

从图1中可以看出LSM在Linux安全体系中所处的位置,LSMhook被插入到访问kernel对象与DAC 检查之见,然后LSM调用系统中启用的访问控制模块,检查是否可以访问。若有多个访问控制模块,会根据初始化的优先顺序执行,都允许访问才能进一步访问 kernel 对象。使用LSM Hook框架进行内核安全审计和元数据捕获。安全开发人员只需要按照既定的调用规范编写LSM模块,并加载进Linux内核,而不需要对系统调用表进行任何修改。

剖析LSM的前世今生(超详细~)

图1 LSM软件逻辑

LSM的设计思想是在最少改变内核代码的情况下,提供一个能够成功实现强制访问控制模块需要的结构或者接口。其中,LSM对内核代码的改动如下:l在特定的内核数据结构中加入安全域l在内核源代码中不同的关键点插入对安全钩子函数的调用l加入一个通用的安全系统调用l提供了函数允许内核模块注册为安全模块或者注销l将capabilities逻辑的大部分移植为一个可选的安全模块LSM机制之所以简单实用,是因为它的设计者几乎罗列了任何可能出现安全问题的地方,然后在这些地方安插钩子,并且这些钩子的实现定义为回调函数,具体的安全引擎只需要自己实现这些钩子函数即可。

二、 LSM有啥用

1. 大名鼎鼎的SELinux

作为最知名的LSM之一,哪怕是刚开始接触Linux内核安全的新人,也一定或多或少听说过SELinux的大名。如果你没听说过,可以去翻翻往期内核工匠的文章,在《SELinux介绍》一文中,Tenny大佬对SELinux的基础框架和基本原理都做了介绍,同时对SELinux Policy做了介绍,本节将不再赘述。

2. 从LSM视角看待SELinux具体实现

上一节最后讲到了LSM对内核的改动,下面就以SELinux为例,详细讲解一下LSM在内核中的具体实现。(1)在inode结构体中加入安全域如图2所示,在inode数据结构中加入安全域字段,i_security字段指向一段安全域,该区域内顺序存放着各个安全模块自己的数据,每个安全模块会记录自己在安全域内的offset。内核通过在文件inode对象中间接引用的i_security对象(void*),实现各种各样的安全模块。

剖析LSM的前世今生(超详细~)

图2 在inode数据结构中加入安全域字段

(2)添加hook函数调用

在内核代码中埋入的每个安全hook函数都会设立自己的hlist,以便于不同的安全引擎能同时工作(如SELinux与AppArmor共存)。每一个hook点都可以用security_hook_list结构体来描述,同时每个hook点包含一个函数声明和自己hlist的头部,如图3所示:

剖析LSM的前世今生(超详细~)

图3 hook_list数据结构

在头文件”lsm_hook_defs.h”中,罗列出了各种hook点的名称,SELinux通过复用LSM_HOOK宏对hook函数进行初始化,如图4所示:

剖析LSM的前世今生(超详细~)

图4 hook函数初始化

selinux_hooks就是SELinux模块实现的hook点结构体数组,通过上面提到的LSM_HOOK_INIT宏对struct security_hook_list结构中的成员head进行初始化,并将SELinux实现的函数
selinux_binder_set_context_mgr赋给对应函数指针。然而,这个宏仅仅初始化了两个成员,并未将实现的函数插入到hook点下hlist中。Linux提供security_add_hooks函数执行插入哈希链表操作,内核代码中埋入的hook点在被调用时,会遍历自己的hlist,依次调用之前注册的安全函数。如图5所示:

剖析LSM的前世今生(超详细~)

图5 security_add_hooks函数

(3)LSM数据结构

如图6所示,在Linux内核中,通过使用lsm_info结构体对各个安全模块进行描述。在头文件vmlinux.lds.h中,定义了lsm info数据区域,用于存放 lsm_info结构体,并使用DEFINE_LSM宏对其进行初始化。

剖析LSM的前世今生(超详细~)

图6 LSM数据结构

如图7所示是SELinux中的lsm_info结构体定义,包含模块名称及init函数。

剖析LSM的前世今生(超详细~)

图7 SELinux模块的lsm_info结构体

(4)LSM初始化

如上一节在LSM定义中所提到的,LSM并不是运行时加载,而是编译时引入,在boot阶段通过命令行加载。在start_kernel(系统启动执行完架构相关代码后,通用代码的入口)后,开始调用early_lsm_init命令和security_init命令。

early_lsm_init命令在Kernel 5.4引入,目的是对在setup_arch()中启动的代码配置安全策略,以实现在引导早期加载LSM策略的安全机制。通过配置
CONFIG_SECURITY_LOCKDOWN_LSM_EARLY宏,可以在security_init命令之前启动,目前lockdown是为数不多使用这种配置的模块之一。

剖析LSM的前世今生(超详细~)

图8 early_lsm_init函数

如图8所示,early_lsm阶段通过调用early_lsm_init函数完成初始化,在头文件vmlinux.lds.h中定义了__start_early_lsm_inf,由DEFINE_EARLY_LSM(lsm)宏调用初始化函数,如图9所示:

剖析LSM的前世今生(超详细~)

图9 lockdown模块初始化

如图10所示是early_lsm阶段的两个核心函数prepare_lsm和initialize_lsm。

剖析LSM的前世今生(超详细~)

图10 prepare_lsm函数与initialize_lsm函数

prepare_lsm函数通过调用lsm_allowed函数进行判断,如果有模块的flag中加入了LSM_FLAG_EXCLUSIVE,则注册成独占模块,其他声明了LSM_FLAG_EXCLUSIVE的模块就不会被启用。常见Linux系统中lockdown,yama,loadpin,safesetid,integrity以及capbility均为非独占模块,在内核中可以同时加载;而selinux,apparmor以及smack均是独占模块,不能同时加载。initialize_lsm函数实际上就是调用安全模块自己注册的init函数。

讲完early_lsm阶段,接下来说一下security_init阶段。

剖析LSM的前世今生(超详细~)

图11 security_init函数

如图11所示,security_init阶段通过调用security_init函数完成初始化。其中,lsm_names保存内核启动的lsm模块名,本身是一个字符型指针,赋值时需要通过alloc函数申请内存,而early_security_init阶段无法完成这个操作,因此在security_init中,会对模块是否属于early_security_init阶段进行判断。

剖析LSM的前世今生(超详细~)

图12 ordered_lsm_init函数

如图12所示是security_init阶段的核心函数ordered_lsm_init函数。下面看一下其具体实现。

ordered_lsms是一个结构体指针数组,用于保存在静态数据区中定义的lsm_info结构体。

chosen_lsm_order和chosen_major_lsm均保存cmdline传入的lsm相关参数,分别对应cmdline的”lsm=”参数和”security=”参数,”lsm=”表示指定多个安全模块的加载顺序,”security=”是指定一个补充加载的安全模块。

builtin_lsm_order等同于CONFIG_LSM,即在kernel配置时选择的安全模块加载顺序字符串。

ordered_lsm_parse函数的作用是将.lsm_info.init中无序的静态数据(lsm_info) 地址按照CONFIG中的逗号隔开的顺序放到ordered_lsms指针数组中。

(1)配置LSM的security_blob_size在lsm_info结构体中,使用lsm_blob_sizes结构体来存放LSM的Security blob size 或者offset数据。blob size指的是LSM框架下实现的安全域数据大小。其结构体声明如图13所示:

剖析LSM的前世今生(超详细~)

图13 lsm_blob_sizes结构体

在lsm初始化阶段,Linux Kernel提供了lsm_set_blob_sizes函数用于配置模块的blob_size,一般模块在静态定义lsm_info时会定义blob_size,如图14是SELinux的blob_size定义:

剖析LSM的前世今生(超详细~)

需要注意的是,全局变量blob_sizes是各个使能的模块的blob size的累加值,并会将累加的offset重新赋值给模块的blobs对应字段。

三、总结

在LSM诞生之前,Linux Kernel安全加固的方案多种多样,随着LSM加入内核,从前的安全性内核补丁如今破坏了内核的完整性,使用LSM框架中的标准预置回调函数进行hook是当前最优雅的解决方案。而Kernel 5.4中加入的lockdown模块(前文提到的early_lsm阶段加载的模块)直接禁止了运行时对内核进行动态修改,使得LSM成为Linux安全模块开发的唯一途径。

本文链接:https://www.dzdvip.com/34942.html 版权声明:本文内容均来源于互联网。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 395045033@qq.com,一经查实,本站将立刻删除。
(1)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022年7月15日 19:24
下一篇 2022年7月15日 23:11

相关推荐

  • 一句话表达缘分已尽

    情缘似水,世事如梦,梦醒了,心却停留在曾经,缘散了,我却放不下对你的惦念。 回眸,那一场缘分散落成殇,从此,这一世爱恋只能以静默收场。 我静默于自己的世界里,默默地牵挂着远方的你,遇一人,倾一心,一念就是一辈子。 但是,情再深,我也没有再去联系你,因为我知道,一场缘走到了尽头,无声,就是最好的收场。 放不下的爱,就在心里静静地想;舍不下的人,就在梦里相依相伴。 一别经年,一生挂牵 有人说,时间是这世间最好的良药,它能治愈一切悲伤,也能淡化一切记忆。 曾经,我信以为真,以为在一年一年的时光中,我能忘记那一场离殇,却不知,时光隔了经年,你依旧还是我心中最深的念想。 原来,有些记忆永远都不会消散,有些人,即便不再相见,也会一辈子藏在心间。 藏一个你,在我心里,在我梦里,在我所有时光里。 那个曾经并肩走过一程的某人,与你一别经年,为你一生情牵。 起不知所起,一往而深,你在不在身旁,对你的爱永不忘记 直到现在,我仍然想不起来,你和我之间的缘分源于何时,但我知道,自你走进我心底之后,我便再也做不到忘记你。 情不知所起,一往而深;念不见所迹,一生沉沦。 纵使天涯相隔,各安天涯,那一场初见的心动,那一程相伴的温暖,我也永远深深地铭记在心底。 一个人,在春来秋去的光阴里,在风风雨雨的人生路上,倚着心中的记忆,静静地想你。 你在或不在身旁,对你的爱恋永不忘记。 心有千千结,结结为君系 张先说: “天不老,情难绝,心似双丝网,中有千千结。” 那年,那月,那一程旧时光,早已走远。 这心,这爱,这一世倾城恋,却依旧念念不忘。 虽然这一场缘分逃不脱分离的苍凉,但是你来过,我爱过,那份暖,是任何人都替代不了的痴念。 好想你,心有千千结,结结为君系,我的每一寸相思,皆为你而生,而在,而存,而痴。 清风起,叶落翩翩,这一季零落中再无你,可是风儿中翩跹的每一片叶上,都寄托着我对你深深的想念。 你在我的世界轻轻转身,天涯之外的你,依旧牵动着我心中的悲喜。 一念情起,花开是你,叶落是你,飞雪是你,飘雨是你……。 曾经以为,一爱就是一生的陪伴,如今却是,一念就是一辈子的沉沦。 想你了,想你了,旧时光已远,爱却永恒于心间 执笔,写下心中的情深,几许相思,几许痴念,无语泪千行。 多想,此时此刻你就在我身旁,与我执手山河岁月,陪我共沐晴天暖阳,可惜,旧时光已去,相思再深,也只能放在心底。 想你了,想你了,暖暖相伴…

    2022年1月2日
    25
  • 怎么让视频加快速度播放?

    我们在编辑视频时常常需要将视频的播放速度加快,利用快剪辑就可以达到这样的效果,那么该如何操作呢?

    2021年5月4日
    11
  • 21岁单亲妈妈回应不要亡夫赔偿金(江西21岁单亲妈妈送外卖是真的吗)

    近日,一段21岁单亲妈妈送外卖的采访视频引发热议。当事人表示不会问婆婆要回丈夫的赔偿金。但这样做对其女儿合适吗?今天广州樊启彪今天来聊下这个话题。 这两天我被一条短视频刷屏了,起初我还仅仅以为是标题党看看热闹,后来经过时间发酵我在这个视频信息里读到了满满的鼓励和为母则刚的能量。 她叫小陈,21岁,已经是独自照顾女儿的单亲妈妈。她2018年结婚,2019年丈夫不幸车祸去世,女儿刚刚五六个月大,婆婆把自己老公的赔偿金拿走就将她们母女赶出了家门。 在被问及为何婆婆会把自己的孙女赶出门时,她说在江西只有男孩是延续,女孩不算。 视频里的她眼睛闪着泪光可还是纯真的笑着说:我还年轻,在老家一个月只能赚3千块,我从江西到安庆打工,在这里送外卖,一个月可以赚7-8千元,还可以带孩子,挺好的。 21岁,对很多人而言,是大学还没毕业的年纪,是可以坦称自己是“孩子”的年纪。但对小陈来说,却早早地扛起了母亲的责任。 刚开始送外卖时,小陈把半岁的宝宝背在胸前。后来孩子稍微大一点,白天可以暂时留在出租屋里或是托人照料,晚上再母女一块出来跑单。 小陈表示,自己这两年遇到了很多好心人。自己送外卖不能照顾女儿时,会把女儿放在一家熟识的麦当劳店里,工作人员“对她女儿很照顾”。 当被问到送外卖很辛苦呀,每天还要带着宝宝跑来跑去,还要爬楼梯,自己还吃得消吗,不觉得委屈吗?她还是笑着说:自己还年轻,年轻的时候不吃苦什么时候吃苦呢?她希望通过自己的努力买一个很小的房子就可以了 ,自己跟女儿住,希望供女儿读大学,不要像她一样小小的年纪就很早结婚了。 其实小陈的父母曾经劝阻过小陈不要管女儿了,毕竟自己还是个孩子,21岁还有很多可以想象的美好未来。 可小陈却说:自己能明白父母这样说是为了心疼她这个女儿,可她自己也心疼自己的女儿呀。自己生了女儿就要负责任,要把女儿供养长大成人,以后有出息。 小陈自己也发微博说:保护女儿的一日三餐,就是最幸福的生活。同时对于网友说应该找婆婆要回赔偿金的事,善良的她也表示“不会问婆婆要回丈夫的赔偿金,毕竟她失去了一个儿子且自己有能力养活女儿。” 21岁,一个女孩的花季青春才刚刚开始,她的青春在背着孩子的车水马龙中绽放着。她善良、勇敢、乐观、单纯、有责任心,有大爱。 看到她的故事我即心疼又很受鼓舞。在互联网信息纷杂的世界里喜怒哀乐,善恶丑美百家齐放。有的妈妈遇见压力抱着孩子跳楼了,有的妈妈把…

    2022年10月19日
    16
  • 魔方教程公式口诀七步(魔方教程公式图解 新手入门)

    很多小朋友在学习CFOP的时候,都觉得OLL比较难背,OLL建议放到最后,第一公式多,第二前期的话对于提速的作用不是特别明显,但是OLL公式还是要背完的,因为CFOP每一步都非常重要,尤其是想进入更快,最好是全部记住。 魔方又叫鲁比克方块,1974年发明的机械益智玩具,是最受欢迎的智力游戏之一。魔方有竞速、盲拧、单拧多种玩法。 狭义的魔方是三阶魔方,通常为正方体,竞速玩法是将魔方打乱然后在最短的时间复原。广义的魔方是指各类可以通过转动打乱和复原的几何体。 那如何玩好魔方呢?下面教一下魔方教程公式的口诀,其中有七步: 1、将魔方底棱归位,也称为十字还原。 2、底角归位,也就是复原魔方第一层的四个小角块。 3、将魔方第二层棱块归位,也就是复原魔方中层四个棱块的步骤。 4、顶棱面位(顶部架十字),也就是魔方四个顶棱块与顶面色相同的面全部调至到顶面的步骤。 5、将魔方的四个顶角的顶面色全国调至顶面。 6、是使已经面位的魔方四个顶棱的另一面的颜色和所在的另四个面的颜色同色。 7、使已经面位的魔方四个顶角的其他两面颜色也和对立面所在的颜色同色。 魔方与华容道、法国独立钻石棋被称为智力游戏界的三大不可思议。 截至2021年6月10日,三阶魔方速拧的世界纪录是平均5.48秒。 你玩过魔方吗?欢迎留言说说你对魔方的看法吧。

    2022年7月31日
    48
  • 盘点各手机品牌值得购买的机型

    OPPO     OPPO手机市占率名列前茅,质量什么的,也是数一数二。以前和vivo 一样,被人戏称为“厂妹厂弟”的手机,说低配置,高价格等。 近两年这种情况有所改观,有很多叫好又叫座的机型。 OPPO有很多分身,比如OPPO、一加、真我,其实都是OPPO系手机。 先来说说OPPO品牌。 OPPO有find系列、Reno系列、k系列、A系列。 find 系列主攻高端商务旗舰,以及黑科技,价格虽然说比较昂贵,但是真材实料,十分价钱十分货。 Reno系列也是定位于旗舰,可以理解为探索黑科技。但是,这个品牌高端化做得不是很成功。一开始是用的是高通最新旗舰,可是,最新的OPPO Reno 6 Pro +,采用的是高通骁龙870,这款次旗舰产品,价格还卖到了4000元左右。 性价比不是很高,品牌知名度也是不如find 系列。 其他的比如K系列、A系列,主打续航与性价比,但是竞争力也一般。 所以,要想购买OPPO 手机,请选择find 系列。 说完OPPO,再来说说OPPO的“大儿子”一加手机。 一加手机     一加手机诞生于2013年,也是比较早做智能手机的,产品口号叫做“不将就”。 一开始只做旗舰手机,物料、成本什么的,都是当时顶级的,竞争力十足。 遗憾的是,在国内市场一直不温不火,原因在于系统。 一加手机系统名字叫法有所不同,在国内,被称之“氢os”,在国外,被叫做“氧os”,其实是一类事物的不同叫法。 特点就是简洁、流畅,但是代价就是功能比较少,喜欢的人特别喜欢,就钟爱这种傻快傻快的感觉。然而,国内不喜欢的也很多,以至于不得到换上了OPPO的系统:     此举,很多一加粉丝很不理解,认为这样失去了一加手机的特色。 为了扩大市场,一加手机又在今年进军2000~~3000元价位市场,推出了“r”系列,具体机型为一加9r,性价比很高。 旗舰手机是一加9/9 pro,主打哈苏影像。 不管怎么说,一加无论是870次旗舰手机,还是旗舰手机,都值得购买。 真我     真我手机在国外被称为realme,主打性价比。2018年5月份,诞生于海外,主攻印度东南亚市场。不到一年时间,销量突破了一百万台,可谓是竞争力十足。 2019年,在海外取得巨大成功的realme,回归国内市场,开始和红米竞争,推出的某些机型,配置比红米更高。 旗下有: 真我GT系列,主攻2000~~3000元区间…

    2021年9月3日
    22
  • 私域运营怎么做(名创优品私域用户1000万运营全拆解)

    作为私域运营的先行者,名创优品如今在私域上的成效无疑十分卓著。本文对其构建私域和用户转化的方式,以及社群活动举办的规律等内容进行了拆解,从中获得了一些启发,希望对你有所帮助。 在疫情爆发之前,名创优品已经意识到维护客户的重要性,十分重视用户价值。在这种理念的指导下,名创优品几年前就在精心维护和运营自己的私域流量。 现如今名创优品私域用户数超过1000万,活跃消费会员数3300万+,这篇文章拆解下名创优品的私域帝国是如何搭建的。 一、案例简介 案例名称:【名创优品】私域运营策略 案例行业:电商零售 案例目标:拉新获客、传播推广、建立品牌心智、社群运营转化 案例标签:社群运营、私域涨粉、用户留存、提升销售额 二、私域构建 现在大部分电商零售平台都有采用投放引流的方式,包括抖音、微信、传统电商平台(淘宝、京东、等)、小红书等,在这里就不赘述名创优品在哪里投放广告了,这个部分重点说下名创优品的“公域门店私有化”。 1. 线下门店 名创优品做的最重要的一件事儿就是把”公域门店”的用户”私有化”,把公域流量变成微信里的”私域社群”。 比如,名创优品有超过5000家门店,这些门店覆盖范围很广,覆盖人群基数大。门店具备很好的前提条件,不用花钱买流量,只要用合适的方式,就能把家门口池子里的流量私有化。从疫情开始,名创优品初步尝试店员扫码的方式,把门店公域用户私有化。几个月后,他们的私域用户就达到了200万。 2021 年,名创优品正式将私域上升为一项集团战略,得到各一级部门的支持。在此后的双11,累计私域新增用户突破 2000 万,留存用户 1500 万,小程序月活 600 万以上。 此前,线下门店同时在做拉新、推付费会员、钱包充值几件事,而这些环节都只能在用户结账这一环完成。而现在名创优品在收银环节只做一件事:让用户加企业微信。 引流私域的诱饵:满足用户即时需求。 举一个例子,用户在门店购物到离店付款环节时,收银店员会引导用户扫码关注公众号,即可免费领取1元购物袋,很好的满足用户当下的需求,刺激用户扫码关注。 诱饵的设置也有技巧,并不是一成不变。名创优品引流品的选择也在根据用户需求不断调整,从开始的购物袋,到疫情期间送口罩,不断洞悉需求,真正与用户同频共振。也可以在离店收银时,通过优惠券的方式引导用户添加企业微信。 2. 裂变拉新 裂变作为低成本大规模用户增长的方式,简单粗暴但也十…

    2022年1月15日
    30