当前位置: 首页 > article >正文

手把手教你用C语言写一个Linux文件监控工具:基于fanotify的实战教程

从零构建Linux文件监控工具fanotify深度实践指南1. 为什么选择fanotify而非inotify在Linux系统监控领域inotify曾是文件监控的事实标准但它在现代安全需求面前逐渐显露出局限性。fanotify作为内核2.6.36引入的增强机制提供了三个关键优势权限拦截能力能在文件打开/访问前进行决策FAN_OPEN_PERM事件全局监控模式支持对整个挂载点监控FAN_MARK_MOUNT标志优先级系统多监听程序可通过FAN_CLASS_PRE_CONTENT等分级协作实际测试数据显示监控/usr/bin目录时inotify需要为每个文件单独设置watch描述符约2000个fanotify只需单个挂载点监控1个标记// 典型inotify初始化 int inotify_fd inotify_init(); inotify_add_watch(inotify_fd, /usr/bin/vi, IN_ACCESS); // 等效fanotify初始化 int fan_fd fanotify_init(FAN_CLASS_CONTENT, O_RDONLY); fanotify_mark(fan_fd, FAN_MARK_ADD|FAN_MARK_MOUNT, FAN_ACCESS, AT_FDCWD, /usr/bin);2. 核心API实战解析2.1 fanotify_init建立监控通道这个系统调用创建了与内核通信的文件描述符关键参数组合决定监控行为参数组合适用场景典型应用FAN_CLASS_NOTIF纯事件通知日志审计系统FAN_CLASS_CONTENT内容扫描杀毒软件FAN_REPORT_FID文件句柄报告分布式存储系统常见踩坑点缺少CAP_SYS_ADMIN权限会导致初始化失败非阻塞模式O_NONBLOCK可能造成事件丢失// 推荐的安全初始化方式 int fan_fd fanotify_init(FAN_CLASS_CONTENT|FAN_NONBLOCK, O_RDONLY|O_LARGEFILE); if (fan_fd 0) { perror(fanotify_init failed); exit(EXIT_FAILURE); }2.2 fanotify_mark配置监控目标这个调用支持六种监控模式通过flags参数组合实现文件级监控默认精确监控单个文件目录直接子项FAN_EVENT_ON_CHILD监控目录直接子项挂载点全局FAN_MARK_MOUNT监控整个文件系统// 监控/home及其直接子项 fanotify_mark(fan_fd, FAN_MARK_ADD|FAN_MARK_ONLYDIR, FAN_OPEN|FAN_EVENT_ON_CHILD, AT_FDCWD, /home); // 全局监控整个根文件系统 fanotify_mark(fan_fd, FAN_MARK_ADD|FAN_MARK_MOUNT, FAN_ACCESS_PERM, AT_FDCWD, /);3. 构建完整监控守护进程3.1 事件处理核心逻辑典型事件处理循环包含三个关键阶段事件捕获通过read()获取元数据路径解析转换fd为可读路径决策响应对权限事件做出判断while (1) { struct fanotify_event_metadata *metadata; char path[PATH_MAX]; // 读取事件元数据 len read(fan_fd, buf, sizeof(buf)); metadata (void *)buf; // 解析文件路径 snprintf(proc_path, sizeof(proc_path), /proc/self/fd/%d, metadata-fd); path_len readlink(proc_path, path, sizeof(path)-1); // 处理权限事件 if (metadata-mask FAN_OPEN_PERM) { struct fanotify_response response { .fd metadata-fd, .response should_allow(path) ? FAN_ALLOW : FAN_DENY }; write(fan_fd, response, sizeof(response)); } close(metadata-fd); }3.2 性能优化技巧批处理忽略标记对已验证文件设置FAN_MARK_IGNORED_MASK事件过滤在内核态通过fanotify_mark减少无效事件异步IO结合epoll处理高并发场景// 设置忽略标记优化性能 if (clean_file(path)) { fanotify_mark(fan_fd, FAN_MARK_ADD|FAN_MARK_IGNORED_MASK, FAN_OPEN_PERM, AT_FDCWD, path); }4. 实战构建访问控制系统4.1 架构设计要点策略引擎YAML规则文件定义访问控制策略缓存层Redis缓存高频访问决策审计日志JSON格式记录完整事件流访问控制决策流程 1. 检查内存缓存 → 2. 验证签名白名单 → 3. 执行沙箱检测4.2 典型策略实现bool should_allow(const char *path) { // 1. 检查可信证书 if (is_signed_by_trusted(path)) return true; // 2. 验证文件哈希 if (is_known_malware(hash_file(path))) return false; // 3. 动态沙箱分析 return sandbox_check(path); }5. 调试与问题排查5.1 常见错误代码错误码原因解决方案EPERM权限不足以root运行或授予CAP_SYS_ADMINENOSPC监控数超限调整/proc/sys/fs/fanotify限制EINVAL无效参数检查flags和mask组合5.2 调试工具链strace跟踪系统调用序列strace -e fanotify_init,fanotify_mark ./monitorfanotify监控统计cat /proc/sys/fs/fanotify/max_user_marks性能分析使用perf定位热点perf stat -e syscalls:sys_enter_fanotify* ./monitor6. 进阶应用场景6.1 恶意软件防御系统通过FAN_OPEN_PERM事件实现首次访问触发全量扫描安全文件加入忽略列表可疑文件转入沙箱分析6.2 敏感数据防泄漏配置示例fanotify_mark(fd, FAN_MARK_ADD, FAN_OPEN_PERM|FAN_CLOSE_WRITE, AT_FDCWD, /var/confidential);6.3 云存储同步优化利用FAN_CLOSE_WRITE事件仅同步修改过的文件避免轮询带来的IO开销实现亚秒级同步延迟7. 安全编程实践文件描述符管理及时关闭metadata-fd避免耗尽权限最小化完成初始化后降权内存安全验证所有从内核读取的数据信号处理正确处理EINTR中断// 安全的降权示例 if (setgid(getgid()) 0 || setuid(getuid()) 0) { syslog(LOG_ERR, Failed to drop privileges); exit(EXIT_FAILURE); }在实际部署中我们发现大多数性能问题源于未合理使用忽略标记导致的重复扫描同步IO操作阻塞事件循环过度详细的日志记录影响吞吐量一个经过优化的生产级实现应该包含事件批处理机制基于线程池的并行处理速率限制和反压控制

