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

手把手教你用C语言写一个Linux文件访问监控工具(基于fanotify API)

从零构建Linux文件监控工具基于fanotify的实战指南在服务器运维和安全审计中实时监控关键文件的访问行为是一项基础但至关重要的需求。想象这样一个场景你的服务器上存放着包含数据库凭证的配置文件突然有一天你发现这些文件被异常读取但传统日志系统无法告诉你谁在什么时候读取了这些文件。本文将带你用C语言开发一个轻量级但功能完备的文件访问监控工具基于Linux内核提供的fanotify接口实现细粒度的文件访问追踪。1. 环境准备与基础概念在开始编码之前我们需要明确几个关键概念。fanotify是Linux内核从2.6.36版本开始引入的文件系统通知机制相比早期的inotify它最大的特点是能够监控整个挂载点的文件访问并且支持访问控制决策。我们的监控工具主要关注以下几个核心功能实时记录文件的打开(open)、读取(read)事件捕获访问文件的进程信息(pid、命令行)支持对敏感文件的访问权限控制能够以守护进程方式运行开发环境需要准备Linux系统(内核≥2.6.36)GCC编译器基本的C语言开发工具链root权限(部分操作需要)提示在生产环境部署时建议使用最新稳定版内核以获得完整功能支持某些早期版本可能缺少部分fanotify特性。2. 核心API解析我们的监控工具将主要依赖以下fanotify API#include sys/fanotify.h int fanotify_init(unsigned int flags, unsigned int event_f_flags); int fanotify_mark(int fanotify_fd, unsigned int flags, uint64_t mask, int dirfd, const char *pathname);2.1 fanotify_init参数详解fanotify_init初始化一个fanotify实例返回文件描述符。其参数配置决定了监控的基本行为int fan_fd fanotify_init(FAN_CLASS_CONTENT | FAN_REPORT_FID, O_RDONLY | O_LARGEFILE); if (fan_fd -1) { perror(fanotify_init); exit(EXIT_FAILURE); }关键参数说明参数可选值说明flagsFAN_CLASS_NOTIF仅接收通知无权限控制FAN_CLASS_CONTENT内容访问通知(杀毒软件常用)FAN_CLASS_PRE_CONTENT内容预访问通知(HSM场景)FAN_REPORT_FID报告文件句柄而非文件描述符event_f_flagsO_RDONLY/O_WRONLY/O_RDWR打开模式2.2 fanotify_mark监控配置fanotify_mark用于添加具体的监控规则if (fanotify_mark(fan_fd, FAN_MARK_ADD | FAN_MARK_MOUNT, FAN_OPEN | FAN_ACCESS | FAN_OPEN_PERM, AT_FDCWD, /etc) -1) { perror(fanotify_mark); exit(EXIT_FAILURE); }常用监控标志组合监控场景推荐mask组合基础访问监控FAN_OPEN | FAN_ACCESS | FAN_CLOSE权限控制监控FAN_OPEN_PERM | FAN_ACCESS_PERM目录监控添加FAN_ONDIR标志3. 事件处理核心逻辑监控程序的主循环负责处理fanotify事件基本流程如下读取事件队列解析事件元数据记录/处理事件对权限事件做出响应3.1 事件读取与解析struct fanotify_event_metadata *metadata; char buffer[4096]; ssize_t len; while ((len read(fan_fd, buffer, sizeof(buffer))) 0) { metadata (struct fanotify_event_metadata *)buffer; while (FAN_EVENT_OK(metadata, len)) { handle_event(metadata); metadata FAN_EVENT_NEXT(metadata, len); } }事件处理函数示例void handle_event(struct fanotify_event_metadata *metadata) { char path[PATH_MAX]; char proc_path[PATH_MAX]; char cmdline[256]; int path_len; // 获取被访问文件路径 snprintf(path, sizeof(path), /proc/self/fd/%d, metadata-fd); path_len readlink(path, path, sizeof(path) - 1); // 获取进程信息 snprintf(proc_path, sizeof(proc_path), /proc/%d/cmdline, metadata-pid); int cmd_fd open(proc_path, O_RDONLY); read(cmd_fd, cmdline, sizeof(cmdline)); // 记录访问日志 log_access(metadata-pid, cmdline, path, metadata-mask); // 处理权限事件 if (metadata-mask FAN_OPEN_PERM) { respond_to_permission_event(metadata); } close(metadata-fd); }3.2 权限事件响应机制对于需要访问控制的场景我们必须显式响应权限事件void respond_to_permission_event(struct fanotify_event_metadata *metadata) { struct fanotify_response response; response.fd metadata-fd; // 实现你的访问控制逻辑 if (should_allow_access(metadata)) { response.response FAN_ALLOW; } else { response.response FAN_DENY; } if (write(fan_fd, response, sizeof(response)) -1) { perror(write fanotify response); } }4. 高级功能实现4.1 守护进程化为了使监控工具能长期运行我们需要将其转换为守护进程void daemonize() { pid_t pid fork(); if (pid 0) exit(EXIT_FAILURE); if (pid 0) exit(EXIT_SUCCESS); // 父进程退出 // 创建新会话 if (setsid() 0) exit(EXIT_FAILURE); // 设置工作目录 chdir(/); // 重定向标准流 freopen(/dev/null, r, stdin); freopen(/var/log/filemon.log, a, stdout); freopen(/var/log/filemon.err, a, stderr); // 设置umask umask(0); }4.2 性能优化技巧批处理事件使用FAN_REPORT_DFID_NAME标志减少事件数量忽略列表对已验证文件设置FAN_MARK_IGNORED_MASK高效日志使用内存缓冲或syslog替代直接文件IO// 设置忽略标记示例 fanotify_mark(fan_fd, FAN_MARK_ADD | FAN_MARK_IGNORED_MASK, FAN_ACCESS, AT_FDCWD, /path/to/verified/file);5. 安全与部署考量在生产环境部署时有几个关键安全注意事项最小权限原则监控进程应以专用低权限用户运行资源限制设置合理的文件描述符限制日志轮转实现日志文件大小监控和自动轮转熔断机制在事件激增时优雅降级而非崩溃一个完整的systemd服务单元示例[Unit] DescriptionFile Access Monitor Afternetwork.target [Service] Typesimple Userfilemon ExecStart/usr/local/bin/filemon -c /etc/filemon/config.ini Restarton-failure LimitNOFILE65536 [Install] WantedBymulti-user.target6. 实际应用场景扩展基于这个基础框架我们可以扩展多种实用功能敏感文件实时备份当检测到关键配置文件被修改时自动创建备份异常访问警报对非正常时间或非常用程序的访问触发告警合规审计生成符合PCI DSS、HIPAA等标准的访问日志动态权限调整根据上下文(如来源IP)动态决定是否允许访问// 动态权限决策示例 bool should_allow_access(struct fanotify_event_metadata *meta) { struct stat st; char path[PATH_MAX]; // 获取文件信息 fstat(meta-fd, st); // 获取进程信息 char proc_path[PATH_MAX]; snprintf(proc_path, sizeof(proc_path), /proc/%d/exe, meta-pid); readlink(proc_path, path, sizeof(path)); // 实现你的业务逻辑 if (S_ISREG(st.st_mode) (st.st_mode S_IRWXU) S_IRUSR) { return strstr(path, approved_reader) ! NULL; } return true; }在开发过程中我遇到过一个典型的坑是忘记关闭事件中的文件描述符这会导致文件描述符泄漏最终使监控进程崩溃。解决方案是在处理完每个事件后确保调用close(metadata-fd)或者在批量处理时使用close_range系统调用。

