长亭百川云 - 文章详情

牧云插件系统技术选型之探针开发用什么?

huraway

83

2023-04-23

本文将探讨在基于WASM的牧云插件系统开发中探针开发语言的选择。我们将对比不同语言在性能、安全性、易用性等方面的优缺点,并解释我们为什么以及最终选择了哪种语言作为探针开发语言。

这是系列文章“主机Agent插件引擎开发故事”的第四篇,后续将会持续更新。该系列文章将带领您深入探究长亭牧云团队主机Agent插件引擎的开发历程,内容涵盖技术选型、插件接口设计、组件通信框架等多个方面,并详细讲解背后的原理和实现方式,无论您是网络安全专业人员还是对技术开发感兴趣的读者,都可以从中得到收获。我们希望通过分享在开发过程中面临的挑战、解决方案以及实践经验,提供深入见解和有价值的技术参考,帮助读者了解如何构建高效可靠的安全产品,共同推动安全技术社区的发展。

探针的重要性

在主机安全系统的架构中,Agent 程序非常重要。其不但是实施基本功能的重要模块,而且是一个主机安全系统中具体安全能力的承载者。其运行不但要覆盖入侵检测、资产清点、应用监控、漏洞检测、帮助优化性能和快速排查问题等,还必须达到高度的稳定性、可靠性和安全性。因此,认真选择探针使用哪种语言开发是一个非常非常重要的问题。

选择的基本原则

根据主机安全系统的实际需求,对探针开发语言的选择至少要满足以下基本原则:

  • 性能高:编写的程序的执行性能上限很大程度上依赖于编程语言的设计和实现。为了满足高效响应安全事件而且不要抢占业务资源的需求,最好是选择一个尽可能性能高的语言。
  • 安全性强:作为一个安全系统,其自身的安全性毋庸置疑是非常重要的。如果自身都出现了安全漏洞,那么反而为所保护的系统张开了一道供黑客随意进入的门,是万万不可接受的。
  • 平台兼容性好:显然我们需要支持多种不同的操作系统,那么对于不同的平台如果能够共用大部分代码和基础设施显然非常有利于降低相关的维护成本。同时,降低了维护压力和代码量,使得核心代码尽量精简稳定,工程质量和实现安全性也会得到一定的提升。
  • 社区支持:一个活跃的社区不但能提供各种轮子,最关键的还是通过大规模的使用帮助该语言的使用者扫清了大量各种各样情形下的兼容性问题,非常有利于提高项目的可靠性和稳定性。
  • 简单易用:如果在满足所有其他条件的情况下还能写得爽,那当然是最好的。如果不行,那可能得忍一忍。

C/C++

c++

使用 C++ 编写 Agent 程序是在主机安全领域中非常常见的一种做法。使用 C 编写相对不那么常见,但非常适合满足特定场景的特殊需求。针对主机安全场景分析如下:

  1. 高效性:显然提到 C++ 必然就要谈到性能,几乎可以说是蓝星上除了汇编以外最快的东西了,能生成最精简的机器码,提供理论上几乎最高的性能,因此从这个角度来看非常适合编写主机 Agent
  2. 安全性:提到 C++,熟悉网络安全的人一定知道,这是内存安全问题的重灾区,几乎不能更重了。从这个角度来看,又非常不适合编写主机 Agent 使用。
  3. 平台兼容性:由于十分贴近系统底层,所以并不天然具备跨平台能力,但是解决跨平台能力的能力十分强大。如果有良好维护的框架(业界有著名的例子,比如 QT),那么跨平台是非常完美的。可惜我们没有能直接用的框架。
  4. 社区支持:作为一个历史悠久的古老社区,各种各样的轮子都有人造过。但管理各种来源的第三方包和依赖是 C++ 工程中极为棘手的一个问题。
  5. 易用性:如果说写内核相关的部分,那是很好用的,毕竟内核也是 C 或者 C++。但是其他方面就不好说了。

Java

Java

使用 Java 编写 Agent 程序在主机安全领域也是一种常见的做法,针对主机安全场景分析如下:

  1. 高效性:作为一个虚拟机语言,很多时候不能和 C++ 相提并论,但也非常不错。但其存在内存占用较大的问题,是我们不太喜欢的。
  2. 安全性:Java 是一个内存安全的带垃圾回收的语言,少用一些花哨的东西加上良好设计的话,安全性也不需要过于担心。
  3. 平台兼容性:JVM 帮我们提供了平台兼容性,但 JVM 如果不支持,那就是真的不支持。通常这不是个问题,但有问题的时候解决问题的难度比较大。
  4. 社区支持:同样是一个非常成熟的古老社区,同样各种各样的轮子都有人造过,构建系统生态比 C++ 要统一些。
  5. 易用性:一个非常工程化的语言,到现在了基本上啥特性都有,但是有点啰嗦。

Python

Python

使用 Python 编写 Agent 程序相对不那么常见,但同样存在。针对主机安全场景分析如下:

  1. 高效性:不是很好,多线程不能并行,内存占用比较高,启动时间有点慢。如果想要好一些通常要用 C++ 或者 Rust 编写底层模块,另外新版本越来越快了。同时还有一些号称比官方 CPython 更快的版本。
  2. 安全性:非常高级的语言,具有内存安全性,但是动态性太强了,对外部交互的安全性不是特别好控制。
  3. 平台兼容性:自带跨平台兼容性,但是太低的版本得用 Python 2
  4. 社区支持:可能是世界上最活跃最庞大的社区,什么都有。
  5. 易用性:非常好用,写起来很爽。