相关文章:

手把手教你用C语言写一个Linux文件监控工具:基于fanotify的实战教程

从零构建Linux文件监控工具:fanotify深度实践指南 1. 为什么选择fanotify而非inotify? 在Linux系统监控领域,inotify曾是文件监控的事实标准,但它在现代安全需求面前逐渐显露出局限性。fanotify作为内核2.6.36引入的增强机制&…...

网盘直链解析工具:本地化下载解决方案完全指南

网盘直链解析工具:本地化下载解决方案完全指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘 / …...

Dreamweaver CS6:从零到一构建你的第一个响应式网站

1. 为什么选择Dreamweaver CS6做响应式网站 十年前我刚入行时,Dreamweaver CS6就是我的第一个网页设计工具。那时候它已经支持可视化拖拽和代码编辑双模式,特别适合像我这样刚接触前端的新手。现在虽然新版本层出不穷,但CS6依然有三大不可替代…...

3分钟掌握WechatDecrypt:微信聊天记录解密的终极解决方案

3分钟掌握WechatDecrypt:微信聊天记录解密的终极解决方案 【免费下载链接】WechatDecrypt 微信消息解密工具 项目地址: https://gitcode.com/gh_mirrors/we/WechatDecrypt 你是否曾因更换手机而丢失珍贵的微信聊天记录?或者不小心删除了重要的商务…...

怎样高效配置LXMusic开源音源:专业级音乐播放的3大进阶策略

怎样高效配置LXMusic开源音源:专业级音乐播放的3大进阶策略 【免费下载链接】LXMusic音源 lxmusic(洛雪音乐)全网最新最全音源 项目地址: https://gitcode.com/guoyue2010/lxmusic- 在数字音乐时代,高效的音乐播放器配置成…...

【Vivado】从零到一:深入解析Clock IP核的配置与实战应用

1. 初识Vivado Clock IP核:你的数字电路"心跳发生器" 想象一下,数字电路就像一个人体,而时钟信号就是维持生命的心跳。在FPGA设计中,Clock IP核就是专门负责生成这种"心跳"的智能模块。我第一次接触Vivado的C…...

如何在macOS上畅玩Windows游戏和应用:Whisky完整实战指南

如何在macOS上畅玩Windows游戏和应用:Whisky完整实战指南 【免费下载链接】Whisky A modern Wine wrapper for macOS built with SwiftUI 项目地址: https://gitcode.com/gh_mirrors/wh/Whisky 还在为Mac电脑无法运行Windows专属软件而烦恼吗?是否…...

别只看版本号!思科show version命令里这5个隐藏信息,排错时超有用

