构建可扩展社区插件API:forensicBlend技术架构解析

本文详细介绍了forensicBlend项目的可扩展社区插件API设计,涵盖插件架构、安全考量、AWS云服务组件选型及NuGet包管理技术的应用,为开发者构建可扩展插件系统提供实践参考。

forensicBlend:设计可扩展的社区插件API

我决定开始撰写这个系列文章,记录我在forensicBlend项目上的工作。该项目昨天在Twitter上进行了预览,它能够将设备日志转换为现代报告格式,支持搜索、过滤和导出功能。我的基本设计目标之一是提供高度的可扩展性,并允许社区开发人员贡献代码。也就是说,我希望懂得脚本编写的人能够贡献自己的自定义逻辑,并在我的应用程序中看到它们发挥作用(最终形成一个更好的时间线工具)。这是Eric Zimmerman在我们上周的访谈中提到的内容。

我基于期望的工作方式大致搭建了一些用户体验(如上所示)。基本上,列出当前安装的插件,在有更新时提示更新,并提供浏览在线仓库以下载其他插件的方式。

补充说明:有人问我使用什么UI框架。上述是一个WPF应用程序,使用了优秀的MahApps.Metro和Material Design in XAML库。这些都是免费的资源,你可以在自己的WPF项目中使用,将UI提升到新的水平。

需求

这里需要考虑两个工作领域:插件API本身(安装包后如何处理它们)以及包托管/重新分发。以下是我提出的一些整体设计考虑和要求:

  • 作为独立开发者,节省时间和成本是优先考虑的事项。如果有现成的解决方案,除非需求非常特殊,否则不要重新发明轮子。
  • 现在是2019年,因此花时间考虑安全性等问题非常重要。包含插件的包可能包含DLL(稍后会详细说明),其中的代码最终将由我们的应用程序执行。这可能(也应该)被视为潜在的攻击面。我们可以通过以下一些措施来缓解:
    • 包在每个步骤都应进行签名和验证。
    • 社区创建的插件和更新在发布到包库之前将经过彻底的手动代码审查和测试(类似于苹果的App Store)。
    • 插件包应具备版本控制功能,并且升级到最新版本应尽可能无缝,同时考虑到并非所有用户都能访问互联网。
    • 社区创建的插件将集中管理,并在发布到在线包库之前经过批准(类似于苹果App Store)。

托管和包分发

在开始这样的项目时,我知道我想使用Amazon AWS。其成本效益、强大的可扩展性以及使用AWS的整体酷炫因素使这成为一个简单的设计决策。凭记忆,我预计将使用以下AWS组件:

  • API Gateway:创建和管理应用程序的Web端点。
  • Certificate Manager:免费的SSL证书!
  • CloudFront:内容分发网络(CDN),确保全球范围内的低延迟、高速数据访问。
  • Cognito:完整的用户账户管理和身份验证。
  • EC2(弹性计算云):托管某种关系数据库的微实例。或者我们可能会尝试NoSQL解决方案DynamoDB,用于科学/学习——而且因为DynamoDB有永久的免费层选项。
  • Elastic Load Balancing:在多个可用区之间分发传入的应用程序流量。
  • Lambda
    • 为我们的REST API提供业务逻辑,回答诸如“当前所有可用的插件是什么?最新版本是什么?”等问题。
    • 为促进和监控包下载提供业务逻辑(用户喜欢看到下载计数),可能提供“点赞/点踩”互动,甚至评论功能。
  • Route 53:DNS注册。
  • S3:安全、加密、冗余地托管编译后的包本身。
    • 为选择以此方式浏览的用户提供Web前端。

请记住,我提到的只是AWS可以为你做的事情中的不到10项,而实际可以做的事情列表要长得多。对于我们大多数人来说,使用量将在免费层内或附近,所以基本上我所说的是,你可以免费获得以上所有东西。如果你在阅读本文时想,“为什么我还在像2005年那样租用网络空间?”这是一个很好的问题。你可能想迁移!当你意识到你正在使用与一些最大的企业巨头完全相同的无服务器环境时,会有一种不可替代的感觉。

打包技术

之前我提到要尽可能利用现有技术。大多数.NET程序员都熟悉NuGet的概念。来自NuGet自身:

NuGet是.NET的包管理器。NuGet客户端工具提供了生成和使用包的能力。NuGet Gallery是所有包作者和消费者使用的中央包仓库。

因此,如果我在编写一个应用程序,并且想从库中引入代码来执行特定功能,我可以在开发环境(如下所示的Visual Studio)中打开NuGet包管理器,并搜索我需要的功能。然后只需点击一下即可安装并开始使用。

它甚至进一步提供了强大的版本控制、许可证管理、依赖跟踪等功能。在幕后,NuGet使用.NUPKG文件,这些容器为我们内置了许多这些功能,并提供了诸如包签名等理想特性。

既然NuGet已经免费提供了我们所需的一切甚至更多,我们为什么要从头开始设计自己的解决方案?看到这里的重复主题了吗?

下一步

我们知道我们将使用NuGet作为包管理解决方案,并且知道我们将使用AWS进行社区托管和包分发,但是加载这些插件的实际代码呢?这可能是有趣的部分,但也是最耗时的。出于开发目的,我需要研究如何在运行时从NuGet包中提取和使用内容。

我将不得不权衡动态代码编译(在运行时编译源代码)与分发预编译的二进制文件(DLL)并简单加载它们的优势。

请继续关注本系列的下一篇文章,我们将开始编码!

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计