我所理解的研发安全

admin 2023年11月14日11:15:37评论79 views字数 5144阅读17分8秒阅读模式

最近与朋友聊起SDL和DevSecOps的建设和落地,觉得可以将我理解的SDL体系建设来整理下,分享给大家,一家之言,欢迎大家与我讨论!

一、前言

 上次写了《蓝军建设的一些不成熟的思考》,当时除了带领蓝军建设外,还有一个重要的工作是应用安全建设,对于应用安全建设,当时按工作分为了三大部分-主动发现、被动防御、安全运营。

    对于这三部分也写了《应用安全体系建设之路》,对三部分进行了简单的建设。里面简单介绍了SDL和DevSecOps的异同。最近重心放在了SDL上面,对SDL又有了新的理解,在这里和大家分享下我所理解的SDL建设,也就是研发安全的建设,相比之前有了更深入的理解。

    研发安全,顾名思义就是怎样让研发的产品更加安全,这个理念最早由微软提出,过程涉及到了需求-设计-编码-测试-发布等阶段,每个阶段制定了不同的安全活动。

二、研发安全开展必要性

    研发安全现在越来越被公司所采纳,一方面研发安全可以降低安全问题的修复成本:在传统的安全防护中,很多依赖防火墙、入侵检测来实现,都是在软件交付后安全防护,都是属于被动式防御手段,这种手段优势是可以快速部署,但同时缺点是安全介入较晚,产品已经成型了,后续发现问题后修复成本比较大,据美国国家标准与技术研究所统计,发布后的修复成本是产品设计阶段修复成本的30倍。

    另一方面是“磨刀不误砍柴工”,这个咋理解呢?很多研发都将产品功能实现放在第一位而忽略了安全的内容,但是一旦上线或者过程中被管理机构指出存在风险,产品可能就存在延期上线或者下线的风险,现在国家、国际社会对于安全的重视程度越来越高,现在产品被召回或者下架的案例也是频繁出现的。研发安全是将安全贯穿到产品研发的每个阶段,在每个阶段都考虑到安全,后续产品也会少很多麻烦。

三、研发安全开展的特殊性

微软SDL流程如下,这个也是大多数企业采用的流程框架:

我所理解的研发安全

    对于每个阶段都包含强制性的检查和审批,以确保所有安全和隐私要求以及最佳做法得到妥善解决。这两个支持安全活动(培训和响应)分别在核心阶段之前和之后进行,以确保它们得到正确实现,并且软件在部署后保持安全。

    但是在推动开展期间,每个公司都有他独特的研发特点,若是按照微软的SDL活动和方式开展是推动不下去的,很多时候需要针对研发特点对微软的SDL进行改造和适配。可以认为微软提供的是一套框架,一套方法论,具体如何落地实施,是需要进行改造和优化的,例如,互联网公司的敏捷开发模式,若是单纯按照微软SDL进行实施,也许一个产品走完SDL之后,市场已经被瓜分完了。再比如,在传统企业里面,SDL会侵入到研发流程中,会引起研发人员反感,若是一味根据自己的方式推动SDL,可能就会适得其反。如何改造SDL,如何推动SDL的落地,这个很多时候不是站在安全角度考虑,而是应该站在研发团队的角度、站在老板的角度来看。

四、研发安全框架

    对于研发安全来说,如上,微软给出了实施框架,如包括培训、要求、设计、实现、验证、发布、响应几个阶段:

  • 培训:要求员工参加安全培训,并且分为不同的角色、级别进行。

  • 要求:对于每个产品、服务、功能都有明确的安全和隐私的要求,要求的来源是行业要求、法规、最佳做法等

  • 设计:对要求进行实现,创建威胁建模、识别风险和潜在威胁,并且提出缓解或者杜绝风险出现的设计方案

  • 实现:通过代码开发实现安全要求及设计方案

  • 验证:对实现的功能验证是否满足安全要求及设计的内容,对产品进行安全检查

  • 发布:提交产品上线,过程中需要必要的安全测试和评审工作

  • 响应:作为安全运营部分,通过技术和数据运营检查SDL的效果

    这几个步骤很好的说明了研发安全几个阶段的工作内容,但是对于企业来说,这些仅仅是在研发安全成熟或者有了初步规模后才可以完整的推进的。

    对于很多企业来说,刚开始应用安全就按照微软的这套流程走是完全不现实的,很多企业刚开始都是先从安全测试做起,严卡产品上线。

    大多数公司对于研发安全的模式推动应该几乎都是如此:

