Linux 安全 - LSM hook点

文章目录

  • 一、LSM file system hooks
    • 1.1 LSM super_block hooks
    • 1.2 LSM file hooks
    • 1.3 LSM inode hooks
  • 二、LSM Task hooks
  • 三、LSM IPC hooks
  • 四、LSM Network hooks
  • 五、LSM Module & System hooks

一、LSM file system hooks

在VFS(虚拟文件系统)层中,定义了三个主要对象,它们封装了低级文件系统开发所使用的接口:

super_block(超级块)对象
file(文件)对象
inode(索引节点)对象

每个对象都包含一组操作,这些操作定义了VFS与实际文件系统之间的接口。LSM(Linux安全模块)利用这些接口来介入文件系统访问。

LSM使用内核对象中定义的不透明安全指针:

super_block(超级块)结构体
file(文件)结构体
inode(索引节点)结构体

通过在这些结构体中添加安全指针,LSM可以监视和控制与文件系统相关的操作。这样,LSM可以在文件系统访问过程中介入,执行安全策略检查、权限控制等操作,以增强系统的安全性。

1.1 LSM super_block hooks

struct super_block {......
#ifdef CONFIG_SECURITYvoid                    *s_security;
#endif.....
}

当文件系统在内核中表示时,super_block 结构体是代表该文件系统的内核对象。

super_block 结构体在挂载和卸载文件系统以及获取文件系统统计信息时被使用。

LSM(Linux安全模块)提供了一组钩子函数,用于介入对 super_block 的各种操作。

在挂载文件系统时,内核首先通过调用 sb_mount() 钩子函数来验证挂载请求的有效性。LSM可以使用该钩子函数执行额外的安全检查,例如验证挂载任务的权限或确保挂载选项的有效性。

在卸载文件系统时,会调用 sb_umount() 钩子函数来检查卸载文件系统所需的权限。LSM可以利用这个钩子函数来执行访问控制,确保只有授权的任务能够执行卸载操作。

sb_remount() 钩子函数在修改文件系统挂载选项时被调用。LSM可以利用该钩子函数验证请求的挂载选项的有效性和安全性。

当任务尝试获取文件系统统计信息(如磁盘使用情况或可用空间)时,会调用 sb_statfs() 钩子函数。LSM可以使用该钩子函数执行权限检查,确保只有授权的任务能够访问文件系统统计信息。

union security_list_options {......int (*sb_remount)(struct super_block *sb, void *mnt_opts);int (*sb_statfs)(struct dentry *dentry);int (*sb_mount)(const char *dev_name, const struct path *path,const char *type, unsigned long flags, void *data);int (*sb_umount)(struct vfsmount *mnt, int flags);......
}

通过介入对 super_block 结构体及其相关操作的访问,LSM在强制安全措施、验证权限和控制文件系统操作方面发挥着重要作用。它可以执行安全策略检查、增强访问控制,并确保文件系统的完整性和安全性。

1.2 LSM file hooks

当文件在内核中表示为打开文件时,file 结构体是代表该文件的内核对象。

file 结构体包含了关于文件的信息,如文件位置、访问模式和与文件相关的数据。

在 file 结构体中,有一个 file_operation 结构体,描述了可以对文件执行的操作。这些操作包括从文件中读取数据、向文件写入数据、寻址文件、将文件映射到内存等等。

LSM(Linux安全模块)提供了一组文件钩子函数,用于介入对文件的访问。

file_permission() 钩子函数用于在每次文件读取和写入操作时重新验证读写权限。LSM可以利用该钩子函数执行额外的权限检查,确保尝试读取或写入文件的任务具有必要的权限。

file_locks() 钩子函数用于在使用锁来同步多个读取器或写入器访问文件时。任务在执行任何文件锁定操作之前必须通过 file_locks() 钩子函数的权限检查。该钩子函数使LSM能够执行访问控制,防止未经授权的锁定操作。

