首页 > 系统相关 >技术分享 | LSM,Linux 内核的安全防护盾

技术分享 | LSM,Linux 内核的安全防护盾

时间:2023-09-01 15:03:11浏览次数:56  
标签:SELinux LSM 安全 内核 模块 Linux

计算机安全是一个非常重要的概念和主题,它不仅仅可以保护用户个人信息和资产的安全,还可以影响到用户在使用过程中的体验;但同时,它也是一个很抽象的概念,关于其相关文献和资料不计其数,但它究竟是什么、包含什么,并没有详尽并全面的介绍。尽管困难,国际上还是对计算机安全概括出了三个特性:

  • 私密性(Confidentiality)
  • 完整性(Integrity)
  • 可用性(Availability)

三者合起来简写为 CIA 。私密性就是数据不被未授权的人看到;完整性指存储或传输的信息不被篡改;可用性是指自己的设备在需要使用的时候能够使用。

内核对于系统的重要性是无需多言的。Linux 内核安全的开发从上世纪 90 年代中后期开始,经过 20 多年的开发, Linux 内核中安全相关模块还是很全面的,有用于强制访问控制的 LSM 、有用于完整性保护的 IMA 和 EVM 、有用于加密的密钥管理模块和加密算法库、还有日志和审计模块、以及一些零碎的安全增强特性。

技术分享 | LSM,Linux 内核的安全防护盾_强制访问控制

LSM ,全称为 Linux Security Modules ,中文直译为 Linux 安全模块。别看叫 Linux 安全模块,但 LSM 其实是一个在内核各个安全模块的基础上提出(抽象出)的轻量级安全访问控制框架。该框架只是提供一个支持安全模块的接口,本身不能增强系统安全性,具体的工作交给各安全模块来做。这有点儿类似于系统架构师和工程师的关系,架构师负责抽象建模、系统设计和框架搭建,工程师按照架构师的框架设计进行编码,将其构想付诸实现。

技术分享 | LSM,Linux 内核的安全防护盾_计算机安全_02

再具体点说, LSM 在 Linux 内核中体现为一组安全相关的函数,这些安全函数在系统调用的执行路径中会被调用。因此 LSM 的目的是对用户态进程进行强制访问控制。至于这些安全函数要实施什么样的访问控制,则是由具体的安全模块决定的。

技术分享 | LSM,Linux 内核的安全防护盾_访问控制_03

两段内容就提到了两次安全模块,那到底都有哪些安全模块?

截止到2014年, Linux 内核主线上共有 5 个安全模块:SELinux、AppArmor、Smack、TOMOYO 和 Yama,后来又增加了 LoadPin 和 SafeSetID 等。虽然还被称为模块,但实际上自 Linux 内核 2.6.x 版本之后, Linux 就强制 LSM 各个模块必须被编译进内核中,不能再以模块的形式存在了。这意味着,在运行时不能再随意加载一个所谓的安全模块作为访问控制机制了,也不能随意卸载一个安全模块了。

技术分享 | LSM,Linux 内核的安全防护盾_访问控制_04

说起 LSM 的历史,就不能不提到 SELinux 。实际上是先有的 SELinux ,后有的 LSM ,可以说 LSM 是由 SELinux 推动才应运而生的。具体是怎么回事?且听我慢慢道来。

技术分享 | LSM,Linux 内核的安全防护盾_访问控制_05

在 2001 年的 Linux Kernel 峰会上,美国国家安全局(National Security Agency,简写为 NSA )代表建议在 Linux Kernel 2.5 中加入 Security-Enhanced Linux(SELinux) 。然而,这一提议遭到了 Linus Torvalds( Linux 之父)的拒绝。当然了,拒绝也是有原因、有理由的:

一方面, SELinux 并不是唯一用于增强 Linux 安全性的安全子系统;

另一方面,并不是所有的开发人员都认为 SELinux 是最佳的解决方案。最终,“托爷”还真就没让 SELinux 加入到 Linux Kernel 2.5 。

虽然来了个“烧鸡大窝脖”,可是人家 NSA 可没有气馁和放弃。相反,将 Linux Security Module ,即 LSM 的开发提上日程。打那之后,LSM 子系统开发了近 3 年,终于在 2003 年完成了由 SELinux 到 LSM 的迁移,并在 Linux Kernel 2.6 正式加入到内核中。自此以后,大量安全模块应运而生了,比如 RHEL、Fedora、CentOS 等发行版中默认的 SELinux ,以及在 Ubuntu、OpenSUSE、SUSE、Debian 等发行版中默认的 AppArmor 等等(就是上文列出的那些安全模块)。

技术分享 | LSM,Linux 内核的安全防护盾_访问控制_06

LSM 框架主要由五大部分组成:

  • 在关键的特定内核数据结构中加入了安全域;
  • 在内核源码中不同的关键点处插入对安全钩子函数的调用;
  • 提供了一个通用的安全系统调用;
  • 提供了注册和注销函数,使得访问控制策略可以以内核模块方式实现;
  • 将 capabilities 逻辑的大部分功能移植为一个可选的安全模块。       

具体实现上, LSM 框架通过提供一系列的 Hook 即钩子函数来控制对内核对象的操作,其本质是插桩法。Hook 函数的访问示意图如下:

技术分享 | LSM,Linux 内核的安全防护盾_访问控制_07

