安全代码签名指南:从这四步开始
软件现在主宰着世界。我们在个人生活和职业生活中所做的几乎所有事情都在某种程度上与软件有关,特别是随着物联网设备的兴起。
从前,我们可以简单地信任我们下载的软件,但这样的日子已经过去很久了。随着越来越多的软件出现了越来越多的网络攻击,这一现实使得在下载任何东西之前验证真实性变得至关重要。
这就是代码签名发挥作用的地方。
但是,尽管有这么多好处,实现安全代码签名也不是没有风险。让我们来探讨一下为什么代码签名如此重要、常见的障碍以及如何克服这些挑战。
代码签名的功能
代码签名是证明软件真实性的一种加密方法。开发人员可以使用私钥对应用程序、软件或嵌入式固件进行数字签名,以证明代码来自可信的合法来源,并且没有被篡改。
如果没有代码签名——或者在软件下载中检查以确认代码签名——用户从恶意来源下载软件可能会使自己面临严重的风险。
在过去的十年里,我们已经看到这些风险发生了太多次,严重的代码签名攻击影响了供应商,如2012年的Adobe, 2015年和2018年的D-Link,以及2019年的华硕通过shadowwhammer。
保护代码签名的常见障碍
实现安全代码签名的重要性是显而易见的,因为不这样做的风险太高了。不太清楚的是如何有效地做到这一点。组织在实现有效、安全的代码签名时面临的一些最常见的障碍包括:
- 平衡开发速度和必要的安全性,因为如果不考虑效率,代码签名过程可能会降低开发过程的速度
- 适应DevOps工作流,将签名过程嵌入到现有的软件开发生命周期中
- 以一种保持代码签名证书可访问的方式支持分散的开发团队,而不会向黑客开放它们
- 保护证书免受复杂攻击,因为代码签名证书可以在地下市场上获得很高的价格
实现安全代码签名的四个步骤
尽管存在这些障碍,在您的组织中实现安全代码签名实践仍然是可能的。以下四个步骤已被证明对所有类型的组织都有效:
1. 保护私钥
开发人员用来为代码签名的私钥对于保护来说非常重要,因为它们为任何代码提供了真实性的标记。如果它们落入不法分子之手,黑客就可以用它们来签署恶意代码,然后以合法性为幌子分发给用户。
通常,团队将这些私钥存储在不安全的位置,如开发人员工作站或构建服务器。为了正确地保护私有代码签名密钥,它们应该位于经过认证的硬件安全模块(HSM)中。此外,您的团队应该保存您拥有的密钥清单,并集中管理这些密钥,以确保采用标准化的、高度安全的方法。
2)安全签名操作
保护私钥是第一步,但即使这些密钥存储在HSM中,有决心的黑客也能找到访问它们的方法。一旦黑客获得访问权限,他们就可以执行“软件供应链攻击”,允许他们提交恶意软件进行签名和分发。这些攻击非常难以察觉,因为它们来自内部。
保护签名操作的最佳方法是只允许授权用户签名和批准代码,这样就可以对任何可能破坏网络的人进行额外检查。在这种方法下,您需要为授权用户定义角色和单独的职责(这可以防止任何单个用户单独做太多事情),引入和实施代码签名策略,并跟踪签名活动。在开发和测试阶段分别进行代码签名也是有帮助的。
3)与DevOps集成
DevOps促使开发团队快速且频繁地交付,在这种背景下,任何可能减缓他们工作流程的额外步骤通常都是不受欢迎的。在过去的几年里,这种情况在DevOps和安全团队之间产生了摩擦。但是将安全检查(如代码签名)集成到DevOps工作流中的需求只会随着不断增长的威胁而增加。
为了使代码签名对开发人员来说尽可能简单,并避免产生摩擦,您需要平衡安全需求,以保护私钥,并使开发人员能够在不中断的情况下签署任何代码。实现这一目标的一些最佳方法包括:围绕现有软件开发生命周期构建一个代码签名过程,以最大限度地减少对工作流的更改,选择一个允许开发人员从任何地方签名代码的解决方案,以及尽可能直接与现有的DevOps工具集成。
4)监督和审核合规性
一旦您实现了安全的代码签名实践,您的工作就远远没有结束。定期监控和审核这些程序的合规性是很重要的,以确保团队不会重蹈覆辙。此外,证书将过期,算法将被削弱,威胁将继续演变,这意味着您的安全团队需要定期重新审视实践,以确保它们保持最新。
对代码签名实践的持续管理应该包括对代码签名请求、授权和签名的定期、实时监控。您还应该全面记录谁使用了代码签名密钥,并根据需要遵循证书生命周期管理最佳实践来发布、更新和撤销密钥。
不要低估安全代码签名的重要性
在当今软件驱动的世界中,代码签名是一项必不可少的安全检查。它让用户相信他们下载的东西来自合法来源,也让软件供应商保持值得信赖的品牌声誉。
但是实现安全的代码签名实践说起来容易做起来难。随着越来越复杂的威胁每天都在出现,这并不像购买一个代码签名密钥那么简单。安全的代码签名需要在每个环节都进行适当的计划和保护,这里概述的四个步骤可以帮助您实现这一目标。