安全的软件开发意味着在每个阶段都要考虑。下面是9个关键的软件安全原则,以及从开发者的角度给出的实用建议。
软件无处不在,甚至在你想象不到的地方。软件是如此无缝地交织在现代生活的结构中,以至于它在没有人注意到的情况下消失在背景中。我们与软件不仅在家庭或办公室电脑,但在我们的日常的日常活动,我们开车到办公室在我们的汽车,我们在超市买东西,当我们从自动取款机取钱时,甚至当我们听音乐或打个电话。
正如软件无处不在一样,大部分软件的缺陷也无处不在。软件中的缺陷会威胁到它们所运行的系统的安全和安全。防止软件中此类漏洞的最佳方法是将安全性和其他非功能性需求积极地合并到软件开发生命周期(SDLC)的所有阶段。
本文借鉴了《安全和弹性软件开发》一书中的最佳实践,总结了将安全性集成到SDLC中所需的一些关键活动,并为实现您自己的安全软件开发程序提供了一些建议和建议。
sdlc中的安全活动-概述
安全从内部开始
确保软件构建安全和弹性的唯一可靠方法是在整个软件开发生命周期(SDLC)中集成安全和弹性思维和过程。从软件开发的早期开始,研究表明,在早期需求/设计阶段发现并修复设计中的漏洞或缺陷,其成本要比在软件投入生产之后要低得多。因此,越早将安全流程集成到开发生命周期中,从长远来看,软件开发的成本就会越低。
许多这些安全流程通常只是“常识”改进,任何组织都可以将其采用到其现有环境中。没有一种正确的方法来实现这些过程——每个组织都必须针对特定的开发和操作环境对它们进行微调和定制。这些过程的改进也为系统增加了更多的责任和结构。
也看到自定义软件应用程序的安全性测试,摘自作者2010年出版的《安全与弹性软件开发》一书
图1提供了应该集成到SDLC各个阶段(从需求收集到部署)的基本安全和弹性过程的高级概述。每个流程都有自己的发现,并且为设计、架构、源代码、第三方组件的使用、部署配置和其他考虑事项的适当更改准备了建议,以帮助您更好地理解并将风险降低到可接受的水平。以下是有关在SDLC的每个阶段应考虑实施的实践的指引:
SDLC的零阶段——开发人员培训
尽管培训并不直接适用于任何特定的SDLC阶段,但它在提高已开发软件的整体安全性和弹性方面起着非常重要的作用。培训应该是任何在软件开发环境中扮演角色的人的先决条件。软件设计/开发/测试团队的所有开发人员和其他技术成员都应该接受安全培训,以解释他们角色的职责,建立对安全和弹性的期望,并为开发高质量软件提供最佳实践和指导。
如果专门针对目标受众(开发人员、QA、项目经理等)的专业知识/兴趣领域,并包括特定于组织的过程、术语和实践,培训是最有效的。
SDLC第一阶段:需求收集和分析
需求收集和分析阶段的关键安全性和弹性活动旨在为正在开发的系统规划和记录非功能需求(NFRs)。在业务需求转化为技术需求之前准备好这些信息是至关重要的;设计人员需要理解预期要面对的约束,并准备好应对安全性和弹性的要求,以及其他NFRs。为了提高效率,业务系统分析员和系统设计者应确保他们非常熟悉他们所处的环境,通过回顾和维护他们对以下方面的知识:
组织安全策略和标准
组织的隐私策略(在不同的地方可能有不同的要求)
监管要求(Sarbanes-Oxley, HIPAA等)
其他相关行业标准(PCI DSS、银行ANSI-X9等)
NFRs然后根据以下关键的安全和弹性目标进行映射:
保密性和隐私
廉正
可用性
不可抵赖性
审计
最后,对这些安全需求进行优先级排序并为后续阶段编制文档。
SDLC第二阶段:系统设计
威胁建模和设计审查是您在设计阶段将遇到的两个主要安全性和弹性过程。有两类漏洞:
设计相关的
履约相关漏洞。
后者很容易找到,而前者如果在SDLC中没有及早发现,则定位和修复它们是非常昂贵和耗时的。在此阶段,安全主题专家应该深入参与项目,以确保没有不良设计问题渗入软件或系统的设计和体系结构中。图3说明了此阶段映射的输入和可交付内容。
详细的威胁建模是确定要开发或正在开发的应用程序的技术安全态势的极好方法。它包括四个关键步骤:
功能分解
威胁分类
排名的威胁
缓解计划
此阶段的下一个活动是安全设计审查。不是核心开发团队成员的安全主题专家通常执行设计评审,其主要目标是确保设计“从一开始就是安全的”。这些审查在本质上是典型的迭代。他们从高层次的设计评审开始,然后深入到软件的每个组件或模块。
SDLC第三阶段:开发
开发阶段的活动通常会产生与实现相关的漏洞。静态分析和同行评审是减轻或最小化这些漏洞的两个关键过程。
静态分析
静态分析涉及使用自动化工具来发现源代码本身的问题:
Bug查找(质量视角)
风格检查
类型检查
安全漏洞评估
自动安全审查工具往往有很高的误报率,但是它们在捕获困扰大多数应用程序软件的低挂漏洞(缺少输入验证、SQL注入等)方面非常有效。然而,静态分析不能检测所有类型的漏洞或安全策略违反—这就是手动同行审查变得重要的地方。
同行评审
同行评审过程比自动分析要花费更多的时间,但是它是一种优秀的控制机制,可以确保代码库的质量和安全性。开发人员检查彼此的代码,并向不同模块的所有者(原始编码人员)提供反馈,以便他们能够做出适当的更改,以修复在检查期间发现的缺陷。开发人员可以使用或不使用专门的工具来实现这一点。
单元测试
单元测试是许多组织不能定期执行的另一个关键过程,但从安全性和弹性的角度来看,它非常重要。单元测试有助于防止错误和缺陷进入测试阶段。开发人员可以验证某些边界条件,并防止应用程序的模块或子模块内的缓冲区溢出、整数溢出或下溢等漏洞。图4显示了开发阶段的安全活动的图表。
SDLC阶段四:测试阶段
测试阶段对于发现早期没有定位和修复的漏洞是至关重要的。测试过程中的第一步是构建安全性测试用例。有时,这些测试用例被记录为与它们相关的非功能需求,并在早期的SDLC阶段中收集和分析它们。这个过程的一个关键输入是系统需求文档。(安全性)测试团队使用捕获的所有假设和业务流程来创建几个安全性测试用例。安全测试人员然后在应用程序的动态分析期间使用这些测试用例。在测试环境中加载和操作软件,并根据每个测试用例进行测试。在此过程中,通常会部署一个专门的渗透测试团队。这些手动安全检查在发现应用程序中的业务逻辑缺陷方面非常有效。
动态分析还包括使用自动化工具来测试安全漏洞。与静态分析工具一样,这些工具在确保“代码完整”扫描覆盖范围和捕获高风险漏洞(如跨站点脚本编写、SQL注入等)方面也非常有效。
这些测试本质上是迭代的,并导致一列漏洞,然后根据风险和优先级对这些漏洞进行排序。然后,开发团队修复这些错误,并将修正后的代码发回进行回归测试。
SDLC第五阶段:部署阶段
部署阶段是SDLC的最后一个阶段,即在生产环境中安装和配置软件,并准备好供目标用户使用。
管理变革的一个关键部分是使用变革咨询委员会(CAB)。出租车提供了多种必要的视角,以确保做出良好的决策。CAB是已定义的变更管理过程的一个组成部分,旨在平衡变更需求和最小化固有风险的需求。例如,CAB负责监督生产环境中的所有更改。因此,它可以字段来自管理层、客户、用户和IT1的请求。
在部署阶段,安全主题专家谁可能会或可能不会变更顾问委员会的一部分进行最后的安全审查,以确保安全隐患以前所有的阶段中确定已修复或已经制定了减排计划。在这个阶段,与发布管理和生产支持团队开发团队的坐标来创建应用程序的安全监控和应急预案。生产支持团队,与网络/安全运营中心相结合,来管理安全事件并从事相应的队伍,为响应和修复应用程序的运行过程中使用此方案。
已证明的安全软件开发的最佳实践
一旦功能性和非功能性需求得到批准和理解,为了帮助设计新的高质量软件,应用程序安全性和弹性原则以及最佳实践是开发解决方案的基本工具,因为没有高质量软件开发的通用配方。原则帮助设计人员和开发人员“做正确的事情”,即使他们有不完整或矛盾的信息。
还看到的代码安全:SAFEcode报告强调了最佳实践“上CSOonline.com
原则1:深度防御
深度防御的原则强调,当安全被实现为一系列重叠的控制层和对策,提供保护资产所需的三个要素:预防、检测和响应时,安全将显著提高。
作为一种军事概念以及在软件和硬件中实现的深度防御,要求安全机制分层,以使一种机制的弱点被两种或更多其他机制的优点所抵消。
以金库为例。银行或珠宝店绝不会把自己的资产单独托付给一个无人看管的保险箱。通常情况下,进入保险柜需要通过层层保护,其中可能包括保安人员、上锁的门和特殊的进入控制(指纹或视网膜扫描等生物识别技术、电子钥匙等),或者需要两个人协同工作才能进入(双重控制)。此外,放置保险柜的房间可能会被闭路电视、运动传感器和警报系统监控,这些系统可以快速探测到不寻常的活动,并采取适当的行动(锁上门,通知警察,或用催泪瓦斯填满房间)作出反应。
在软件世界中,深度防御要求您应该将安全设备分层,以保护、检测和响应可能对系统的攻击。在部署之前,必须彻底测试每种安全机制的安全性,以帮助获得集成系统适合正常操作的必要信心。毕竟,一个链条的好坏取决于它最薄弱的环节。