相关文章:

手把手教你用C语言写一个Linux文件访问监控工具(基于fanotify API)

从零构建Linux文件监控工具:基于fanotify的实战指南 在服务器运维和安全审计中,实时监控关键文件的访问行为是一项基础但至关重要的需求。想象这样一个场景:你的服务器上存放着包含数据库凭证的配置文件,突然有一天你发现这些文件…...

STM32H7实战:用FMC+DMA双缓冲搞定AD7606,8通道同步采样避坑指南(附代码)

STM32H7与AD7606的高性能数据采集系统实战指南 1. 嵌入式数据采集系统的核心挑战 在现代工业控制、医疗设备和科研仪器等领域,8通道同步数据采集系统扮演着关键角色。STM32H7系列微控制器凭借其高性能Cortex-M7内核(主频可达480MHz)和丰富的外…...

3个核心痛点:为什么硬件开发者需要跨平台串口调试工具

3个核心痛点:为什么硬件开发者需要跨平台串口调试工具 【免费下载链接】sscom Linux/Mac版本 串口调试助手 项目地址: https://gitcode.com/gh_mirrors/ss/sscom 在嵌入式开发和硬件调试领域,串口通信是连接计算机与硬件设备的核心桥梁。然而&…...

SAP S/4HANA数据迁移避坑指南:LTMC服务激活失败?检查这4个关键点(含WEBGUI测试)