通过系统调用进入内核之后,系统首先进行错误检查;错误检查通过之后,进行传统的权限检查即自主访问控制(Discretionary Access Control,DAC)检查(传统权限检查主要是基于用户的,用户通过验证之后就可以访问资源);通过之后才会进行强制访问控制(Mandatory Access Control,MAC)。强制访问控制是不允许主体干涉的一种访问控制,其采用安全标识、信息分级等信息敏感性进行访问控制,并通过比较主体的级别和资源的敏感性来确定是否允许访问。

技术分享 | LSM,Linux 内核的安全防护盾_访问控制_08

LSM 是一个很大的概念和课题,涉及很多方面、层面的知识,非常值得深入学习、探索和研究。

它作为 Linux 内核的一个关键组成部分,对计算机安全至关重要。深入研究 LSM 可以为提高 Linux 系统的安全性、性能和适应性提供重要见解,并有助于满足不断演变的安全需求。

我们认为如何适应新兴技术和安全挑战,是一个有前景的研究方向。同时,鼎道智联正在打造的 DingOS 也在探索着相关内容,力争为用户带来更安全、绿色、便捷的操作体验,如果你也对此感兴趣,欢迎关注我们,和我们一起创造出更智能、更高效、更可持续的未来。


标签:SELinux,LSM,安全,内核,模块,Linux
From: https://blog.51cto.com/u_15368321/7322927

相关文章

  • Linux tcp连接数监控实战shell脚本
     tcp连接数监控可用于存储维护中前端业务访问量的统计:使用命令netstat-anpProto:表示协议类型,Recv-Q:表示收包数量, Send-Q:表示发包数量实战示例:#!/bin/bash#thisscriptisusedforcountthequantityofsessionoverstocklog=/ap/log/session_overstock_count.loglog......
  • Linux开发小工具
    Linux系统-部署-运维系列导航C++僵尸进程与孤儿进程 #include<stdio.h>#include<unistd.h>/*本程序启动一个子进程,父子进程无限循环不退出*//**编译:gcczombie_creator.c-ozombie_creator.exe*执行:./zombie_creator.exe*//**使用方法*kill父进程,则子......
  • Linux DNS配置手册
    Linux系统-部署-运维系列导航关于DNS生效优先级Linux系统中,域名解析相关的配置存在多个地方,经常使用的包括1.本地hosts文件,/etc/hosts,指定将域名解析到特定IP#配置格式ip域名1域名2... 2.dns配置文件,/etc/resolv.conf,指定dns服务器,系统会连接dns服务器查询域名解析......
  • Linux分区、LVM、文件系统(CentOS 7)
    Linux系统-部署-运维系列导航 Linux分区物理磁盘的物理分区包括主分区与扩展分区、逻辑分区一个磁盘只能有4个分区,其中只能有1个扩展分区,所以分区方案为4主或3主1扩展物理分区路径为/dev/磁盘类型+磁盘号+分区号,其中磁盘类型支持hd、sd、vd等,磁盘号为英文字母abcd,分区......
  • 关于为Jetbrains家开发工具建立快捷方式(linux)的两种方法
    前言考虑到jetbrains给出的安装包都是脚本命令语言,即后缀名为sh的文件,每一次打开都要使用Terminal打开,为了方便的打开,我们这里来创建一下快捷方式。方法一这是最为传统的方式,即书写一个desktop的文件,讲路径与图标写进去,授予其执行权限来实现,下面是实现方法。首先我们要创建一......
  • linux内核等待队列详解
    https://www.cnblogs.com/xinghuo123/p/13347964.html等待队列用于使得进程等待某一特定事件的发生,无需频繁的轮询,进程在等待周期中睡眠,当时间发生后由内核自动唤醒。1数据结构1.1等待队列头等待队列结构如下,因为每个等待队列都可以再中断时被修改,因此,在操作等待队列之前必......
  • Linux 主机磁盘繁忙度监控实战shell脚本
    Linux磁盘繁忙度是指磁盘的使用率和活动水平。可以通过一些工具来监测磁盘繁忙度,如iostat、iotop、sar等。其中,iostat是一个常用的工具,可以提供关于磁盘活动的详细统计信息。通过运行命令iostat-x1可以实时监测磁盘的使用情况,其中%util列就表示磁盘的繁忙度,数值越高表......
  • linux定时任务的设置
    为当前用户创建cron服务1. 键入crontab -e编辑crontab服务文件     例如文件内容如下:    */2****/bin/sh/home/admin/jiaoben/buy/deleteFile.sh     保存文件并并退出     */2****/bin/sh/home/admin/jiaoben/buy/deleteFile.sh......
  • linux 分配git用户名和密码
    touch.git-credentials然后用代码编辑工具打开刚才的文件,编辑如下:https://你的用户名:你的密码@github.com这一步你要注意一下,如果你是dsdn的账号,注意一下后缀,应该是https://你的用户名:你的密码@code.csdn.net,这个根据情况而定1.2添加gitconfig内容进入gitbash终端输入......
  • Linux配置ADSL链接
    Linux配置ADSL链接在Linux中配置ADSL链接,可以按照以下步骤进行:安装rp-pppoeconf工具,这个工具可以通过终端窗口使用。运行命令“rp-pppoeconf”来配置ADSL链接。终端窗口会显示一个向导模式,用于配置ADSL链接。输入用户名和密码。这些信息是用来连接到ADSL服务器的。选择连接的速度。......