保护 SDLC 的最佳实践

软件开发是世界各地越来越多的人从事的实践。有公司和个人在构建软件,其中一些是专有的,一些是免费或开源的,还有一些是两者的融合。由于一旦宣布完成并交付生产,对用户或其软件安全的威胁就不会立即出现,因此现在似乎是讨论安全实践的最佳时机,这将有助于管理可能渗透到的安全风险。您的软件在开发过程中。有多种 SSDLC(安全软件开发生命周期)框架,包括来自 OWASP, CISANIST (SSDF)。在本文中,我们将借鉴所有这些方法来重点介绍一些旨在帮助您管理软件开发中固有风险的实践。不要带着虚假的安全感生活,认为这不会发生在你身上。 Check Point 2023 年中网络安全报告显示,全球网络攻击激增 8% 到2022年,这一趋势似乎并没有逆转。 

什么是软件开发生命周期

软件开发人员的目标是快速、准确、安全地构建软件。当然,你不可能总能同时获得这三个。随着时间的推移,开发过程被分为几个不同的阶段,可以适合任何软件开发。这些阶段可以细分为: 

  1. 需求分析 – 我们要构建什么以及为什么
  2. 计划 – 一般而言我们将如何构建它
  3. 软件设计 – 我们将如何用特定的术语(例如建筑设计)来构建它
  4. 软件开发 – 编写和编译软件
  5. 测试 – 确保它按计划进行
  6. 部署 – 运送或发布它,以便最终用户可以使用它

该循环还有一些其他版本,但总体而言它们非常相似。重要的是要记住,这个周期不是一次性的事情 - 一旦您将其交付给客户端或将其发布到云,它通常不会结束。您几乎总是需要处理一些可能需要重新设计(回到第一个方案)的问题、需要修复的错误、想要添加的功能等等。您还可以发现自己同时进行几个阶段,或者中途停下来折返。由于所有步骤本质上都不是以安全为中心的,因此安全性需要不断追赶开发过程,而在当今繁忙的开发速度中,这还不够。

保护 SDLC 安全的重要性

安全软件开发的目的是将安全考虑纳入流程的所有阶段,而不是将安全视为流程的附加项。这样,无论您处于流程的哪个阶段,都应始终考虑安全性 - 考虑项目需求、规划架构、考虑所需的构建块和基础设施,然后坐下来开发代码。这种方法有时被称为 左移安全 的方法。

这里,左移是指将安全问题分散到整个开发过程中,让开发人员参与安全设计、实现和测试。

对于从未真正考虑过安全问题的开发人员来说,突然必须处理这个问题可能会令人生畏。如果将需求分为多个定义明确的最佳实践,那么处理起来会容易得多。您可以将其想象为拿起一个新的 IDE。

需求定义得越明确,您可以使用的自动化和综合工具越多,任务就会变得越容易。

图

SDLC 安全最佳实践

以下是一些可帮助您确保开发流程安全的最佳实践(排名不分先后):

培训 – 许多开发人员会觉得自己无法承担应用安全注意事项并测试他们正在编写的代码的任务。大多数开发人员都知道,让受污染的输入数据进入后端可能会导致远程代码激活,就像众所周知的“删除表”一样。然而,很少有人熟悉缓冲区溢出测试或第三级(或更进一步)依赖项的漏洞扫描。开发人员可以通过培训来缩小这些知识差距。当开发人员对安全挑战和潜在漏洞有更深入的了解时,他们就能更好地将安全问题纳入日常编码和测试中。对于编写代码并非常熟悉其功能的开发人员来说,考虑其安全漏洞并相应地计划测试也更有意义。

扫描 – 您可以使用多种类型的扫描来使您的代码整体更加安全。静态、动态和交互式分析就是其中的一些。静态分析寻找源代码中明显的编码缺陷或可能的安全漏洞。它可用于查找潜在的漏洞、不安全的代码实践以及违反编码标准的情况。它不考虑运行时事件,因为它仅检查代码语法。动态分析会查找应用程序运行时的任何安全缺陷、编码错误和其他问题。它可用于识别内存泄漏、低于标准的操作以及可能不稳定的输入或进程。请记住,由于此类测试是在特定时间使用特定输入进行的,因此测试的质量完全取决于设计它们的个人。目的是在用户之前发现问题。交互式分析检查应用程序以发现任何潜在的安全缺陷和其他重大问题。它可以查找可能的漏洞、可用性问题以及用户界面问题。您使用的扫描工具越全面,您受到的保护就越好,但当然,开发速度是需要权衡的。由于每个应用程序都是独一无二的,因此您需要在适当的扫描量和所需的开发速度之间找到平衡。此外,我们建议您创建应用程序的完整 SBOM,并对该数据源应用各种扫描和报告。拥有应用程序的 SBOM 遗产是保留非常详细的组件和包信息的好方法,这些信息出于多种安全原因可能是无价的。 

