保护软件开发生命周期的最佳实践

在一个完美的世界中,安全风险只会在软件开发生命周期中的一个点出现,工程师可以通过一组工具和实践来解决它们。

但不幸的是,这不是我们生活的世界。相反,软件开发生命周期——这意味着团队为设计、实现、测试和部署软件而执行的一系列过程——由多个阶段组成。每次会议都可能产生多种类型的安全威胁。

这就是为什么保护软件开发生命周期需要多管齐下、多层次的安全策略。本文通过识别软件开发生命周期中出现的各种风险,并解释哪些过程和工具可以帮助减轻每种风险,来讨论该策略应该包含什么。

软件开发生命周期的安全风险

正如我们所指出的,软件开发生命周期涉及多个阶段,每个阶段都有自己的安全风险。

软件设计安全挑战

软件开发的第一个阶段是计划阶段。这是开发人员设计新应用程序或更新应用程序的时候。

由于还没有编写任何代码,因此在此阶段没有活动的安全威胁。尽管如此,开发人员应该在应用程序规划和设计期间采取措施,评估他们计划编写的代码的安全状态。

例如,他们应该考虑他们计划实现的微服务的数量,以及这些微服务交互的方式,如何影响应用程序的攻击面。他们还应该考虑如何在他们计划的应用程序体系结构中实施最佳实践,如零信任和微分段。并且他们应该考虑他们计划使用的第三方依赖项(比如开源库或模块)如何将安全漏洞引入到他们的代码库中。

编码安全挑战

开发生命周期的下一个阶段是编码。这是开发人员编写新代码来实现他们在SDLC第一阶段设计的应用程序功能的时候。

由于此阶段的代码通常不会暴露给第三方访问,因此主动攻击的风险很低。尽管如此,确保在持续集成服务器、源代码管理系统和开发人员在此阶段使用的其他开发工具中有强大的访问控制是至关重要的。否则,就会存在攻击者破坏开发环境并将恶意代码插入应用程序的风险——例如,在SolarWinds攻击

在开发阶段,密钥库也可以用于保护代码。秘密保管库提供了一种安全的方法来管理密码、访问密钥以及开发人员在开发生命周期中可能使用的其他敏感数据。如果没有密钥库,这些数据最终可能以明文形式存在于源代码中,这很容易受到未经授权的第三方访问。

测试和软件安全

代码编写完成后,开发人员在登台环境中对其进行测试。这个阶段是团队在将代码部署到生产环境之前识别其代码中存在的安全风险的最佳机会。

在此阶段要执行两种主要类型的安全检查:

  • 软件组成分析或SCA,它识别零日应用程序安全风险,如易受攻击的开源库。SCA通过扫描应用程序查找已知的安全风险来工作。
  • 动态应用程序安全测试或DAST,它涉及评估正在运行的应用程序的输入和输出。DAST可以检测安全风险,例如数据注入漏洞,这些风险在扫描静态应用程序文件时可能并不明显。

理想情况下,在软件开发生命周期的测试阶段,将针对应用程序运行一套全面的SCA和DAST测试。

部署安全风险

开发生命周期的最后一个主要阶段是部署。在此阶段,将新的或更新的应用程序部署到生产环境中并向最终用户公开。

因为在应用程序投入生产环境之前,总是有可能无法检测到某些漏洞,因此在部署阶段期间和之后继续执行SCA和DAST测试是一种最佳实践“右转”安全策略。团队还可以在部署阶段使用安全信息和事件管理(SIEM)以及安全编排、自动化和响应(SOAR)工具来监控生产环境,并根据行为异常检测风险。

此外,工程师应该解决在部署阶段配置基础设施的方式可能产生的安全风险。例如,他们应该扫描云身份和访问管理(IAM)策略,以确保正确锁定对应用程序主机环境的访问控制。他们还应该检查网络策略,以确保它们执行微分段。云安全态势管理(CSPM)工具可以自动扫描基础架构配置以查找安全风险,因此可以用于此目的。

SDLC安全的许多阶段

正如软件开发生命周期本身包含多个阶段和多个工具一样,SDLC安全性需要多层方法。现代开发团队应该有适当的解决方案,以减轻将安全漏洞引入其应用程序的风险,同时最大限度地提高他们检测风险的能力,尽管他们尽了最大的努力。