LinkedIn对自身的静态应用安全测试流程进行了重新设计,以便在基于GitHub的多仓库开发环境中实现一致且可执行的代码扫描功能。这一举措体现了该公司“将安全措施融入开发流程早期”的战略——通过在拉取请求中直接提供快速、可靠的安全反馈,从而增强LinkedIn代码和基础设施的安全性,进而保护其会员和客户。

从本质上讲,静态应用安全测试是通过分析源代码来在开发周期的早期发现潜在漏洞的。在LinkedIn这样的规模下,以往那些依赖多个独立扫描工具或定制集成方案的传统方法,会导致扫描覆盖范围不均衡、对测试流程运行状态的监控能力有限,同时也会给开发者带来诸多不便。因此,这次重新设计的目的是为了标准化扫描流程、简化应用过程,并将安全措施更深入地融入开发者的工作流程中,而不会造成任何瓶颈。

在重新设计之初,LinkedIn的工程师们确定了若干关键指导原则:优先考虑开发者的需求以确保工作流程不受干扰;确保系统具有扩展性,以便其他团队能够添加新的规则或集成方案;增强系统的容错能力,防止故障影响开发者的正常工作;同时还要具备良好的可观测性,以便在大规模环境中监控扫描覆盖范围和性能表现。

新的测试架构利用GitHub Actions来协调两种主要的扫描工具:CodeQLSemgrep》。选择这两种工具是因为它们的扫描覆盖范围和扩展性能够互补。LinkedIn的工程师们还定制了相应的工作流程,用于管理规则的执行、协调扫描任务以及处理扫描结果。所有检测结果都会按照SARIF标准进行标准化处理,并添加元数据,以便为开发者和安全团队提供明确的修复指导及可行的操作建议。

使用CodeQL的GitHub Actions工作流程的高层示意图(来源:LinkedIn博客文章

最初,LinkedIn的工程师们打算利用GitHub提供的“必需工作流程”功能来确保扫描任务的执行,并在数以万计的仓库中安排扫描任务,但该功能并不支持自动调度或部署。因此,他们不得不将相关的工作流程文件手动推送到每个仓库中,才能确保变更能够被可靠地应用到各个地方,这就带来了规模扩展方面的挑战。

为了解决这个问题,LinkedIn在每个代码仓库中都实现了一个轻量级的“虚拟工作流程”,该流程将执行任务委托给由中央系统维护的工作流程管理系统。这种设计使得扫描逻辑、规则执行机制以及监控工具的更新能够立即生效,而无需对各个代码仓库进行单独修改。一个专门的监控系统会持续检查这些虚拟工作流程的存在状态及其配置信息,同时新创建的代码仓库也会自动配备这些机制。这种综合性的解决方案确保了LinkedIn的多代码仓库环境能够实现统一的安全防护与规则执行,从而在大规模应用环境中保持系统的可靠性以及开发人员的工作效率。

规则的执行是通过GitHub代码仓库中的规则集来实现的。这些规则集会阻止拉取请求的合并操作,直到静态分析完成且发现的安全漏洞处于可接受的风险范围内才会允许合并。为了防止在扫描工具出现故障或基础设施出现问题时影响开发人员的工作流程,LinkedIn设计了多种安全机制,包括紧急关闭机制和自动备用方案。在发生故障的情况下,系统会生成空的SARIF报告来解除合并限制,同时仍会收集相关数据以便事后进行分析。

阻断模式的工作流程流程图(来源:LinkedIn博客文章

正如LinkedIn的工程师们所指出的:

我们之前使用的是一个分散的生态系统,而现在则采用了一个与GitHub平台深度融合的安全检测流程,这个新流程能够提供统一的安全防护机制,并及时向开发人员提供有用的反馈信息,而不会影响他们的正常工作。

SAST检测流程会收集详细的执行数据、故障报告以及使用情况统计信息,这使得安全团队能够实时监控安全防护的效果、系统的可靠性以及对组织运营的影响。LinkedIn强调,SAST仅仅是更全面的应用安全策略中的一个组成部分,该策略还包括依赖关系扫描和秘密信息检测等功能,这些措施共同构成了保护代码和基础设施的完整体系。

Comments are closed.