Ruby

Ruby

使用 Ruby 编写 Agent 并不是一种常见的做法,但有知名厂商珠玉在前,我们针对主机安全场景来分析一下:

  1. 高效性:有点慢,虽然最近越来越快了,但还是有点慢。
  2. 安全性:也是内存安全的,别的不太了解,感觉应该是和 Python 类似。
  3. 平台兼容性:自带跨平台兼容性。
  4. 社区支持:还行吧。有些安全套件也是用 Ruby 写的(比如 Metasploit),所以在安全社区是有些影响力的。
  5. 易用性:写起来爽到感觉不像是在编程,语法糖遍地都是。

Go

Go

使用 Go 编写 Agent 是一种我们的做法,针对主机安全场景分析如下:

  1. 高效性:说实话挺快的了,不考虑 C++ 的情况下是很好的选择。唯一的问题是 GC 提供的控制性比较弱,相关的问题不太好解决。
  2. 安全性:也是内存安全的,作为静态无虚拟机的高级语言各方面都做得比较好。
  3. 平台兼容性:原生支持跨平台,无论是构建还是分发都非常方便。可以在一定程度上提供对底层的控制力,但一旦超过能力范围就很难了。
  4. 社区支持:发展如火如荼,尤其加上 CGO 和许多生态都能接轨(虽然 CGO 真的很难用)。
  5. 易用性:语法简单清晰,并发简单,后来也有了 go mod 了,所以还行。

Rust

Rust

使用 Rust 编写 Agent 是一种新兴的做法,针对主机安全场景分析如下:

  1. 高效性:只要不太过分,基本上可以获得与 C++ 同级别的性能,有时候更好。独特的内存管理方式使得内存占用可控。
  2. 安全性:以安全性著称,在没有 GC 的情况下作为一个编译型无虚拟机语言保证了内存安全,非常强。
  3. 平台兼容性:不太古老的版本都获得了官方支持。不支持的部分大部分没问题,有问题的时候自己解决的能力比较强,类似于 CC++
  4. 社区支持:号称世界上一切可以被 Rust 重写的东西终究会被 Rust 重写。常见的都有了,即将啥都有。天然能和 C 世界接轨,而且没有 CGO 的缺陷(比如不可避免的内存拷贝)。
  5. 易用性:以上手困难著称。但熟悉之后写起来很爽。

其他语言

其他还有主要使用 PerlBash 等实现的等等,都显然不太能用,理由不多说了。

选择Rust的原因

比较各种常见的选择,可以发现,如果同时想要速度快、内存占用小、没有太多安全担忧、社区支持强、能适应各种复杂场景,基本上主要就是从 GoRust 里面选。Go 成熟相对更早一些,所以早期牧云的探针语言选型就是 Go

随着数年的深度使用,以及 Go 越来越向云原生方向走,对社区有强烈呼声的增强内存控制能力、提供好用的动态加载机制等的持续忽视,以及积极抛弃旧操作系统支持的政策,对主机安全系统的拓展性和兼容性都带来了许多困难。在之前的文章中提到过,为了满足牧云自身的兼容性需求、性能要求和可拓展需求,我们做了许多努力,提出了不少技术创新方案。截至目前,因为修修补补,我们的 Go 版本停止在了 Go 1.17.2-patch。后缀的这个 patch 代表我们做的各种定制。

等到最近的版本终于加上了堆内存限制手动管理内存等特性,诞生了WAZERO这样的纯 Go 写的 WASM 引擎解决拓展性问题的时候,我们已经积重难返了。

解决积重难返最好的办法是什么,当然是推倒重写(开玩笑的)。

但是如果要再次升级 Go 版本就意味着所有兼容性适配和微调都要重做,而且即使升级到最新版本也并不能解决所有问题(比如低版本系统兼容适配等)。这个时候我们看到 Rust 语言逐渐兴起,是一个非常好的选择。在 Rust 之前,我们唯一的选择就是 C++;但是现在有了 Rust,我们就不必为了获得足够的灵活性承受 C++ 的维护之痛了。

Rust官网首页有一句话是这么说的:Hundreds of companies around the world are using Rust in production today for fast, low-resource, cross-platform solutions.

不得不承认,“fast, low-resource, cross-platform solutions”的说法真的抓住了我们这群做主机安全产品的开发者的心。

相关博文推荐

上一篇:【牧云插件系统选型斗争】

系列文章目录:【预告】主机Agent插件引擎开发故事汇总

  1. 【揭秘牧云插件开发者的创新之路:从无法解决的问题到“妙趣横生”】
  2. 【牧云插件系统面向未来的设计原则】
  3. 【牧云插件系统选型斗争】
  4. 【牧云插件系统技术选型之探针开发用什么?】
  5. 【牧云插件系统技术选型之插件开发用什么?】
  6. 【牧云插件系统技术选型之插件通信框架大PK】
  7. 【牧云插件系统技术选型之自己人都会吐槽的序列化方法选择之争】
  8. 【牧云插件系统技术选型之WASM运行时选哪个?不选这个竟然出大问题!】
相关推荐
关注或联系我们
添加百川云公众号,移动管理云安全产品
咨询热线:
4000-327-707
百川公众号
百川公众号
百川云客服
百川云客服

Copyright ©2024 北京长亭科技有限公司
icon
京ICP备 2024055124号-2