代码审查 – 在与活跃的开发分支结合之前检查源代码以发现任何安全缺陷、编码错误和其他软件缺陷称为代码审查。通常,由比代码编写者更专业的开发人员来进行此审查。此类审查可以帮助保证代码编写良好并且应用程序安全。此外,它们还支持在整个代码库中维护单一标准和编码约定(例如函数和变量名称)。

在至少两双眼睛审查之后允许将代码集成到主分支中被认为是最佳实践。编写代码的开发人员当然是第一双眼睛。即使对于高技能工程师(例如团队领导)来说,让其他人评估他们的代码也是有益的。至少这可以确保不止一个人熟悉代码的每一部分。请记住,在压力很大或紧要关头的时候,人们可能会考虑放弃这个元素。如果可能,请考虑将此规则添加为 CI/CD 的硬编码元素,以便它无法被绕过。

测试 – 我们不必告诉您测试代码以在安全缺陷成为问题之前发现它们有多么重要。大多数代码项目都是错综复杂且相互关联的,因此不可能预见一个小小的间隙最终会如何影响整个代码库的安全性。

编写自动化测试时,请考虑最近生成的代码的功能以及与代码库其他部分的任何重要的后端和前端交互。

SQL 注入、跨站点脚本、不安全的数据存储和内存分配不足(可能导致缓冲区溢出)等漏洞是通常在测试中解决的安全问题的示例。测试应该解决内存泄漏、性能缓慢或不可靠以及可用性等问题。测试应该是自动的并集成到 CI/CD 管道中,以便在不经过单元和集成测试的情况下不能发布新版本或更新。 

独立笔测试 – 没有人能想到所有事情,作为开发人员,我们有时会在编写的代码方面出现盲点。与代码审查类似,独立笔测试允许采用新的方法和另一双眼睛来批判性地检查我们所做的事情以及我们为保护我们的应用程序和用户而采取的预防措施。建议每年至少进行一次此类测试,并且应包含基础设施评估和应用程序漏洞。

安全地使用开源 – 当今开发中的几乎所有软件都或多或少地包含开源软件。开源组件是直接或通过暂时依赖项将漏洞引入应用程序的一些主要原因。此外,不仅您使用的库可能会危及您的安全,而且未能更新旧库或未能跟上最新发布的 CVE 也可能会影响您。我们建议创建一个已批准的开源软件包列表以供组织使用,并不断检查和更新它。阻止开发人员添加他们想要的任何软件包,即使只是作为测试,也可以帮助减少必须处理的漏洞数量。 

确保漏洞不会转化为漏洞利用 – 几乎没有没有漏洞的代码库。任何像样的扫描都会出现数百到数千个这样的东西。将他们全部消灭是不可能的。同样重要的是要记住,漏洞不是漏洞利用。确保您有一个过滤流程,以确保您发现的任何漏洞都不是可利用的威胁,并不断更新此列表。这样,您就可以安抚任何担心最新 CVE 的第三方或用户,因为它对您的应用程序绝对没有影响。

安全从您的心态开始

有多少开发人员、框架和编码语言,就有多少种不同的软件开发方法。也就是说,无论您使用什么语言、领域或 IDE,找到相关的最佳实践来保护您的开发过程并不容易。除了大量的工具(一些是专有的和一些免费的),所有这些工具都作为“下一个不可替代的安全工具”而吸引着您的注意,您可以使用的最重要的安全工具是您的心态。

考虑您的设计选择、架构和存储。您是否考虑过让您的用户群呈指数级增长?您是否正确划分了代码库和基础设施不同部分的访问权限?您是否考虑过针对您的数据或秘密的有针对性的攻击以及软件供应链的“间接”攻击?   

在您坐下来规划应用程序之前,应该考虑所有这些问题以及更多问题,并且随着代码库和应用程序的成长和发展,应该定期重新检查它们。 

人们认为任何软件中最脆弱的部分是运行它(或编写它)的人,这被认为是一条公理。不要让您的应用程序、软件或代码库成为新一波网络攻击不断增加的统计数据的一部分。通过适当的规划、工具和自动化,您可以在管理网络风险、保护开发生命周期和生成记录良好、全面、高效的代码之间找到适当的平衡。