严卡产品上线,研发和安全的矛盾就会凸显出来,安全和项目出现争议,然后到沟通协作,考虑如何进行安全左移、在研发阶段就能考虑安全性,解决风险,制定制度、流程、管理,工具建设、责任划分等等,明确之后,推动落地实施。

     在微软基础上,增加了制度、流程、工具及组织建设四个方面,构建了研发安全框架如下,个人意见,仅供参考:

我所理解的研发安全

四、研发安全推动落地
    上面已经说到了整体的框架,那么怎么将这些实际落地下来,这个才是关键,对此我们一步步的进行详细说明。
1.  组织
    组织是一个工作最开始需要考虑的,研发安全对于企业来说,不只是安全或者研发团队单独的事情,这块需要综合考虑,由于涉及到两个团队的合作,需要成立一个上层的研发安全虚拟组织,自上而下推动,安全与研发的矛盾不可避免的,需要有领导小组来协调和组织两个团队的工作开展。
前公司的结构是由安全总监、研发总监共同成立领导小组,总经理任组长开展工作。遇到不可调节的时候会进行裁决,遇到安全事件之后也会进行责任划分。

    对于工作小组,个人认为可以参照如下组织形式:

    安全团队内部成立SDL组,负责SDL整体的规划和管理,负责上层规范、制度、流程制定,指导组织SDL在研发团队的落地实施,形成第一道防线,防止产品存在漏洞上线;蓝军负责检验SDL的效果,并且组成第二道防线,对上线后产品进行例行检查和风险发现,并且采用黑客视角来审视产品;运营分为内部和外部运营:内部运营对WAF、入侵检测的数据进行分析,发现未被SDL和蓝军发现的未知风险,及时进行封锁和风险发现,属于第三道防线;外部运营则利用外界白帽子和外部安全力量对产品进一步发现安全问题,例如现在的SRC和Hackerone等等,也算做第四道防线。

    安全团队四道防线,从研发阶段到最终运营阶段。而对于研发团队同样如此:

    研发团队内部成立研发安全虚拟小组,承接安全团队SDL组需求及落实规范制度,指导研发团队开展研发安全工作。小组成员包括安全SE/安全BP、团队安全接口人等等。

    系统负责人是第一道防线,负责对安全需求、安全设计制定,谁的系统谁是第一负责人;研发人员是第二道防线,落实研发安全需求和安全设计,对代码安全性进行把关;研发安全虚拟小组评审、卡点、抽查等是第三道防线;背后安全团队是第四道防线。

2. 流程
    流程同样基于微软SDL流程建立,分为培训、需求、设计、编码、测试几个阶段。
    在最近工作中逐步发现安全培训或者叫做安全文化建立的重要性,研发安全是安全和研发团队共同的事情,但现在很多研发团队普遍认为安全是安全团队的事情,这个问题若是没有意识到,对于研发安全工作推进是一个相当大的阻碍。
    (1)培训阶段
    该阶段不单单是安全培训工作,更多的是引导一种安全文化的建立,使大家更加了解研发安全,可以采用如下几个活动:
    • 海报、易拉宝、宣传标语等宣传手段,经过耳濡目染,潜移默化的使大家意识到安全与自己的关系。
    • 安全培训:最常见的提升安全意识的方式,不过在执行安全培训的过程中有几点可以给大家作为参考,培训内容需要针对不同的人,不同的级别来进行的,若是均使用同一个课程,不仅达不到预期的效果,可能还会反噬,认为安全和我无关。安全培训可以按照面向的对象大方向可以分为:通用安全培训(新员工、技术、非技术),主要讲解安全导致的问题及造成的危害、外部管理机构的要求、国家的处罚等等,使大家了解安全的重要性;专项安全测试(研发人员、设计人员、产品经理等等),根据特定的研发场景讲解安全设计、安全编码等内容,以提升技术能力为主;针对管理层,重点讲解安全的重要性,对企业成本的收益、违反后的惩罚法规等。通过分层的培训内容,使所有人统一认识到研发安全工作的意识和分工。
    • 数据化运营:这部分主要是通过数据化的方式来展示出研发安全的效果,通过数据化分析的方式,对研发团队各个阶段进行数据情况展示给领导层的虚拟管理组织,通过对领导层展示来说明问题,而无需公开,分析各团队在各个阶段的问题,是优是坏,一目了然。
    • 安全活动:可以通过举行内部CTF、研发安全文化活动等等开展,对于内部CTF,在开展期间,对于大家的研发安全意识的提升效果很好,使大家从被动接受转变成主动学习、主动接受。