思科show version命令的5个排错黄金线索:工程师实战指南 当网络设备突然抽风时,大多数工程师的第一反应是查看日志或运行诊断命令。但有个被严重低估的宝藏命令——show version,它输出的信息远不止版本号那么简单。想象一下,你凌…...

电子发票格式兼容难题?开源Ofd2Pdf三步实现高效自动化转换

电子发票格式兼容难题?开源Ofd2Pdf三步实现高效自动化转换 【免费下载链接】Ofd2Pdf Convert OFD files to PDF files. 项目地址: https://gitcode.com/gh_mirrors/ofd/Ofd2Pdf OFD转PDF是处理电子发票、政府公文和电子证照的核心需求,Ofd2Pdf作为…...

别再为Java3D安装头疼了!手把手教你用IDEA 2023.3搞定Java 3D 1.5.1环境(附完整测试代码)

从零构建Java 3D开发环境:IntelliJ IDEA 2023.3终极配置指南 第一次接触Java 3D的开发者在配置环境时往往会遇到各种"玄学问题"——明明按照教程操作却始终报错,或者运行示例代码时出现诡异的黑屏。本文将彻底解决这些痛点,带你用最…...

Bebas Neue字体完全指南:从入门到精通的终极探索之旅

Bebas Neue字体完全指南:从入门到精通的终极探索之旅 【免费下载链接】Bebas-Neue Bebas Neue font 项目地址: https://gitcode.com/gh_mirrors/be/Bebas-Neue 还在为设计项目寻找一款既专业又完全免费的字体而烦恼吗?Bebas Neue作为一款采用SIL …...

STM32驱动ATK-4.3寸屏避坑指南:用FSMC模拟8080时序,告别花屏和卡顿

STM32驱动ATK-4.3寸屏实战:FSMC模拟8080时序的深度优化 当你在STM32项目中使用ATK-4.3寸TFTLCD时,是否遇到过屏幕闪烁、显示错位或者刷新率低下的问题?这些常见痛点往往源于对NT35510驱动器时序理解不够深入或FSMC配置不当。本文将带你从硬件…...

LTspice高级玩法:用行为电压源模拟传感器信号,测试你的嵌入式算法

LTspice高级玩法:用行为电压源模拟传感器信号,测试你的嵌入式算法 在嵌入式系统开发中,传感器算法的验证往往是一个令人头疼的问题。真实的物理传感器不仅成本高昂,而且受环境因素影响大,重复测试困难。想象一下&#…...

保姆级教程:在华为2288H V5服务器上搞定Ubuntu 18.04系统安装与RAID 5配置

华为2288H V5服务器Ubuntu 18.04系统安装与RAID 5配置全流程指南 对于刚接触企业级服务器的运维新手来说,华为2288H V5这类高端服务器的初始配置往往令人望而生畏。不同于普通PC的即插即用,服务器配置涉及RAID阵列构建、远程管理工具使用、操作系统定制…...

从ESC社交胸牌看无线Mesh网络在物联网与开源硬件中的实践

1. 项目概述:一枚会“社交”的会议胸牌如果你参加过一些技术峰会,对那种别在胸前的纸质或塑料名牌肯定不陌生。它们的功能通常只有一个:告诉别人你是谁。但在2016年的波士顿嵌入式系统大会(ESC)上,主办方玩…...

告别IP焦虑:用luci-app-aliddns打造永不离线的智能家居网络

告别IP焦虑:用luci-app-aliddns打造永不离线的智能家居网络 【免费下载链接】luci-app-aliddns OpenWrt/LEDE LuCI for AliDDNS 项目地址: https://gitcode.com/gh_mirrors/lu/luci-app-aliddns 你是否曾因为IP地址变动而无法远程访问家里的NAS?是…...

3分钟掌握Navicat密码找回:免费开源工具的终极使用指南

3分钟掌握Navicat密码找回:免费开源工具的终极使用指南 【免费下载链接】navicat_password_decrypt 忘记navicat密码时,此工具可以帮您查看密码 项目地址: https://gitcode.com/gh_mirrors/na/navicat_password_decrypt 你是否曾经因为忘记Navicat保存的数据…...

开源项目chatgpt-artifacts:为ChatGPT实现Claude式并排视图,支持多模型部署

1. 项目概述:将Claude的Artifacts功能带到ChatGPT 如果你和我一样,既是ChatGPT的重度用户,又对Anthropic的Claude 3.5 Sonnet新推出的Artifacts功能眼馋不已,那么这个项目绝对值得你花时间折腾一下。简单来说, chatg…...

