大部分公司依靠防火墙、入侵检测系统、内容过滤、反恶意软件、漏洞扫描仪及其他网络工具来解决安全问题。他们对这么多控制的依赖主要是因为软件包含很多漏洞,用户面临风险。企业环境有时被认为是“外硬内软”,即网络外围安全可能很强大,但内部软件程序在获取访问权限后很容易被利用。
对于软件问题,最好的办法是在一开始构建软件开发安全流程。然而,软件程序通常将功能摆在首位,而不是安全性。而其实,从一开始将安全构建到每个软件中要比随后增加安全性更为有效。
在这篇有关信息系统认证安全专家(CISSP)考试软件开发安全领域的文章中,笔者将探讨如何构建软件程序;哪些安全机制和战略可用于保护在访问、处理和存储过程中的数据;以及软件开发安全的常见威胁及应对方法。探讨的话题包括:
软件开发安全:模型、方法、生命周期阶段以及对开发过程的管理。
编程语言和分布式计算:软件架构、编程语言和概念、变化控制方法、改进模型、数据建模和结构、数据接口和交换方法。
数据库系统:模型、管理系统、查询语言、组件、数据仓库及挖掘、模式和安全措施。
安全威胁和应对方法:应用和系统面临的常见威胁,以及专家系统和人工神经网络如何应用于缓解威胁。
软件开发安全组织
由于软件最接近企业最重要的数据,现在有很多倡议和举措用于提高安全软件开发流程的使用率。还有很多团体和组织提供了安全软件开发的最佳做法,以帮助企业实现软件安全保护。
Web应用安全联盟(WASC)主要为万维网及基于Web的软件提供最佳做法安全标准。
开放Web应用安全项目(OWASP)同样也是专门处理Web安全问题的组织,该组织提供软件开发安全准则、测试程序和代码审查步骤,它还负责维护OWASP Top 10--当今企业面临的最大Web应用安全风险清单。
ISO/IEC 27034标准则提供了安全软件开发的最佳做法,符合ISO/IEC的信息安全管理系统模型及ISO/IEC 27000系列。该标准提供了应用安全概述和理念、组织规范性框架、应用安全管理流程、应用安全验证及针对特定应用的安全准则。
美国国土安全部有一个软件保障程序,该程序提供最佳做法、工具、准则、规则和其他资源,软件开发人员、架构师和安全从业人员可利用这些资源将安全构建到软件开发的每个阶段。
另外,MITRE的常见缺陷列表(CWE)提供有关最危险软件错误的信息。CWE为软件开发安全问题提供了常用语言和分类,并详细介绍了编程代码、产品设计和系统架构中发现的漏洞。NIST已经将这些CWE映射到其国家漏洞数据库(NVD)--这是美国政府基于标准的漏洞管理数据库。
安全软件开发
为特定系统确定适当的安全级别不是容易的事情,并且这取决于很多因素,包括操作系统的信任水平、它将连接到系统的安全水平、谁将会使用该系统、数据的敏感性、系统功能对企业的关键性以及部署最佳安全做法的成本等。了解系统开发的过程和经济学可帮助我们理解为什么目前生产环境中很少有系统被认为是足够安全。
这个安全软件开发领域涵盖内容包括:不同环境为何需要不同类型的安全性、解决故障状态的重要性以及平衡安全和满足业务需求的功能之间的难度。
现在的环境和技术的日益复杂化也让“通用型”安全方法失去作用,系统构建和软件开发的历史概述也可帮助说明为什么昨天的方法已经无法不再适用于当今超级互联世界。
软件开发生命周期
每个系统都有自己的开发生命周期,主要包括以下阶段:启动、开发、部署、操作/维护和处置。总的来说,这些被称为系统开发生命周期(SDLC)。
每个SDLC阶段都有特定的目标和要求;这个章节侧重于这些特定安全目标和要求以及它们如何整合到SDLC模型。这个领域涵盖的一些SDLC模型包括:
瀑布模型--这是一种按顺序的方法,它要求每个阶段完成后,下一个才能开始。这种方法难以整合变化,这是不灵活的模型。
V模型--这种模型强调每个阶段的核查和验证,需要在整个项目中进行测试,而不只是在最后。
增量模型--在整个软件开发阶段,软件会有多个开发周期。每个阶段提供可用的软件版本。
螺旋模型--这是一个迭代的方法,强调每次迭代的风险分析。它允许通过灵活渐进的方式整合客户反馈。
快速应用开发--这种模型整合了原型开发和迭代开发程序,其目标是加速软件开发过程。
灵活模型--在这种模型中,迭代和增量开发过程鼓励使用基于团队的协作。它侧重于灵活性和适应性,而不是严格的工艺结构。