您好, 访客   登录/注册

软件开发过程中的信息安全管理

来源:用户上传      作者:

  随着互联网和大数据的不断发展,信息化在社会各行业逐渐崭露头角,信息安全日渐引起人们的重视。而作为信息化实现的中坚力——软件开发,如何做好软件开发过程中的信息安全管理,从而使得开发出的信息化产品更有安全保障,也是信息安全管理中非常重要的一个环节。
  一、软件安全问题的产生
  软件安全问题产生的原因是什么?有的是因为开发者缺乏安全开发的动机,有的则是因为开发者缺乏相关知识,还有的是因为缺乏与安全开发的相关工具。
  软件开发的信息安全管理实现思路是通过在软件开发生命周期各阶段采取必要的、相适应的安全措施来避免绝大多数的安全漏洞。
  二、安全的软件开发模型
  随着软件安全开发的日益受到关注,多种模型被各大软件公司和软件专家提出和研究,例如微软提出可信计算安全开发生命周期,Gary McGraw博士等提出的BSI系列模型,以及OWASP(Open Web Application Security Project,开放式Web应用程序安全项目)组织提出的CLASP综合的轻量应用安全过程和SAMM软件保证成熟度模型等。
  其中微软提出的SDL(Security Development Lifecycle,安全开发生命周期)相对认可度较高,适合大型企业,大型软件的开发。该模型将软件生命周期划分为5+2个阶段,每个阶段有相应必需的安全活动,如图1所示:
  三、安全软件开发过程
  首先,在开始软件开发过程之初,开发团队的所有成员都必须接受适当的安全培训,了解相关的安全知识,培训对象包括开发人员、测试人员、项目经理、产品经理等。
  (一)软件安全需求分析
  在软件需求分析阶段,不仅要考虑系统的功能需求,还要考虑系统的安全,比如不应该做什么。功能需求、安全需求、安全目标要达到平衡,从安全的角度以风险管理为基础,建立“威胁”的分析计划,不仅要从用户的角度出发考虑系统的功能,还应从攻击者的角度出发考虑系统的漏洞。
  所以,在软件需求分析阶段,需要加入以下的安全方面的考虑:软件提供的安全功能、软件如何安全地与用户交互、安全方面的考虑对软件开发计划的影响、软件的风险评估和威胁模、 软件的默认功能配置等等。
  (二)软件安全設计
  软件系统的每一项需求,都应该在软件安全设计阶段认真考虑,根据安全需求方案确定的安全目标,对初步风险评估确定的控制措施的具体技术实现而进行安全设计。
  安全概要设计阶段,包括但不限于:安全体系结构设计、各功能块间的处理流程、与其他功能的关系、安全协议设计、安全接口设计等。
  安全详细设计阶段,作为安全功能的程序设计阶段,应当直接指导安全功能的编码工作。包括但不限于:模块设计、内部处理流程、数据结构、输入/输出项、算法、逻辑流程图等。
  软件安全设计的核心原则参考如下:
  如攻击面最小化、基本隐私、权限最小化、默认安全、纵深防御、威胁建模等等。其中威胁建模,微软使用的是STRIDE威胁建模方法,STRIDE的通用步骤如图2:
  威胁建模建议越早越好,一般在设计阶段进行,流程是,用程序建模(Diagram)、枚举威胁(Identify)、缓解威胁(Mitigate)、验证缓解措施(Validate)。
  (三)安全编码原则
  代码安全编译、代码安全审核、对所有输入数据进行检查、验证及过滤。
  (四)安全测试
  除了软件开发传统的单元测试,集成测试,系统测试和验收测试外,还要有系统的安全测试。安全测试是进行安全性的评估,而不是摧毁或破坏,一般常用模糊测试和渗透测试两种。
  模糊测试,也称Fuzz测试,一种通过提供非预期的输入并监视异常结果来发现软件故障的方法。该测试强制软件程序使用恶意或破坏性的数据并进行观察结果的一种测试方法。不够强壮的程序会崩溃,利用大量的测试用例,查找漏洞或可靠性的Bug,是一种非常有效的漏洞挖掘技术,已知漏洞大部分都是通过这种技术发现的。
  渗透测试是通过模拟恶意攻击者进行攻击,来评估系统安全的一种评估方法。该测试是从攻击的角度测试软件系统是否安全,使用自动化工具或者人工的方法模拟攻击者的输入,找出运行时刻目标系统所存在的安全漏洞。通过渗透测试找出来的问题都是真实的,也是较为严重的,但渗透测试一般只能到达有限的测试点,覆盖率较低。
  两者相比较,Fuzz测试尝试着通过半随机的方式进行数据发送,来找出系统的漏洞,这样极大的降低安全性测试的门槛。然而,Fuzz测试这样也要求测试人员对被测的系统有更一定深度的了解,才能生成更准确的结果。与渗透测试相比,模糊测试显然更易于进行。而且,借由自动化的测试工具,模糊测试可以把安全方面的经验积累集成到测试工具中,从而为组织的持续的安全性测试提供组织财富积累。
  安全测试,对测试人员还有一定的特殊要求,比如技术、知识和经验都很重要,像“坏人”一样思考安全问题,在做安全测试过程中,要做好系统备份、恢复措施和风险规避等方面的充分准备。
  最后,软件系统发布时必须要包含安全事件响应计划。该计划即使在发布时不包含任何已知漏洞的产品,也要包含可能在日后面临新出现的威胁。此外,还要关注的是,若是产品中有外包的部分,即包含第三方单位开发的源代码,也需要留下第三方的联系方式并加入事件响应计划,以便在发生问题时能够找到相应的责任人。
  综上所述,我们在软件开发过程中,要在各传统阶段时,时刻不忘信息安全的管理,总结如下原则和要点:   1.做好信息安全的培训,要求整个团队树立好信息安全的意识;
  2.进行充分沟通,包括与客户、领導、项目经理、团队中相关干系人等;
  3.规范整个生命周期的流程,确保所有项目都与安全团队保持良好沟通,避免遗漏;
  4.增加独立的安全团队,并树立安全部门的权威性,各个项目需由安全部门审核通过后才可正式发布;
  5.将安全的技术方案写到需求、设计等工作文档中;
  6.记录所有安全相关的缺陷,激励开发人员编写更安全的代码,进行信息安全的知识库的积累,形成持续改进的良性循环。
  四、软件开发过程中的信息安全管理
  那所有软件的开发是不是都必须完整地遵循软件“安全开发”过程呢?答案并不是。
  软件同其他产品不同,软件产品具有明显的特殊性,软件产品在开发过程中的信息安全管理也更具复杂性。
  首先,考虑完成该软件开发的整个过程是否达到了一定要求。我们在实践中不断总结,以基于ISO9001标淮,同时吸收CMMI的原则,制定的软件安全开发程序文件和指导书,拟制记录这些流程操作的记录表格模板。软件安全开发过程包含合同评审、采购、项目管理、软件开发、变更控制、设计评审、文档控制、测试控制、不合格品控制、现场安装、售后服务、技术支持、培训管理等等,保证软件开发过程体系有效性的管理评审、内审、文件/记录控制、纠正/预防措施控制等程序文件,从而为安全开发过程的各项操作提供科学合理的指导,以此构成完整严密的安全开发过程保证体系。
  总之,软件的安全开发,应具体问题具体分析,结合相应的场景,实际的情况,对软件安全开发的过程进行定制裁剪,如可以选择:代码审核 + 体系结构风险评估,基于风险的安全测试 + 渗透测试,安全需求分析 + 滥用案例开发,代码审核 + 渗透测试,体系结构风险分析 + 基于风险的测试等等组合方式,有的放矢,综合平衡考虑各影响因子,按需选用。
  五、结论
  随着软件安全开发的日益受到关注,各种安全管理模型也逐渐出现,但各种理论模型如何和企业的需求有机结合,让真正简单适用的模型在组织中落地,让组织从中获益,需要所有相关人员从理论到实践,从实际工作出发,共同探讨解决方案,尽早形成软件组织的自主创新的的安全开发模式。
转载注明来源:https://www.xzbu.com/8/view-15168814.htm