LLM-Hub:快速搭建AI应用原型的开源集成平台实践指南

1. 项目概述:一个面向开发者的LLM应用集成与实验平台最近在折腾大语言模型应用开发的朋友,估计都遇到过类似的烦恼:想快速验证一个想法,结果光是把模型跑起来、搭个简单的Web界面、处理一下上下文长度限制,就得花上大半…...

从冷冰冰播报到“会呼吸的语音”:ElevenLabs非正式情绪语音落地4大行业案例(客服话术/有声书/AI陪伴/短视频配音),含真实AB测试CTR提升27%数据

更多请点击: https://intelliparadigm.com 第一章:从冷冰冰播报到“会呼吸的语音”:ElevenLabs非正式情绪语音的技术跃迁 传统TTS系统常陷入语调扁平、节奏机械、情感缺失的困境——即便输入“我太开心了!”,输出也如…...

OpenTester:轻量级网络与服务测试工具集实战指南

1. 项目概述与核心价值最近在折腾一些开源项目,特别是涉及到网络连通性、服务状态探测这类基础但至关重要的功能时,总是需要一套趁手的工具。自己写脚本吧,功能单一,复用性差;用现成的商业工具,又觉得不够透…...

XRZero-G0:机器人灵巧操作数据采集的创新解决方案

1. XRZero-G0:机器人灵巧操作的数据采集革命在机器人灵巧操作领域,高质量演示数据的获取一直是制约技术发展的关键瓶颈。传统的主从遥操作(Master-Slave Teleoperation)虽然能提供精确的本体感受数据,但存在硬件成本高…...

书匠策AI:一个让你“毕业不秃头“的论文神器,到底藏了什么黑科技?

各位同学,先做个灵魂拷问:你有没有在凌晨三点对着空白的Word文档,大脑一片空白,感觉自己不是在写论文,而是在跟一堵墙对视? 别慌,今天给你们安利一个我最近挖掘到的"论文外挂"——书…...

NotebookLM知识库搭建,为什么83%的企业6个月内弃用?——基于17家客户POC数据的失效根因与重建框架

更多请点击: https://intelliparadigm.com 第一章:NotebookLM企业知识库搭建 NotebookLM 是 Google 推出的基于用户自有文档的 AI 助手,其核心能力在于对上传资料进行语义理解与上下文追问。在企业场景中,它可作为轻量级、隐私优…...

基于光栅的光谱学单色仪

光谱学--对光的光谱(波长)组成的研究--仍然是光学的一个重要研究领域。采用衍射元件的色散行为来分离不同方向的入射光的不同光谱成分的多色器或单色器由于其易于使用和可调整性,经常被选择用于这项任务,。。在高速物理光学建模和…...

别再只调包了!深入OpenCV底层:我是如何用‘土办法’手动提取特征实现水果分类的

从调包到造轮子:OpenCV手工特征工程实战水果分类 当所有人都在讨论如何用YOLOv8实现99%准确率时,我却在思考:如果回到没有预训练模型的时代,我们该如何用最基础的图像处理技术解决分类问题?这就像在自动驾驶时代重新学…...

在OpenClaw项目中配置Taotoken作为OpenAI兼容后端的详细方法

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 在OpenClaw项目中配置Taotoken作为OpenAI兼容后端的详细方法 对于使用OpenClaw这类智能体框架的开发者而言,将后端大模…...

玩转CANoe CAN IG:除了手动发送,这些高级信号发生器功能你用过吗?

玩转CANoe CAN IG:解锁信号发生器的隐藏潜力 在汽车电子测试领域,CANoe的CAN IG模块早已成为工程师们的标准工具。但大多数用户仅仅停留在手动发送固定信号的层面,却忽略了内置信号发生器这一强大功能。想象一下,当我们需要模拟真…...

用GitHub构建个人技能树:从知识管理到职业品牌塑造

1. 项目概述与核心价值最近在GitHub上看到一个挺有意思的项目,叫“Prycehot374/skills”。乍一看,这名字有点抽象,既不像一个具体的工具库,也不像一个完整的应用。但点进去之后,我发现它其实是一个个人技能树的“仓库化…...

告别手动配置!用virt-install一键创建KVM虚拟机的5个实战脚本(附CentOS/Ubuntu示例)

告别手动配置!用virt-install一键创建KVM虚拟机的5个实战脚本(附CentOS/Ubuntu示例) 在虚拟化技术日益普及的今天,KVM作为Linux内核原生支持的虚拟化解决方案,凭借其高性能和低开销成为众多运维工程师的首选。然而&…...