file_ioctl() 和 file_fcntl() 钩子函数用于处理通过 ioctl(2) 和 fcntl(2) 系统调用发起的各种杂项文件操作。这些钩子函数使LSM能够介入和控制各种文件相关操作,例如设置文件属性、控制文件行为或执行特定于某些文件类型的特殊操作。

通过介入对 file 结构体及其相关操作的访问,LSM在强制安全措施、验证权限和控制文件访问方面发挥着重要作用。它能够执行安全策略检查,增强访问控制,并确保系统内文件操作的完整性和安全性。

1.3 LSM inode hooks

inode 结构体是表示内核文件对象(如文件、目录或符号链接)的内核对象。

当文件系统中的文件、目录或符号链接在内核中被表示时,inode 结构体就扮演着代表其元数据的角色。

LSM(Linux安全模块)提供了一组钩子函数,用于介入对 inode 结构体的访问。

内核的 inode 缓存通过文件查找操作(例如打开文件)或文件系统对象创建操作(例如创建新文件或目录)填充。

LSM可以利用这些钩子函数来介入对 inode 结构体的访问,并对其上执行的操作进行调控。这些钩子函数允许LSM执行安全策略检查、权限控制以及对文件系统对象的访问控制。

LSM提供的与 inode 操作相关的钩子函数包括:
(1)文件的创建和删除:在创建或删除文件、目录或其他文件系统对象时调用的钩子函数,例如 create()、mkdir()、rmdir()、mknod() 和 rename()。

(2)链接和解除链接:用于创建或删除硬链接或符号链接时调用的钩子函数,例如 link()、unlink()、symlink()、readlink() 和 follow_link()。

(3)属性操作:用于获取或修改文件属性、扩展属性和权限的钩子函数,例如 getattr()、setattr()、getxattr()、setxattr() 和 permissions()。

在这些钩子函数中,LSM可以执行各种与安全相关的任务,例如验证权限、强制访问控制策略、审计文件操作,并根据文件的属性和请求的操作应用其他安全检查。

通过介入对 inode 结构体及其关联操作的访问,LSM在增强文件系统的安全性方面发挥着关键作用。它通过实施细粒度的访问控制和确保符合安全策略来提高文件系统的安全性。

二、LSM Task hooks

当任务在内核中表示为可调度任务时,task_struct 结构体是代表该任务的内核对象。

task_struct 结构体包含了任务的基本信息,如用户/组 ID、资源限制以及调度策略和优先级等。

LSM(Linux安全模块)提供了一组任务钩子函数,用于介入任务对基本任务信息的访问。

task_alloc() 钩子函数用于验证任务是否可以创建子任务。当任务尝试创建子任务时,LSM可以利用该钩子函数执行额外的检查,例如验证任务的权限或强制执行与任务创建相关的特定策略。

task_kill() 钩子函数在任务退出或被终止时被调用。LSM可以使用该钩子函数执行清理操作、释放任何已持有的资源或记录相关信息,然后再终止任务。

在任务的生命周期中,一些信息可能会发生变化。例如,当任务调用 setuid(2) 等系统调用来更改其用户 ID 时,会触发 task_fix_setuid() 钩子函数。LSM可以拦截这类调用,并执行额外的操作或检查,以确保任务状态的安全性和完整性。

通过使用这些任务钩子函数,LSM可以对任务对基本任务信息的访问进行控制。它能够执行安全策略检查、验证权限,并控制任务相关操作。

通过任务钩子函数,LSM增强了系统的安全性和稳定性。它能够强制访问控制,验证权限,并执行必要的操作,以保持任务相关操作的完整性。

三、LSM IPC hooks

当任务需要访问内核中的 SysV IPC 机制时,内核提供了标准的 SysV IPC 机制,包括共享内存、信号量和消息队列等。这些机制允许进程之间进行通信和共享数据。