SAP S/4HANA数据迁移避坑指南:LTMC服务激活失败的深度排查手册 当你在深夜的机房盯着屏幕上"Service not available"的红色错误提示时,那种挫败感我深有体会。作为经历过数十次SAP数据迁移的老兵,我想分享一些教科书上不会写的实战…...

告别Windows和Office激活烦恼:KMS智能激活工具三步搞定

告别Windows和Office激活烦恼:KMS智能激活工具三步搞定 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 你是否曾经因为Windows系统频繁弹出激活提醒而烦恼?是否遇到过Off…...

从玩具车到智能家居:用ESP32和NRF24L01搭建低成本多节点传感网实战

从玩具车到智能家居:用ESP32和NRF24L01搭建低成本多节点传感网实战 在智能家居和物联网领域,数据传输的可靠性和成本控制一直是开发者面临的两大挑战。传统Wi-Fi方案虽然普及,但在多节点场景下存在功耗高、网络拥堵等问题;而蓝牙M…...

抖音评论采集器:3步自动化获取完整评论数据的专业工具

抖音评论采集器:3步自动化获取完整评论数据的专业工具 【免费下载链接】TikTokCommentScraper 项目地址: https://gitcode.com/gh_mirrors/ti/TikTokCommentScraper 还在为手动复制抖音评论而烦恼吗?这款抖音评论采集工具为你提供了一站式解决方…...

AI编程助手规则统一管理:CodingRules.ai VS Code插件深度使用指南

1. 项目概述:一个为AI编程助手统一管理规则的VS Code插件 如果你和我一样,日常开发中同时用着GitHub Copilot、Cursor、Cline这些AI编程助手,那你肯定也遇到过这个麻烦:每个工具都有自己的规则文件格式,想给团队统一一…...

Blender到虚幻引擎5分钟极速迁移:Datasmith导出插件实战指南

Blender到虚幻引擎5分钟极速迁移:Datasmith导出插件实战指南 【免费下载链接】bl_datasmith UE Datasmith importer/exporter for Blender 项目地址: https://gitcode.com/gh_mirrors/bl/bl_datasmith 你是否曾在Blender中创建了完美的3D场景,却在…...

DXVK架构深度解析:跨平台图形API转换层的工程实践与技术创新

DXVK架构深度解析:跨平台图形API转换层的工程实践与技术创新 【免费下载链接】dxvk Vulkan-based implementation of D3D8, 9, 10 and 11 for Linux / Wine 项目地址: https://gitcode.com/gh_mirrors/dx/dxvk 技术背景与行业挑战 跨平台图形渲染的技术鸿沟…...

基于MCP协议的Gmail AI助手集成:从原理到实战配置指南

1. 项目概述:当AI助手学会管理你的Gmail 如果你和我一样,每天要在Gmail里处理几十封邮件,从工作沟通到订阅通知,再到各种验证码,那肯定对“邮件管理”这件事又爱又恨。爱的是它确实是我们数字生活的核心枢纽&#xff…...

10分钟精通D3KeyHelper:暗黑3自动化操作终极实战指南

10分钟精通D3KeyHelper:暗黑3自动化操作终极实战指南 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面,可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper 厌倦了在暗黑破坏神3中重复按技能键…...

Zotero AI插件PapersGPT:双引擎驱动,实现文献智能管理与自动化分析

1. 项目概述:当Zotero遇上AI,文献管理进入“自动驾驶”时代 作为一名在学术圈和工业界都摸爬滚打多年的研究者,我深知文献阅读的痛。面对Zotero里堆积如山的PDF,从“标记为待读”到真正“读完并消化”,中间仿佛隔着一道…...

GEO优化公司怎么选?2026年主流服务商实力盘点

在生成式AI搜索逐渐普及的状况下,GEO也就是生成引擎优化成为了企业获取流量的新赛道,它与传统SEO着重关键词排名是不一样的,GEO更加关注让品牌信息于AI模型的生成回答里自然展现出来,本文依据行业公开数据以及技术能力&#xff0c…...

51单片机通过继电器模块实现智能灯光控制

1. 从点灯到智能控制:51单片机与继电器的完美组合 记得我第一次用51单片机点亮LED时,那种成就感至今难忘。但后来发现,单纯的点灯只是电子世界的"Hello World",真正的乐趣在于让灯光变得"聪明"起来。这就是为…...

探索Sunshine:重新定义游戏串流的4个维度体验

探索Sunshine:重新定义游戏串流的4个维度体验 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 想象一下,你可以在客厅的电视上畅玩书房高性能PC的游戏&#…...

