CN117312099B - 文件系统事件监控方法 - Google Patents
文件系统事件监控方法 Download PDFInfo
- Publication number
- CN117312099B CN117312099B CN202311598367.3A CN202311598367A CN117312099B CN 117312099 B CN117312099 B CN 117312099B CN 202311598367 A CN202311598367 A CN 202311598367A CN 117312099 B CN117312099 B CN 117312099B
- Authority
- CN
- China
- Prior art keywords
- file
- event
- bpf
- buffer
- perf
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
- 238000000034 method Methods 0.000 title claims abstract description 95
- 238000012544 monitoring process Methods 0.000 title claims abstract description 35
- 238000012216 screening Methods 0.000 claims abstract description 43
- 230000006870 function Effects 0.000 claims description 68
- 230000008569 process Effects 0.000 claims description 59
- 238000012545 processing Methods 0.000 claims description 8
- 238000007781 pre-processing Methods 0.000 claims description 6
- 238000005516 engineering process Methods 0.000 abstract description 7
- 238000012360 testing method Methods 0.000 description 6
- 241000760358 Enodes Species 0.000 description 4
- 238000010586 diagram Methods 0.000 description 4
- 230000009471 action Effects 0.000 description 2
- 230000006978 adaptation Effects 0.000 description 2
- 230000009286 beneficial effect Effects 0.000 description 2
- 238000004364 calculation method Methods 0.000 description 2
- 230000007547 defect Effects 0.000 description 2
- 238000001514 detection method Methods 0.000 description 2
- 238000001914 filtration Methods 0.000 description 2
- 230000007246 mechanism Effects 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 238000009825 accumulation Methods 0.000 description 1
- 238000003491 array Methods 0.000 description 1
- 230000005540 biological transmission Effects 0.000 description 1
- 238000004519 manufacturing process Methods 0.000 description 1
- 101150108030 ppiD gene Proteins 0.000 description 1
- 230000001960 triggered effect Effects 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/30—Monitoring
- G06F11/3089—Monitoring arrangements determined by the means or processing involved in sensing the monitored data, e.g. interfaces, connectors, sensors, probes, agents
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/30—Monitoring
- G06F11/3003—Monitoring arrangements specially adapted to the computing system or computing system component being monitored
- G06F11/302—Monitoring arrangements specially adapted to the computing system or computing system component being monitored where the computing system component is a software system
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/445—Program loading or initiating
- G06F9/44521—Dynamic linking or loading; Link editing at or after load time, e.g. Java class loading
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/448—Execution paradigms, e.g. implementations of programming paradigms
- G06F9/4488—Object-oriented
- G06F9/449—Object-oriented method invocation or resolution
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/54—Interprogram communication
- G06F9/542—Event management; Broadcasting; Multicasting; Notifications
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Quality & Reliability (AREA)
- Computing Systems (AREA)
- Mathematical Physics (AREA)
- Multimedia (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
- Debugging And Monitoring (AREA)
Abstract
文件系统事件监控方法,在用户空间获取筛选参数,将BPF程序加载至内核空间,循环检查perf buffer输出的事件数据,在内核空间,当事件触发了BPF程序挂载的kprobe点位后,获取对应的dentry指针,并对事件进行筛选,满足条件时将事件数据通过perf buffer输出至用户空间。本发明可使市面现存的大量5.17版本以下的Linux内核系统能够利用ebpf技术对指定路径前缀的文件操作进行高效监控,可在手段受限的linux系统环境中迅速定位到文件被未知程序更改、删除重建等问题。
Description
技术领域
本发明涉及文件系统事件监控方法,具体涉及基于ebpf字符串比较方法的文件系统事件监控方法。
背景技术
在基于linux系统的服务器环境中经常有文件被未知程序更改、删除重建等问题。对于此问题的现有常见监控手段包括:
1、利用inotify子系统监控文件变更。此方案仅能获知文件被改变了,但无法得到与操作目标文件的进程相关的信息。
2、利用auditd系统服务监控文件变更。此方案可以获取操作目标文件的进程的相关信息,但需要开启auditd服务,在部分生产环境中不被允许。
3、利用ftrace工具监控文件变更。此方案可以获取操作目标文件的进程相关信息,但其对参数的处理手段受限,不能进行较复杂过滤,显示的内容受限,输出的日志格式也不够友好。
随着EBPF技术在linux系统上的逐渐完善,利用C代码编程以获取并处理内核数据成为可能。现有专利《一种基于EBPF的Linux系统事件监控方法及装置》(CN116107846A)即利用此技术实现了监控功能。
但现有专利所包含的方法未对递归深度进行限制,在部分场景下可能输出大量无效信息。同时,其所举实施例按iNode识别文件,在部分场景下亦存在不足:
1、当需要持续监控某会被删除重建的路径时,目标iNode会改变,导致无法继续监控目标路径。
2、linux系统中部分文件系统的iNode会被再次使用,若在原监控目标被删除还未重建的间隙恰好有同文件系统的其他文件/目录被创建,可能会占用原监控目标的iNode号,导致后续监控错误的目标。
因此,上述现有方案存在获取信息有限、部署动作大或适应场景有限等问题。
并且,被监控文件存在删除重建动作的场景中最适宜的方案是判断路径字符串是否一致,但由于BPF规则限制,在版本低于5.17的linux内核上无法直接在bpf程序中进行字符串比较。以至于市面现存的大量低于5.17的内核的服务器系统无法完全利用ebpf技术监控系统上的文件系统事件。
发明内容
为解决已有技术存在的不足,本发明提供了一种文件系统事件监控方法,包括如下步骤:
在用户空间中:
步骤S1:获取用户输入参数,并对文件路径进行预处理,获得筛选参数;
其中,用户输入参数包括:用户欲监控的文件路径、是否递归、递归层级、目标文件的iNode、目标进程的pid。
筛选参数包括:目标文件的iNode、目标进程的pid、预处理后的文件路径prefix、文件路径深度prefix_depth、递归深度;
步骤S2:加载BPF程序至内核空间指定的kprobe点位,并获取 BPF map的文件描述符;
步骤S3:将步骤S1中获得的筛选参数通过BPF map传递给内核空间的BPF程序;
步骤S4:循环检查BPF_MAP_TYPE_PERF_EVENT_ARRAY类型的BPF map,即perfbuffer,对BPF程序传递出来的事件数据进行处理并二次判断,若文件路径符合监控范围则输出事件数据;
事件数据包括:事件所涉及进程信息、操作类型、事件所涉及文件iNode、事件所涉及文件完整路径;
事件所涉及进程信息包括进程名和进程pid;
在内核空间中:
步骤Sa:在系统中任一进程调用vfs层函数时,挂载到对应kprobe点位的BPF程序将被执行,获取本次调用目标文件对应的dentry指针,将dentry指针及可以代表操作类型的枚举值作为参数,调用自定义函数trace_handle;
步骤Sb:自定义函数trace_handle通过kprobe点位被调用,进而通过内核提供的ebpf接口获取与本次调用事件相关的进程信息和文件信息;根据用户空间在步骤S3传递至内核空间的筛选参数对所获取的事件相关的进程信息及文件信息进行初步筛选,若通过筛选则将事件数据整理并通过perf buffer发送给用户空间,供用户空间进一步处理;
其中,所获取的文件信息包括文件iNode、路径深度和路径各级文件名;
所获取的进程信息包括事件所涉及进程的pid和进程名。
其中, 对文件路径的预处理包括:
步骤S11:将文件路径字符串按'/'分割,得到一字符串数组,获取其长度,即文件路径深度prefix_depth;
步骤S12:倒序遍历字符串数组并将字符串以\0拼接获取字符串prefix。
其中,所述步骤S2包括:
步骤S21:利用libbpf提供的bpf__open_and_load函数从内存中加载BPF程序,同时创建所需BPFmap;包括一个BPF_MAP_TYPE_PERF_EVENT_ARRAY类型的BPFmap,命名为perfbuffer以及一个BPF_MAP_TYPE_HASH类型的BPFmap,命名为mapFilter;
步骤S22:利用libbpf提供的bpf_attach函数将BPF程序挂载至内核空间指定的kprobe点位,该点位涉及vfs层函数中的相关函数,以便在系统中任一进程调用vfs层函数时,挂载到对应kprobe点位的BPF程序能被执行;
步骤S23:利用libbpf提供的perf_buffer__new,以perf buffer的文件描述符及handle_event函数做为参数,创建一个pref_buffer结构体,通过pref_buffer结构体将pref_buffer与回调函数handle_event绑定,以便BPF程序后续通过perf buffer将事件数据从内核空间传递给用户空间程序,其中,perf buffer的文件描述符通过bpf_map__fd函数获取;
步骤S24:利用libbpf提供的bpf_map__fd函数获取mapFilter的文件描述符,其中mapFilter是一个BPF_MAP_TYPE_HASH类型的BPF map,以便后续通过mapFilter完成步骤S3。
其中,所述步骤S4包括:循环利用libbpf提供的perf_buffer__poll函数检查perfbuffer中是否存在事件:
若存在,则调用handle_event函数对事件数据解析并判断是否需要输出;
若不存在,则在perf_buffer__poll函数中等待100ms的超时时间;
在perf_buffer__poll返回后,通过其返回值判断perf_buffer__poll函数是否返回错误,若返回错误则报错并退出,若无错则进行下一次循环。
其中,所述步骤S22中,bpf程序挂载至内核空间指定的kprobe点位包括vfs_open,vfs_write、vfs_read、vfs_unlink、vfs_rename、vfs_mkdir及vfs_rmdir函数处的kprobe点位。
其中,所述步骤Sb中,自定义函数trace_handle通过如下步骤根据步骤S3中所涉及到的筛选参数对事件进行筛选:
步骤Sb1:检查mapFilter中是否存在用户空间程序放入的筛选参数,若不存在则忽略本次事件;
步骤Sb2:若筛选参数中包含pid,则获取本次事件相关进程的pid并与之对比,若不相等则忽略本次事件;
步骤Sb3:若筛选参数中包含iNode,则通过dentry结构体指针读取本次事件所涉及文件的iNode并与之对比,若不相等则忽略本次事件;
步骤Sb4:通过dentry结构体向根遍历一次,获取本次事件所涉及文件的路径深度,若路径深度不在欲监控的路径范围内,则忽略本次事件;
步骤Sb5:通过dentry结构体向根遍历,在遍历过程中,若当前遍历到的路径深度小于等于prefix_depth,则获取当前遍历到的层级的文件名所对应的字符串,并与prefix中对应层级的字符串做比较,若任意层级字符串不同则忽略本次事件;
步骤Sb6:将经过步骤Sb1-Sb5判断的事件数据通过perf buffer发送给用户空间,供用户空间进一步处理。
其中,所述步骤Sb5中,通过如下方法将每个层级的文件名所对应的字符串与prefix中对应层级的字符串做比较:利用bpf_probe_read_kernel_str将参与比较的字符串拷贝至定长的临时空间buf;遍历此定长空间,计算每个字节的十进制值该字节在空间中的位置序号,并求和,比较每个层级的文件名所对应的字符串与prefix中对应层级的字符串的求和值是否相等。
其中,所述步骤Sb4中,路径深度不在欲监控的路径范围内的判断标准为:事件所涉及文件的路径深度不在区间[筛选参数中的路径深度, 筛选参数中的路径深度+筛选参数中的递归深度]内。
本发明可使市面现存的大量5.17版本以下的Linux内核系统能够利用ebpf技术对指定路径前缀的文件操作进行高效监控,可在手段受限的linux系统环境中迅速定位到文件被未知程序更改、删除重建等问题。
附图说明
图1:本发明的文件系统事件监控方法的逻辑流程图。
图2:本发明的文件系统事件监控方法中文件路径预处理的逻辑流程图。
图3:本发明的文件系统事件监控方法中用户空间的逻辑流程图。
图4:本发明的文件系统事件监控方法中内核空间的逻辑流程图。
具体实施方式
为了对本发明的技术方案及有益效果有更进一步的了解,下面结合附图详细说明本发明的技术方案及其产生的有益效果。
本发明中,所涉及到的技术术语解释及约定如下:
EBPF:是一种可以在 Linux内核中运行的用户编写的程序,而不需要修改内核代码或加载内核模块的技术。简单说,EBPF让 Linux 内核变得可编程化了。
Kprobe:利用kprobe技术,用户可以自定义自己的回调函数,可以在几乎所有的函数中动态插入探测点,当内核执行流程执行到指定的探测函数时,会调用该回调函数,用户即可收集所需的信息,同时内核最后还会回到原本的正常执行流程,通过所述Kprobe可以知道内核函数是否被调用、被调用上下文、入参以及返回值等信息。
ftrace:Linux提供的内核特性,允许跟踪kprobe等内核点位,但可配置性(筛选条件,输出格式等)受限,且配置复杂。
inotify:Linux提供了Inotify机制,以允许应用程序监控文件事件,但其无法获取到进行文件操作的进程信息。
auditd:Linux系统上的审计工具,有较强的功能,但在用户空间需要部署额外服务。
iNode:通常意为Inode number,在同一个linux系统中每个文件的iNode号唯一,iNode号可能会被重复使用。
BPFmap:BPFmap允许运行在内核空间的bpf程序与用户空间程序借此进行数据传输,按照用途有多种类型,例如BPF_MAP_TYPE_HASH及BPF_MAP_TYPE_PERF_EVENT_ARRAY。
本发明提供了一种适用于低于5.17版本linux内核的ebpf字符串比较方法,及基于此方法的linux文件系统事件监控方法,能够解决现有文件监控方法存在的获取信息有限、部署动作大或适应场景有限等问题。
图1为本发明的文件系统事件监控方法的逻辑流程图,如图1所示,监控方法分为用户空间和内核空间两部分。
在用户空间中:
1、通过命令行(或标准输入、读取文件等其他输入方式)获取用户输入参数,包括用户欲监控的文件路径、是否递归、递归层级、目标文件的iNode(若有)、目标进程的pid(若有)。并对文件路径进行预处理,获得筛选参数,包括目标文件的iNode、目标进程的pid、经预处理后的文件路径prefix、文件路径深度prefix_depth、递归深度。
2、利用libbpf提供的bpf__open_and_load函数加载BPF程序至内核空间并将其挂在至内核空间指定的kprobe点位,此步骤会自动创建所需的BPFmap,BPFmap包括一个BPF_MAP_TYPE_HASH类型的BPF map,命名为mapFilter,以及一个BPF_MAP_TYPE_PERF_EVENT_ARRAY类型的BPF map,命名为perf buffer。
3、获取perf buffer(一个BPF_MAP_TYPE_PERF_EVENT_ARRAY类型的BPF map)的文件描述符,并初始化一个perf_buffer结构体。此结构体用于将perf buffer与回调函数handle_event绑定。
4、获取mapFilter(一个BPF_MAP_TYPE_HASH类型的BPF map)的文件描述符。在用户空间中,此文件描述符代表BPF map本身,用户空间程序对BPF map的操作需指定文件描述符才能进行。
5、将步骤S1中所得的筛选参数通过mapFilter(一个BPF_MAP_TYPE_HASH类型的BPF map)传递给内核空间的BPF程序。
6、循环检查perf buffer(一个BPF_MAP_TYPE_PERF_EVENT_ARRAY类型的BPFmap),对BPF程序传递出来的事件数据进行处理并二次判断。
7、若文件路径符合监控范围则将事件数据打印至屏幕(或以其他方式输出)。
在内核空间中:
1、从mapFilter中获取筛选参数。
2、任一进程调用BPF程序挂载的kprobe点位所对应的vfs层函数时(包括vfs_open,vfs_write、vfs_read、vfs_unlink、vfs_rename、vfs_mkdir及vfs_rmdir函数),将触发BPF程序,获取本次调用事件相关的进程信息(pid,进程名)和文件信息(iNode,路径深度,路径各级文件名)。
3、若筛选参数中包含pid或inode,则判断pid或inode是否匹配。若不匹配则忽略本次事件。
4、获取本次事件所涉及文件的路径深度,若路径深度不匹配,即事件所涉及文件的路径深度不在区间[筛选参数中的路径深度, 筛选参数中的路径深度+筛选参数中的递归深度]内,则忽略本次事件。
5、初步检查所涉及文件的路径与用户给定路径是否匹配(包括两大部分:对比路径深度并逐步判断当前路径层级所涉及文件字符串是否匹配)。若不匹配则忽略本次事件。
6、将本次事件的事件数据整理为结构体并通过perf buffer发送给用户空间。
一个具体的实施方式如下:
参见图3所示,在用户空间:
1、获取并初始化参数:
(1)解析命令行参数,获取用户输入数据,包括欲监控进程的pid,欲监控文件的inode,是否递归,递归层级,文件监控路径五个参数,其中文件监控路径为必选,其他为可选参数。
(2)对路径进行预处理(见图2):
将文件路径字符串按'/'分割,得到一字符串数组,获取其长度prefix_depth。倒序遍历字符串数组并将字符串以\0拼接获取字符串prefix。
2、加载BPF程序至内核空间并在用户空间获取BPFmap的描述符:
(1)利用libbpf提供的bpf__open_and_load函数从内存中加载bpf程序。
(2)利用libbpf提供的bpf_attach函数将bpf程序挂载至内核空间指定的kprobe点位,指定的kprobe点位包括vfs层函数中的vfs_open,vfs_write、vfs_read、vfs_unlink、vfs_rename、vfs_mkdir及vfs_rmdir函数处的kprobe点位,以便在系统任一进程调用vfs层函数时,挂载到对应kprobe点位的BPF程序能被执行。
(3)利用libbpf提供的perf_buffer__new以perf buffer的文件描述符及handle_event函数做为参数,创建一个pref_buffer结构体,通过pref_buffer结构体将pref_buffer与回调函数handle_event绑定,以便BPF程序后续通过perf buffer将事件数据从内核空间传递给用户空间程序,其中,perf buffer的文件描述符通过bpf_map__fd函数获取。
(4)利用libbpf提供的bpf_map__fd函数获取mapFilter的文件描述符。其中mapFilter是一个BPF_MAP_TYPE_HASH类型的BPF map,以便后续通过mapFilter完成步骤3。
其中,libbpf是一个开源的基于c的库,为用户空间程序和BPF程序均提供了api以简化代码编写。利用libbpf编写程序的运行所需资源相较于BCC更少,同时其支持BPF CO-RE机制,可避免BCC在运行时对编译器的需求。
3、将prefix、prefix_depth及1.(1)中提到的四个可选参数整理为结构体,获得筛选参数并放入mapFilter以传递给BPF程序。
4、循环利用libbpf提供的perf_buffer__poll函数检查perf buffer中是否存在事件:
(1)若存在事件,则会调用handle_event函数:
从perf buffer中获取BPF程序写入的事件数据;
从数据中解析出事件所涉及进程的pid、进程名、操作类型、文件路径、文件iNode;
二次判断文件路径是否符合监控范围,若不符合则忽略本次事件;
将所解析出的事件数据(即事件所涉及进程的pid、进程名、操作类型、文件路径、文件iNode)格式化输出至屏幕(或其他方式输出);
(2)若不存在事件,在perf_buffer__poll函数中等待100ms的超时时间以检查perf buffer中是否有事件;
(3)无论是否存在事件,以及事件是否符合监控范围,在步骤(1)和(2)执行完毕后,均判断perf_buffer__poll是否返回错误(对应图3中“检查perf buffer是否出现错误”),若有则报错退出,否则进行下一次循环。
5、当检查当前进程ppid(即父进程的pid)为1,意味着启动程序的进程(用户直接运行程序时父进程是bash等终端程序;其他需要利用此程序实现文件监控功能的进程调用时,该进程为父进程)退出,此程序也主动退出。(对应图3中“用户主动退出”则结束,“用户未主动退出”则继续等待100ms的逻辑)。
请参见图4所示,在内核空间:
1、在vfs_open,vfs_write,vfs_read,vfs_unlink,vfs_rename,vfs_mkdir,vfs_rmdir函数处的kprobe点位挂载了自定义函数,功能为:
(1)在系统中任一进程调用上述函数时,挂载到该函数处的kprobe点位的BPF程序将被执行,进而利用libbpf提供的PT_REGS_PARM2_CORE等宏从寄存器或堆栈中直接获取与本次调用事件所涉及文件相关的dentry结构体指针,或取得相关联结构体指针并经过一级或多级指针偏移计算转换为dentry结构体指针;
(2)以dentry结构体指针与可以代表操作类型的枚举值作为参数调用自定义函数trace_handle。
linux系统中,每个文件均存在一个对应的dentry结构体,该结构体存放inode对象指针,文件名字符串、指向父目录dentry结构体的指针等信息。本发明所提出的方法中,dentry结构体主要用于获取文件名、文件iNode,文件路径(路径深度及各级文件名)。
2、在trace_handle函数中:
通过kprobe点位被调用,进而获取与本次调用事件相关的进程信息和文件信息;根据用户空间在步骤S3传递至内核空间的筛选参数对所获取的事件相关的进程信息及文件信息进行初步筛选,若通过筛选则将事件数据整理为结构体并通过perf buffer发送给用户空间,供用户空间做进一步处理,具体筛选步骤如下:
(1)检查mapFilter中是否存在用户空间程序放入的筛选参数,若不存在则忽略本次事件;
(2)若筛选参数中包含pid,则获取本次事件相关进程的pid并与之对比,若不相等则忽略本次事件;
(3)若筛选参数中包含iNode,则通过dentry结构体指针读取本次事件所涉及文件的iNode并与之对比,若不相等则忽略本次事件;
(4)通过dentry结构体向根遍历一次,获取本次事件所涉及文件的路径深度。若路径深度不在欲监控的路径范围内(即事件所涉及文件的路径深度不在区间[筛选参数中的路径深度, 筛选参数中的路径深度+筛选参数中的递归深度]内),则忽略本次事件;
(5)5.17版本以下的linux内核中不支持BPF中执行字符串对比函数,且由于BPF程序限制需要在编译时确定代码安全,不能将变量作为循环终止条件且多数情况下不能将变量作为下标访问数组。因此通常的字符串对比方式无法通过编译。而将数据不经筛选地全部通过BPFmap输出到用户空间再筛选会产生大量无效操作造成性能浪费;用户空间程序处理慢又会导致数据堆积或丢失。为解决上述问题,提出一种适用于5.17版本以下linux内核的BPF字符串对比方式:
利用bpf_probe_read_kernel_str将参与比较的字符串其一拷贝至定长的临时空间buf;
遍历此定长空间,计算每个字节的十进制值该字节在空间中的位置序号,并求和。即/>其中n为定长空间长度,i为每个字节位置,a[i]为第i个字节的十进制值;
对参与比较的字符串其二也如上操作得到csum2;
若csum1与csum2相同,则两个字符串有较大概率相同。因此,本发明在内核空间中的一个定长内存空间进行csum计算,通过固定指令数量以规避eBPF校验器对循环体及内存访问的限制。
(6)通过dentry结构体向根遍历,在遍历过程中,若当前遍历到的路径深度小于等于prefix_depth,则获取当前遍历到的层级的文件名所对应的字符串,并与prefix中对应层级的字符串做比较。若任意层级字符串不同则忽略本次事件。
此步骤对应图4中“目录各层级csum与用户输入前缀的相应层级csum相同”。
假设某次监控的prefix为/root/test。 层级结构为 “/”->”root”->”test”,prefix_depth为3。
某次事件目标文件的路径为/root/test/test2/test3。层级结构为”/”->”root”->”test”->”test2”->”test3”,深度为5。
“通过dentry向根遍历”从“test3”开始,遍历至“test3”、“test2”时不作额外操作。当遍历至“test”时,由于当前在第3层级,能在prefix中找到对应层级的字符串,开始进行字符串比较。若不一致则忽略,若一致则继续遍历直至“/”。
(7)若通过了上述判断,则本次事件大概率是所需要的事件。收集事件数据,包括所涉及进程pid、进程名、操作类型、所涉及文件inode,文件路径(通过dentry再次向根遍历并拼接各层级文件名以收集完整路径),并通过perf buffer输出至用户空间。
本发明可使市面现存的大量5.17版本以下的Linux内核系统能够利用ebpf技术对指定路径前缀的文件操作进行高效监控,可在手段受限的linux系统环境中迅速定位到文件被未知程序更改、删除重建等问题。
虽然本发明已利用上述较佳实施例进行说明,然其并非用以限定本发明的保护范围,任何本领域技术人员在不脱离本发明的精神和范围之内,相对上述实施例进行各种变动与修改仍属本发明所保护的范围,因此本发明的保护范围以权利要求书所界定的为准。
Claims (5)
1.文件系统事件监控方法,其特征在于,包括如下步骤:
在用户空间中:
步骤S1:获取用户输入参数,并对文件路径进行预处理,获得筛选参数;
其中,用户输入参数包括:用户欲监控的文件路径、是否递归、递归层级、目标文件的iNode、目标进程的pid;
筛选参数包括:目标文件的iNode、目标进程的pid、预处理后的文件路径prefix、文件路径深度prefix_depth、递归深度;
步骤S2:加载BPF程序至内核空间指定的kprobe点位,并获取 BPF map的文件描述符;
步骤S3:将步骤S1中获得的筛选参数通过BPF map传递给内核空间的BPF程序;
步骤S4:循环检查BPF_MAP_TYPE_PERF_EVENT_ARRAY类型的BPF map,即perf buffer,对BPF程序传递出来的事件数据进行处理并二次判断,若文件路径符合监控范围则输出事件数据;
事件数据包括:事件所涉及进程信息、操作类型、事件所涉及文件iNode、事件所涉及文件完整路径;
事件所涉及进程信息包括进程名和进程pid;
在内核空间中:
步骤Sa:在系统中任一进程调用vfs层函数时,挂载到对应kprobe点位的BPF程序将被执行,获取本次调用目标文件对应的dentry指针,将dentry指针及可以代表操作类型的枚举值作为参数,调用自定义函数trace_handle;
步骤Sb:自定义函数trace_handle通过kprobe点位被调用,进而通过内核提供的ebpf接口获取与本次调用事件相关的进程信息和文件信息;根据用户空间在步骤S3传递至内核空间的筛选参数对所获取的事件相关的进程信息及文件信息进行初步筛选,若通过筛选则将事件数据整理并通过perf buffer发送给用户空间,供用户空间进一步处理;
其中,所获取的文件信息包括文件iNode、路径深度和路径各级文件名;
所获取的进程信息包括事件所涉及进程的pid和进程名;
对文件路径的预处理包括:
步骤S11:将文件路径字符串按'/'分割,得到一字符串数组,获取其长度,即文件路径深度prefix_depth;
步骤S12:倒序遍历字符串数组并将字符串以\0拼接获取字符串prefix;
所述步骤S2包括:
步骤S21:利用libbpf提供的bpf__open_and_load函数从内存中加载BPF程序,同时创建所需BPFmap;包括一个BPF_MAP_TYPE_PERF_EVENT_ARRAY类型的BPFmap,命名为perfbuffer以及一个BPF_MAP_TYPE_HASH类型的BPFmap,命名为mapFilter;
步骤S22:利用libbpf提供的bpf_attach函数将BPF程序挂载至内核空间指定的kprobe点位,该点位涉及vfs层函数中的相关函数,以便在系统中任一进程调用vfs层函数时,挂载到对应kprobe点位的BPF程序能被执行;
步骤S23:利用libbpf提供的perf_buffer__new,以perf buffer的文件描述符及handle_event函数做为参数,创建一个pref_buffer结构体,通过pref_buffer结构体将pref_buffer与回调函数handle_event绑定,以便BPF程序后续通过perf buffer将事件数据从内核空间传递给用户空间程序,其中,perf buffer的文件描述符通过bpf_map__fd函数获取;
步骤S24:利用libbpf提供的bpf_map__fd函数获取mapFilter的文件描述符,其中mapFilter是一个BPF_MAP_TYPE_HASH类型的BPF map,以便后续通过mapFilter完成步骤S3;
所述步骤Sb中,自定义函数trace_handle通过如下步骤根据步骤S3中所涉及到的筛选参数对事件进行筛选:
步骤Sb1:检查mapFilter中是否存在用户空间程序放入的筛选参数,若不存在则忽略本次事件;
步骤Sb2:若筛选参数中包含pid,则获取本次事件相关进程的pid并与之对比,若不相等则忽略本次事件;
步骤Sb3:若筛选参数中包含iNode,则通过dentry结构体指针读取本次事件所涉及文件的iNode并与之对比,若不相等则忽略本次事件;
步骤Sb4:通过dentry结构体向根遍历一次,获取本次事件所涉及文件的路径深度,若路径深度不在欲监控的路径范围内,则忽略本次事件;
步骤Sb5:通过dentry结构体向根遍历,在遍历过程中,若当前遍历到的路径深度小于等于prefix_depth,则获取当前遍历到的层级的文件名所对应的字符串,并与prefix中对应层级的字符串做比较,若任意层级字符串不同则忽略本次事件;
步骤Sb6:将经过步骤Sb1-Sb5判断的事件数据通过perf buffer发送给用户空间,供用户空间进一步处理。
2.如权利要求1所述的文件系统事件监控方法,其特征在于,所述步骤S4包括:循环利用libbpf提供的perf_buffer__poll函数检查perf buffer中是否存在事件:
若存在,则调用handle_event函数对事件数据解析并判断是否需要输出;
若不存在,则在perf_buffer__poll函数中等待100ms的超时时间;
在perf_buffer__poll返回后,通过其返回值判断perf_buffer__poll函数是否返回错误,若返回错误则报错并退出,若无错则进行下一次循环。
3.如权利要求1所述的文件系统事件监控方法,其特征在于,所述步骤S22中,bpf程序挂载至内核空间指定的kprobe点位包括vfs_open,vfs_write、vfs_read、vfs_unlink、vfs_rename、vfs_mkdir及vfs_rmdir函数处的kprobe点位。
4.如权利要求1所述的文件系统事件监控方法,其特征在于,所述步骤Sb5中,通过如下方法将每个层级的文件名所对应的字符串与prefix中对应层级的字符串做比较:利用bpf_probe_read_kernel_str将参与比较的字符串拷贝至定长的临时空间buf;遍历此定长空间,计算每个字节的十进制值 该字节在空间中的位置序号,并求和,比较每个层级的文件名所对应的字符串与prefix中对应层级的字符串的求和值是否相等。
5.如权利要求4所述的文件系统事件监控方法,其特征在于,所述步骤Sb4中,路径深度不在欲监控的路径范围内的判断标准为:事件所涉及文件的路径深度不在区间[筛选参数中的路径深度, 筛选参数中的文件路径深度+筛选参数中的递归深度]内。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311598367.3A CN117312099B (zh) | 2023-11-28 | 2023-11-28 | 文件系统事件监控方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311598367.3A CN117312099B (zh) | 2023-11-28 | 2023-11-28 | 文件系统事件监控方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN117312099A CN117312099A (zh) | 2023-12-29 |
CN117312099B true CN117312099B (zh) | 2024-04-05 |
Family
ID=89285076
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202311598367.3A Active CN117312099B (zh) | 2023-11-28 | 2023-11-28 | 文件系统事件监控方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN117312099B (zh) |
Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110955631A (zh) * | 2018-09-26 | 2020-04-03 | 上海瑾盛通信科技有限公司 | 文件访问追踪方法、装置、存储介质及终端 |
CN114662102A (zh) * | 2022-03-16 | 2022-06-24 | 亚信科技(成都)有限公司 | 一种文件处理方法、装置及存储介质 |
CN115840938A (zh) * | 2023-02-21 | 2023-03-24 | 山东捷讯通信技术有限公司 | 一种文件监控的方法及装置 |
CN116107846A (zh) * | 2023-04-12 | 2023-05-12 | 北京长亭未来科技有限公司 | 一种基于EBPF的Linux系统事件监控方法及装置 |
CN116415300A (zh) * | 2023-04-13 | 2023-07-11 | 中国工商银行股份有限公司 | 基于eBPF的文件保护方法、装置、设备和介质 |
US11709720B1 (en) * | 2022-02-25 | 2023-07-25 | Datadog, Inc. | Protocol for correlating user space data with kernel space data |
CN117076338A (zh) * | 2023-10-18 | 2023-11-17 | 麒麟软件有限公司 | 基于kprobe的linux内核动态调试方法及系统 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US11928529B2 (en) * | 2021-10-21 | 2024-03-12 | New Relic, Inc. | High-throughput BPF map manipulations with uprobes |
-
2023
- 2023-11-28 CN CN202311598367.3A patent/CN117312099B/zh active Active
Patent Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110955631A (zh) * | 2018-09-26 | 2020-04-03 | 上海瑾盛通信科技有限公司 | 文件访问追踪方法、装置、存储介质及终端 |
US11709720B1 (en) * | 2022-02-25 | 2023-07-25 | Datadog, Inc. | Protocol for correlating user space data with kernel space data |
CN114662102A (zh) * | 2022-03-16 | 2022-06-24 | 亚信科技(成都)有限公司 | 一种文件处理方法、装置及存储介质 |
CN115840938A (zh) * | 2023-02-21 | 2023-03-24 | 山东捷讯通信技术有限公司 | 一种文件监控的方法及装置 |
CN116107846A (zh) * | 2023-04-12 | 2023-05-12 | 北京长亭未来科技有限公司 | 一种基于EBPF的Linux系统事件监控方法及装置 |
CN116415300A (zh) * | 2023-04-13 | 2023-07-11 | 中国工商银行股份有限公司 | 基于eBPF的文件保护方法、装置、设备和介质 |
CN117076338A (zh) * | 2023-10-18 | 2023-11-17 | 麒麟软件有限公司 | 基于kprobe的linux内核动态调试方法及系统 |
Non-Patent Citations (1)
Title |
---|
基于操作系统eBPF在云原生环境下的技术研究;高巍;《电子技术与软件工程》;第70-74页 * |
Also Published As
Publication number | Publication date |
---|---|
CN117312099A (zh) | 2023-12-29 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US7243346B1 (en) | Customized library management system | |
US7490167B2 (en) | System and method for platform and language-independent development and delivery of page-based content | |
US8495572B2 (en) | Apparatus and method for identifying contextual changes in source code | |
US7493332B2 (en) | Storing locally a file received from a remote location | |
US7441010B2 (en) | Method and system for determining the availability of in-line resources within requested web pages | |
US20050132346A1 (en) | Software interface monitor method and system | |
US20030093420A1 (en) | Method and system for retrieving sharable information using a hierarchically dependent directory structure | |
WO2007117514A1 (en) | Mobile device capable of multiple updates | |
JP2001147826A (ja) | 一次メモリのハッシュインデックスからオブジェクトをロードするための装置及び方法 | |
CN111324619B (zh) | 微服务系统中的对象更新方法、装置、设备和存储介质 | |
US20040233237A1 (en) | Development environment for DSP | |
CN112363953B (zh) | 基于爬虫技术和规则引擎的接口测试用例生成方法及系统 | |
CN114115838A (zh) | 一种基于分布式组件和云平台的数据交互方法及系统 | |
CN114168421A (zh) | 基于微服务调用链的客户化代码兼容性分析系统及方法 | |
CN112463303A (zh) | Java虚拟机类加载方法及系统 | |
CN110543427A (zh) | 测试用例存储方法、装置、电子设备及存储介质 | |
CN116911588A (zh) | 业务流程执行方法、装置、设备及存储介质 | |
Cox et al. | The Go programming language and environment | |
CN117312099B (zh) | 文件系统事件监控方法 | |
CN115687161B (zh) | 基于扫描maven仓库自动生成接口测试用例的方法 | |
US7389515B1 (en) | Application deflation system and method | |
CN111273940B (zh) | 将程序文件上传至代码仓库的方法及装置 | |
CN111273944B (zh) | 生成程序文件并上传至代码仓库的方法及装置 | |
CN115543848A (zh) | 一种多容器环境代码覆盖率测试系统及其测试方法 | |
CN118152093A (zh) | 实现系统间统一批量调度的方法及系统 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |