发布于2025年12月5日12月5日 本文将介绍为什么牧云需要插件系统。我们将探讨使用插件系统的优点和挑战,并描述我们过去使用基于Lua 的插件系统遇到的一些问题和限制。此外,我们将简要描述我们未来引入基于WASM 的插件系统的计划和期望。这是“**Host Agent插件引擎开发故事**”系列文章的第一篇,后续会持续更新。本系列文章将带领您深入了解长汀牧云团队的主机Agent插件引擎的开发过程。内容涵盖了技术选型、插件接口设计、组件通信框架等多个方面,并详细讲解了其背后的原理和实现方法。无论您是网络安全专业人士,还是对技术开发感兴趣的读者,您都可以从中有所收获。我们希望通过分享开发过程中面临的挑战、解决方案和实践经验,提供深入的见解和有价值的技术参考,帮助读者了解如何构建高效可靠的安全产品,共同推动安全技术社区的发展。 ## 一、为什么要做牧云 牧云是长亭的主机安全产品。其主要产品定位是**基于Agent的深度服务器工作负载安全平台**,大致分为主机安全(`HIDS`)和云工作负载保护平台(`CWPP`)。与防火墙、扫描仪等安全产品的定位不同,牧云基于服务器主机,在服务器内部部署了“Agent”程序。通过对服务器内部的行为进行深入监控和分析,可以最准确、及时地了解服务器的安全状况。 牧云的主要目标是为甲方安全领导者提供一个可以统一管理和控制大型服务器安全状态的解决方案。同时需要适应本地部署、公有云部署、混合云部署等复杂场景下的主机安全需求。 ## 二.这是什么鬼,这是一个无解的问题 ### 牧云需要插件系统 作为牧云的核心系统,**智能、轻量、安全、兼容、稳定**是“Agent”设计的核心目标。在这个目标下对“Agent”进行编程需要满足许多相互制约的条件,而这些条件似乎不可能同时满足。例如: 1. **兼具轻量级和高性能**:高性能往往需要更多的资源,而轻量级设计意味着尽可能减少资源使用。 2. **安全性与灵活性并存**:安全性通常需要实施限制和约束,而灵活性则要求系统根据不同的需求和情况做出不同的响应。 3、**实时与稳定并存**:实时性能往往需要牺牲一定的稳定性,而稳定性可能会影响实时性能能否得到保证。 4、**需要既智能又可控**:智能系统往往具有一定的自主决策和执行能力,而可控性则需要管理员对系统进行控制和干预。 5、**既节省资源又要实时**:保证实时性需要系统保证随时可以调用足够的资源,而节省资源则要求这些资源不能被占用。 其实我们从一开始就知道,以上的事情过于理想化,很难真正实现,更何况还有一个极其简单的逃课方法就摆在我们面前。 这种简单的设计方法是通过扫描和命令执行来提供基本的安全功能。市场上确实有一些以这种方式实现的主机安全系统。这种方法有几个限制: 1. **不够智能**:扫描和命令执行需要手动编写具体的扫描规则和命令,无法自适应地检测和处理安全事件。 2. **重量级**:扫描和命令执行需要大量的系统资源,会对系统性能产生负面影响,降低系统稳定性和可靠性。 3. **安全性不足**:扫描和命令执行容易受到攻击和绕过,安全性也存在问题。 4. **兼容性差**:扫描和命令执行依赖于特定的操作系统版本和二进制版本,难以应对各种安全场景。 也许有人认为只要能用就够了,但显然这种粗制滥造的形式无法满足这些苛刻的、近乎变态的设计目标,所以我们决定不妥协。虽然这看起来像是一个“无法解决的问题”,但成年人知道这既是问题又是必须解决的问题。 为了让‘Agent’程序达到稳定性、灵活性、可扩展性的设计目标,我们前期做了很多探索,最终确定了一个指导方针。简单来说,就是在“Agent”编程中需要将安全业务能力和基础安全能力进行分离,从而在保证核心系统持久稳定性的同时,保证安全能力的灵活性和可扩展性。 ‘Agent’提供的基础支持以及通过插件系统实现具体的安全检测算法就是这一原则的具体体现。 长汀的安全理念认为,任何单一的安全产品都无法完全解决安全问题,多种产品、多角度相结合的“塔防系统**”是必然的发展方向。安全主动权应该归还给甲方,因为只有甲方最清楚实际的安全需求。即乙方提供基础设施、框架和工具,甲方利用乙方提供的设施和工具根据需要灵活扩展和解决问题。插件系统为这一安全理念的实施做好了充分的基础。 ### 分离安全业务能力和基础安全能力 安全业务能力和基础安全能力分离的目的是为了提高系统的灵活性和可扩展性。 在安全产品中,**安全业务能力**是指具体的安全检测算法和策略,包括资产盘点、病毒扫描、漏洞检测、入侵检测等。**基础安全能力**是指系统提供的基础设施和工具,例如数据采集、插件管理、日志管理、网络通信等。 安全业务能力和基础安全能力分离后,可以实现不同安全业务能力的模块化开发和部署,从而实现安全业务能力的灵活扩展和定制,同时提高系统的稳定性和可靠性。此外,通过插件系统,安全业务能力还可以动态更新升级,以适应不断变化的安全威胁和攻击方式。 插件系统的优点主要包括以下几个方面: 1. **保持主程序代码简单稳定**:部分功能可以在插件中单独实现,避免`Agent`程序代码过于臃肿和复杂,从而提高代码的可维护性,减少`Agent`程序代码变更带来的稳定性风险。 2. **灵活的升级扩展功能**:可以方便地添加、升级、替换插件,实现功能的快速扩展和升级,实现安全能力的快速迭代,第一时间跟进最新的安全事件,提供最前沿的安全检测能力。 3. **避免影响业务稳定性**:插件可以独立修改和升级,不影响主程序,从而保证了`Agent`的稳定性和可靠性。 4. **轻松限制安全服务对系统的影响**:可以轻松限制和隔离插件,避免安全服务对系统性能和稳定性产生不利影响。 ## 三. “好玩”的开始 ### 插件系统的挑战 尽管有这么多好处,但真正实现高性能实施仍然是一条漫长且充满挑战的道路。要解决这条路上的困难,首先要考虑明确插件系统设计和实现中的以下问题: 1. **统一接口设计**:`Agent`需要为插件提供统一的操作系统接口和安全事件接口,并考虑API的稳定性和兼容性。 2. **跨平台抽象**:`Agent`需要提供跨平台抽象,以便在开发专注于安全服务的插件时不需要考虑不同平台之间的差异。 3. **插件的调度、限制和隔离机制**:为了保证插件的安全稳定,需要对插件进行调度、限制和隔离,避免插件对系统造成不良影响。 4. **插件通讯方式**:插件需要与主程序进行通讯。如果通信开销过高,会导致系统性能下降,从而影响系统的稳定性和可靠性。 5. **插件更新机制**:插件通常需要频繁的更新和维护,这需要开发者具备一定的技术能力和经验。同时需要建立有效的更新和维护机制,保证插件的稳定性和可靠性。 ### 聪明时尚的解决方案 为了方便实现`Agent`程序的跨平台设计目标,目前使用`Go`语言进行开发,试图借助**`Go`语言跨平台编译**的基础设施来降低`Agent`程序的开发和维护成本,并且在项目前期有很大帮助。使用Go 进行开发的另外两个重要原因是: 1、我们有使用Go开发的成功产品,牧云早期的团队成员很大一部分来自这个产品。 2.当时,“围棋”是一项新兴的时尚技术。当时,整个长汀公司从上到下都充满了激进的技术爱好者。 为了实现插件程序灵活高效的设计目标,在插件的开发语言上做了很多考虑,包括嵌入式版本的`Python`和`JavaScript`,我们都经过了仔细的考虑。这两者都是我们熟悉的编程语言,有着极其丰富的生态,但遗憾的是它们距离理想的设计目标还很遥远。通过对整个插件生态的进一步仔细研究,我们最终认为,我们选择插件开发语言最重要的标准应该是“**稳定**”、“**简单**”和“**快速**”,并结合我们的整体设计目标。因为“**稳定**”是安全产品的核心目标,“**简单**”让代码逻辑直接面对业务,避免不必要的干扰; “**快**”帮助我们更好地实现“轻量级”和“高性能”的目标。 所以我们最初使用`Lua`作为插件开发语言,在这三点上做到了极致。为了更快,底层的“Lua”虚拟机使用“LuaJIT”。后来,这种过于简单的做法导致了一些陷阱。为了解决可维护性问题,被改造为类型化的`Lua`方言,即`CtLua`。关于`CtLua`的故事,我们在【[主机安全|开发陷阱避免之旅]](https://stack.chaitin.com/techblog/detail?id=7)。简单来说,脚本语言的动态特性给了我们软件工程沉重的打击。 为了让`Agent`程序能够与插件程序有效交互,我们开发了`lng`项目(**Lua Engine for Go**)来支持`LuaVM`和`Go`之间的通信,并在这个项目上做了很多技术创新。例如: * 为了适应安全服务的特点,对`LuaVM`进行了**兼容性增强**,使其可以在原本不支持的环境中正常运行。 * **增强虚拟机隔离**,使得所有与外部环境交互的操作都必须经过`Agent`的审核和控制。 * **打了安全补丁**,通过禁用和打包一些敏感操作,确保危及系统安全和‘Agent’稳定性的插件无法被写入。 * 为`Lua`插件提供基于`MessagePack`序列化的**通信接口**,大大提高了`Lua`跨插件边界传输复杂数据结构的能力。 * 提供**调度LuaVM**的能力,即根据资源使用情况和限制在多个并行执行的VM之间动态分配执行时间片,以控制插件资源滥用。 * 类似于`JavaScript`中`Promise`语法的**异步能力**。 * 通过注入依赖提供方便的**OO封装能力**。 在`lng`项目的支持下,很长一段时间我们取得了当时非常满意的插件开发体验,很大程度上达到了灵活、稳定、轻量化的设计目标。 但经过长期的维护和使用,安全业务变得越来越复杂和庞大,这对插件的工程质量和可维护性提出了更高的目标;这也对探头的轻量化、高性能和兼容性提出了更加严格的要求。原来的选择已经不能令人满意了。 从**Agent的角度**来看,作为一个系统应用,很难精确控制行为和资源使用,这是一个巨大的缺点。与“Agent”的IO 密集型部分相关的问题早已通过使用混合语言开发得到缓解。从插件的角度来看,基于渐进类型系统和类型注释的动态语言中的类型推断是困难且不令人满意的,导致难以有效地组织大型软件仓库。从**lng**的角度来看,由于与`LuaVM`的交互需要借助`CGO`,因此必须复制数据才能传输数据。当触发大规模安全事件时,由于通信开销较高,很难同时实现轻量级和高性能。 在经历了自己设计插件通信标准并提供开发调试基础设施、自己修复LuaJIT VM实现缺陷、自己设计和维护CtLua编译器、自己兼容Go语言及低版本操作系统、自己修复Linux内核bug等传奇事件后,我们终于做出了一个惊人的决定。 ## 四.新技术栈的选择 经过长时间的奋斗和奋斗,团队最终决定采用全新的技术栈来构建下一代主机安全探针系统。 技术选型一言以蔽之:**使用Rust开发Agent程序,基于WASM打造全新的插件系统。 ** 这样做的希望是通过“Rust”获得更好的开发体验,同时克服“Go”技术体系下难以克服的兼容性和底层控制困难。同时,WASM的跨语言特性将为静态语言的插件开发提供支持,从而提高项目质量,减少插件通信开销,增强插件隔离性。 全新的技术栈能够更好地满足牧云的需求,从而实现更加灵活、可扩展的安全检测功能,以适应日益复杂的安全威胁环境。同时,也将可以更精细地控制“Agent”程序的行为和资源使用情况,以提高系统性能和稳定性。 新选择中的新思考、新挣扎,将在后续系列文章中逐步揭晓。该系列文章将与全新次世代主机《特工》的开发和打磨过程同步发布,分享最真实、最生动的故事和经历。 ## 五、总结 对于未来主机安全产品的发展,我们可以预见以下趋势: 1. **云原生**应用对安全产品的需求将会增加。随着云原生应用的普及,传统的主机安全产品可能无法满足云原生应用的安全需求。因此,未来的主机安全产品需要更好地适应云原生应用,提供更加灵活、可扩展、自适应的安全解决方案。 2、**安全自动化**程度将会提高。未来的主机安全产品需要更加注重安全自动化,减少对人力资源的依赖。这包括自动化安全检测、自动化安全分析、自动化安全决策、自动化安全响应等。 3、多产品**协同防御**快速发展。未来的主机安全产品需要充分发挥产品形态的优势,在各个环节与安全产品深度融合,构建纵深防御体系,提供立体防护能力。 4. **安全合规**将更加重要。未来的主机安全产品需要更加注重安全合规性,这将为企业提供更可靠的安全保障,也将促进行业的健康发展。 未来的主机安全产品需要适应不断变化的安全威胁环境和用户需求,采用更加灵活、自动化、智能、合规的安全解决方案。长亭主机安全产品团队将不断创新突破,持续推进产品研发,为社区和用户提供更好的安全解决方案和服务。 ## 推荐相关博文 下一篇:**【【牧云插件系统面向未来的设计原则】】(https://stack.chaitin.com/techblog/detail?id=73)** 系列文章目录:【【预览】主机Agent插件引擎开发故事总结】(https://stack.chaitin.com/techblog/detail?id=82) 1. **[[揭秘牧云插件开发者的创新之路:从无法解决的问题到“充满乐趣”]](https://stack.chaitin.com/techblog/detail?id=72)** 2. **[【牧云插件系统面向未来的设计原则]](https://stack.chaitin.com/techblog/detail?id=73)** 3. **【【牧云插件系统选型之争】】(https://stack.chaitin.com/techblog/detail?id=77)** 4. **【【牧云插件系统技术选型中探针开发用什么? 】](https://stack.chaitin.com/techblog/detail?id=83)** 5. **【【牧云插件系统技术选型及插件开发? 】](https://stack.chaitin.com/techblog/detail?id=85)** 6. **【【牧云插件系统技术选型插件通信框架PK】】(https://stack.chaitin.com/techblog/detail?id=94)** 7. **[【牧云插件系统技术选型:大家都会抱怨的序列化方法选择之争]](https://stack.chaitin.com/techblog/detail?id=97)** 8. **[【牧云插件系统技术选型:应该选择哪种WASM运行时?如果不选择这个,就会出大问题! 】](https://stack.chaitin.com/techblog/detail?id=105)**
创建帐户或登录后发表意见