LSM(Linux安全模块)为这些 IPC 机制提供了一组钩子函数,用于介入对内核 IPC 对象的访问。这些钩子函数使得 LSM 能够执行安全策略检查、验证权限,并控制与 IPC 对象相关的操作。

ipc_permission() 钩子函数用于检查 IPC 对象的权限。当进程尝试访问 IPC 对象(如共享内存、信号量或消息队列)时,LSM 可以使用该钩子函数验证进程是否具有执行所请求操作的必要权限。

msg_queue_msgrcv() 钩子函数在消息从消息队列中被移除之前进行调用。LSM 可以使用该钩子函数检查权限,确保只有授权的进程才能读取或删除消息队列中的消息。

shm_shmat() 钩子函数在执行 shmat(2) 系统调用之前进行调用,该调用将共享内存段附加到调用进程的数据段。LSM 可以利用该钩子函数检查权限,只允许具有适当权限的进程访问共享内存。

sem_semctl() 钩子函数在对信号量执行指定命令的操作之前进行调用。LSM 可以使用该钩子函数检查权限,并确保只有具有必要权限的进程才能对信号量执行指定的操作。

通过这些 IPC 钩子函数,LSM 增强了对内核 IPC 对象的访问控制和安全性。它可以执行安全策略检查,验证权限,并控制与共享内存、信号量和消息队列相关的操作。

通过 IPC 钩子函数,LSM 可以进行安全性检查、权限验证,并确保系统内 IPC 操作的完整性和安全性。这有助于防止未经授权的访问,强制执行访问控制,并维护系统的安全性和稳定性。

四、LSM Network hooks

网络是Linux中的一个重要方面,尤其是在保护系统免受网络攻击方面,LSM为内核的这个领域提供了扩展的安全性。应用层对网络的访问是通过一系列与套接字相关的钩子函数进行介入的。

针对所有套接字系统调用提供了钩子函数:

bind()connect()listen()accept()sendmsg()recvmsg()getsockname()getpeername()getsockopt()等等。

网络数据通过sk_buff结构在网络栈中传输,LSM为sk_buff提供了不透明的安全字段,以便可以在每个数据包的基础上跨网络层管理安全状态。

LSM通过提供针对网络相关操作的钩子函数,为内核中的网络部分提供了扩展的安全性。通过这些钩子函数,LSM可以介入应用程序层对网络的访问,验证权限,执行安全策略,并控制与套接字相关的系统调用。

钩子函数包括bind()、connect()、listen()、accept()、sendmsg()、recvmsg()、getsockname()、getpeername()、getsockopt()等套接字系统调用。通过这些钩子函数,LSM可以对套接字操作进行安全策略检查、权限验证和控制。

此外,LSM还为不同的网络协议(如IPv4、Unix域、Netlink、InfiniBand和SCTP)实现了更细粒度的钩子函数。这样可以根据不同协议的特性和需求,对网络操作进行更精细的控制和安全策略管理。

在网络数据传输过程中,数据以sk_buff结构的形式在网络栈中进行封装和传递。LSM为sk_buff提供了不透明的安全字段,以便可以在每个数据包的基础上管理安全状态。这样可以确保安全状态在网络层的各个环节中得到维护和传递,从而增强系统对网络攻击的防护能力。

五、LSM Module & System hooks

LSM提供了一个模块化框架,用于增强Linux内核的安全性。它允许集成多个安全模块,每个模块都实现自己的安全策略和机制。

LSM的一个关键方面是能够介入内核模块的加载和卸载过程。这确保只有经过授权和可信任的模块可以加载到内核中,防止未经授权的代码执行和潜在的安全漏洞。

LSM为处理密钥管理操作定义了专门的钩子。这些钩子使LSM模块能够在涉及基于密钥的操作时执行安全策略和权限检查,例如加密、解密和身份验证。

除了密钥管理,LSM还为其他各种关键操作定义了钩子。这包括检查更改系统时间的权限、分配新的虚拟内存映射的权限、访问内核消息环的权限等。通过在这些关键点执行安全检查,LSM有助于防止未经授权或恶意操作,以保护系统的完整性。