MouseTester:5步精准诊断你的鼠标性能问题

MouseTester:5步精准诊断你的鼠标性能问题 【免费下载链接】MouseTester 项目地址: https://gitcode.com/gh_mirrors/mo/MouseTester 还在为鼠标卡顿、延迟高而烦恼吗?MouseTester是一款专业的开源鼠标性能测试工具,能够帮你精准诊断…...

手把手教你用S7-1200 V3.0固件连接Modbus TCP服务器(含DB块避坑指南)

手把手攻克S7-1200 V3.0 Modbus TCP连接:从DB块配置到功能码映射实战 第一次用S7-1200连接Modbus TCP设备时,那些看似简单的配置步骤背后藏着不少"暗礁"。我见过太多工程师在数据块指针格式上栽跟头,或是被40001这样的地址编号搞得…...

Recaf字节码编辑器:3步掌握Java逆向工程的强大工具

Recaf字节码编辑器:3步掌握Java逆向工程的强大工具 【免费下载链接】Recaf The modern Java bytecode editor 项目地址: https://gitcode.com/gh_mirrors/re/Recaf 你是否曾经面对Java字节码感到无从下手?想要修改JAR文件却不知从何开始&#xff…...

终极指南:5分钟掌握Switch游戏文件批量处理神器NSC_BUILDER

终极指南:5分钟掌握Switch游戏文件批量处理神器NSC_BUILDER 【免费下载链接】NSC_BUILDER Nintendo Switch Cleaner and Builder. A batchfile, python and html script based in hacbuild and Nuts python libraries. Designed initially to erase titlerights enc…...

初创团队如何利用 Taotoken 低成本启动 AI 功能开发

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 初创团队如何利用 Taotoken 低成本启动 AI 功能开发 对于初创团队和独立开发者而言,在项目早期验证一个 AI 驱动的产品…...

嵌入式开发者如何利用Taotoken管理多个大模型API密钥

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 嵌入式开发者如何利用Taotoken管理多个大模型API密钥 对于嵌入式开发者而言,项目往往涉及多种智能应用场景&#xff0c…...

抖音评论采集神器:3分钟获取完整评论数据的终极方案

抖音评论采集神器:3分钟获取完整评论数据的终极方案 【免费下载链接】TikTokCommentScraper 项目地址: https://gitcode.com/gh_mirrors/ti/TikTokCommentScraper 还在为无法批量获取抖音评论数据而烦恼吗?TikTokCommentScraper 是一款专业的抖音…...

2025年九大网盘直链下载助手:免费高效的文件下载终极方案

2025年九大网盘直链下载助手:免费高效的文件下载终极方案 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天…...

AI工具搭建自动化视频生成PromptLayer

好的,我们直接切入正题。聊聊PromptLayer。 很多人在用大模型的时候,感觉像是在跟一个天才但记性很差的同事合作。你告诉他一件事,他做得漂亮,但第二天你忘了当初具体是怎么说的,只能重新摸索。PromptLayer就是为了解决…...

2025届毕业生推荐的十大AI辅助论文神器横评

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 做为新一代大语言模型的DeepSeek,为学术论文写作供给了智能化辅助,研…...

ViGEmBus虚拟手柄驱动:如何让Windows游戏兼容所有手柄?

ViGEmBus虚拟手柄驱动:如何让Windows游戏兼容所有手柄? 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 还在为Windows游戏手柄兼容性…...

3步构建企业级KMS激活架构:从单机到集群的智能演进

3步构建企业级KMS激活架构:从单机到集群的智能演进 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO KMS_VL_ALL_AIO作为一款智能激活脚本,彻底解决了Windows与Office的批量…...

Arduino - 入门02 - Arduino编程基础 Arduino程序结构,实物与模拟器对照,Arduino常用函数

目录 1,Arduino程序结构 2,开发板上面的端口 2-1,数字端口:D2-D13 ---一共12个端口 2-2,A0-A5 ---6个端口也可以作为数字端口使用 2-3,实物和SimulIDE中对照 3,Arduino中最常用的库函数 3…...

在Windows电脑上畅游酷安社区:Coolapk-UWP桌面客户端完全指南

在Windows电脑上畅游酷安社区:Coolapk-UWP桌面客户端完全指南 【免费下载链接】Coolapk-UWP 一个基于 UWP 平台的第三方酷安客户端 项目地址: https://gitcode.com/gh_mirrors/co/Coolapk-UWP 你是否曾想过,在电脑大屏幕上也能像手机一样流畅浏览…...