(2)需求阶段
    该阶段主要是对要实现的功能需求进行安全需求分析,该部分就需要系统负责人、产品经理等根据功能需求结合自己的系统分析出安全需求来,很多人会认为安全需求应该安全人员提出,若是这样的话,安全人员会成为瓶颈,并且需要了解企业所有的系统和业务功能才能实现,这块需要将责任落实到项目研发团队,研发安全团队可以对其进行赋能指导。这样也是为啥在体系框架中要成立研发安全虚拟小组的原因,安全人员深入到项目研发中、了解项目研发,才能更好的指导及赋能。
活动可以参考如下模型:
    规范:行业标准、国家标准、安全需求基线
    输入:业务需求
    活动:解读国家标准/行业标准(安全)、明确安全要求(安全)、明确安全需求(研发)、安全需求评审(安全)
    工具:威胁建模系统
    输出:安全需求
(3)设计阶段
    该阶段主要是通过设计来如何实现安全需求内容,过程中同样需要项目组根据系统来考虑安全内容进行设计,提出技术方案等内容,同样研发安全小组对其进行赋能和指导。
模型如下:
     规范:应用安全设计规范、安全设计指南
     输入:安全需求、业务需求
     活动:编写总体技术方案(研发)、确定设计要求(安全)、明确安全设计(研发)、安全设计评审(安全)
     工具:威胁建模系统
     输出:安全设计
(4)编码阶段
    该阶段是研发安全的重要阶段,所有的需求和设计都是需要代码来实现的
    规范:安全编码规范
    输入:安全方案、安全设计
    活动:遵循安全编码规范(研发)、编写安全代码(研发)、代码安全扫描(研发)
    工具:组件安全扫描、代码安全扫描系统、CICD
    输出:代码、产品
(5)测试阶段
    该阶段是研发安全的验收阶段
    规范:安全测试规范、安全测试指南
    输入:产品、代码
    活动:安全测试(研发+安全)、渗透测试(安全)
    工具:安全测试工具、IAST、DAST、SAST
    输出:安全测试报告
(6)发布
    该阶段为产品发布,过程中需要注意服务器的安全基线配置、安全加固等等内容,与研发安全关系不大,略过。
3、沉淀
    研发安全不是一朝一夕能建立成功的,需要长期和逐步迭代的过程。在推动建设过程中会遇到各种各样的问题和解答,同样在工作过程中也会产生工作记录和数据等等。
    结合运营思维,将研发安全运营起来。
  • 很多企业有自己的知识库或者wiki,可以开辟研发安全专栏,将研发安全遇到的问题通过QA方式展示出来,减轻沟通成本;
  • 将研发风险统一解决方案进行总结讲解,提供给研发人员进行学习;
  • 将研发安全统一解决方案组件化,提供给研发人员,提升安全研发效率。
    有研发能力的可以建设研发安全门户,将工作数据、统一解决方案、研发安全系统入口归集到一起进行展示;基于GPT构建研发安全问答机器人也是可以尝试的一种方式。对于安全需求和安全设计的威胁建模,个人曾尝试解析业务需求,利用语义分析结合GPT来协助研发人员分析安全需求和安全设计内容,并且通过GPT搭建漏洞统一解决方案知识库。
4、自动化  
    前段时间一直认为SDL和DevSecOps是互斥的,一个是瀑布模式,一个是敏捷模式。但是在研发安全建设过程中,发现两者其实是互相补充的,SDL面向的是流程、强卡点、强审核,DevSecOps面向的是自动化,是流程系统化。
    对于项目研发来说,必备的两个系统-项目管理系统、代码管理系统,这两个应该是对于企业来说是基础必备的,安全要想和研发融入到一起,就需要借助这两个系统来进行,个人认为,对于项目管理系统,可以将SDL融入到里面,在项目的各个阶段增加安全评审,这样做到强卡点。若是安全不满足要求,禁止进入下一步。过程中接入威胁建模系统,研发可以在项目需求和设计阶段,输入功能直接输出安全内容。
    对于代码管理系统,集成SCA、IAST、DAST、SAST等等,实现DevSecOps,研发在编写代码和提交代码自动触发安全扫描和安全测试,制定门禁策略,对于不满足安全要求的,禁止进入到下一步编译或者上线阶段。
五、总结
一家之言,对近段时间开展SDL的一些想法和落地思路,欢迎大家一起讨论。

原文始发于微信公众号(YY的黑板报):我所理解的研发安全

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年11月14日11:15:37
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   我所理解的研发安全http://cn-sec.com/archives/2204060.html

发表评论

匿名网友 填写信息