LSM与Linux审计框架集成,通过提供钩子函数,允许安全模块参与审计过程。这使得安全相关事件的记录和监控成为可能,有助于系统分析和取证调查。

LSM还扩展了对使用扩展伯克利数据包过滤器(eBPF)及其相关程序的支持。LSM定义了钩子,允许安全模块对使用eBPF程序的策略和限制进行执行,确保eBPF代码的安全和受控执行。

此外,LSM还包括了一组杂项钩子,用于保护上述特定钩子未涵盖的其他安全敏感操作。这些钩子为各种系统活动提供了额外的保护层,确保全面的安全覆盖。

LSM的灵活性和模块化使其成为增强Linux内核安全性的强大框架。通过支持模块加载、密钥管理、关键操作、审计、eBPF集成等功能,LSM能够执行细粒度的安全策略,并帮助保护系统免受各种威胁和攻击。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/104315.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JVM第六讲:JVM 基础 - Java 内存模型引入

JVM 基础 - Java 内存模型引入 很多人都无法区分Java内存模型和JVM内存结构,以及Java内存模型与物理内存之间的关系。本文是JVM第六讲,从堆栈角度引入JMM,然后介绍JMM和物理内存之间的关系, 为后面JMM详解, JVM 内存结构详解, Java 对象模型详…

蓝桥杯基础---切面条

切面条 一根高筋拉面,中间切一刀,可以得到2根面条。 如果先对折1次,中间切一刀,可以得到3根面条。 如果连续对折2次,中间切一刀,可以得到5根面条。 那么,连续对折10次,中间切一刀…

react数据管理之setState与Props

react数据管理之setState与Props setState调用原理 setState 是 React 中用于更新组件状态(state)的方法。它的调用原理可以分为以下几个步骤: 状态的改变:当调用 setState 时,React 会将新的状态对象与当前状态对象…

QT 网络编程 服务端 客户端 QTcpServer

服务端的创建 //创建服务端QTcpServer对象 server new QTcpServer(this);//设置服务端,端口,这里绑定的是主机的所有网卡, server->listen(QHostAddress::Any, 8080);//绑定连接信号与槽 connect(this->server, &QTcpServer::new…

[C++随想录] 继承

继承 继承的引言基类和子类的赋值转换继承中的作用域派生类中的默认成员函数继承与友元继承与静态成员多继承的结构棱形继承的结构棱形虚拟继承的结构继承与组合 继承的引言 概念 继承(inheritance)机制是面向对象程序设计使代码可以 复用的最重要的手段,它允许程序…

Design patterns--观察者模式

设计模式之观察者模式 代码示例 #ifndef OBSERVER_H #define OBSERVER_H#include <map>class Observer { public:Observer();virtual void update(std::map<int, double>) 0; }; #endif // OBSERVER_H#include "observer.h"Observer::Observer() {}#if…

玩转Linux Shell Terminal Tmux

一、Shell编程☘️ 1. Shell指令快捷操作 1. echo # 系统指令 $ echo $(pwd) # 对于系统自带的pwd&#xff0c;此处不能写echo $pwd# 自定义变量 $ foo$(pwd) $ echo $foo # 不同于pwd&#xff0c;对于自定义的foo&#xff0c;不能用$(foo)2. !! # 假设你先执行了以下原本…

python基于django的留学生服务管理平台

留学服务管理平台的用户是系统最根本使用者&#xff0c;按需要分析系统包括三类用户&#xff1a;学生、教师、管理员。这三类用户对系统的需求简要如下。技术栈 后端&#xff1a;pythondjango 前端&#xff1a;vueCSSJavaScriptjQueryelementui 开发语言&#xff1a;Python 框架…

深度学习基础知识 给模型的不同层 设置不同学习率

深度学习基础知识 给模型的不同层 设置不同学习率 1、使用预训练模型时&#xff0c;可能需要将2、学习率设置方式&#xff1a; 1、使用预训练模型时&#xff0c;可能需要将 &#xff08;1&#xff09;预训练好的 backbone 的 参数学习率设置为较小值&#xff0c; &#xff08;2…

自己搭建的若依DEMO地址

自己搭建的若依demo地址 链接: link

深入了解Spring Boot Actuator

文章目录 引言什么是ActuatorActuator的底层技术和原理端点自动配置端点请求处理端点数据提供端点数据暴露 如何使用Actuator添加依赖访问端点自定义端点 实例演示结论 引言 Spring Boot Actuator是一个非常强大且广泛使用的模块&#xff0c;它为Spring Boot应用程序提供了一套…

需永远在线的游戏公司,如何在线替换开源存储?

小帅是一个酷爱游戏的玩家&#xff0c;他玩一款游戏已经很久了&#xff0c;始终乐在其中。 这款游戏风靡全球&#xff0c;在中国手游出海榜单中&#xff0c;长期位居榜首。 他不知道的是&#xff0c;就在他玩游戏的过程中&#xff0c;这款游戏的出品公司&#xff0c;其实已经…

​人机交互中的反馈与前馈

人机交互中的反馈和前馈&#xff0c;是指在用户与机器进行交互的过程中&#xff0c;人机二者对输入的信息做出回应的方式。 反馈&#xff1a;反馈是从机器到人的信息传递过程&#xff0c;主要用于告知用户他们的操作或请求的结果。当用户执行某个操作时&#xff0c;机器通过适当…

云原生之使用Docker部署ServerBee服务器监控工具

云原生之使用Docker部署ServerBee服务器监控工具 一、ServerBee介绍1.1 ServerBee简介1.2 ServerBee特点 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本 四、下载serverbee镜像五、…

oracle、mysql、postgresql数据库的几种表关联方法

简介 在数据开发过程中&#xff0c;常常需要判断几个表直接的数据包含关系&#xff0c;便需要使用到一些特定的关键词进行处理。在数据库中常见的几种关联关系&#xff0c;本文以oracle、mysql、postgresql三种做演示 创建测试数据 oracle -- 创建表 p1 CREATE TABLE p1 (tx…

Java 序列化2

Java 序列化 目录 Java 序列化 序列化对象 反序列化对象 Java 提供了一种对象序列化的机制&#xff0c;该机制中&#xff0c;一个对象可以被表示为一个字节序列&#xff0c;该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。 将序列化对象写入文…

当你在 Tubi 是一位 Tech Lead

在过去&#xff0c;我们邀请了 Tubi 技术团队的许多资深工程师&#xff0c;听他们分享了作为资深工程师的一些故事。今天&#xff0c;我们将镜头转向那些在 Tubi 担任 Tech Lead 的工程师&#xff0c;他们选择了在独立开发之外&#xff0c;承担一定的技术管理工作&#xff1a; …

rust宏

宏看起来和函数很像&#xff0c;只不过名称末尾有一个感叹号 ! 。 宏并不产生函数调用&#xff0c;而是展开成源码&#xff0c;并和程序的其余部分一起被编译。 Rust宏和C不同&#xff0c;Rust的宏会展开为抽象语法树&#xff08;AST&#xff0c;abstract syntax tree&#xff…

SAP PP cs62 提示 输入更改号 - BOM 有历史需求

以上是业务操作人员的 账户 但是IT aLL 这边是warning 不是error 遂去查OSS suim 找 C_STUE_NOH权限对象 赋予权限后 解决了

Hadoop高可用集群(HA)一键启动脚本

高可用集群启动时&#xff0c;需要分别在每个节点上都执行zkServer.sh start启动zookeeper&#xff0c;这个过程比较麻烦&#xff0c;并且当我们节点增多时&#xff0c;这个过程无疑不增加了我们的工作量&#xff0c;因此我们可以写一个一键启动所有节点zookeeper的脚本 脚本实…