再谈安全开发 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
hxndg
V2EX    程序员

再谈安全开发

  •  
  •   hxndg 2021-03-16 00:07:05 +08:00 1221 次点击
    这是一个创建于 1670 天前的主题,其中的信息可能已经有所发展或是发生改变。

    提到安全开发头头是道,真到开发的时候抓瞎了。身为一个从预研到开发的程序工程师,我来简单说说我所认识到的安全开发。由于我是单纯从开发干起,很多东西都是(我自己总结的)从开发的角度来谈的,因此难免有局限性。这个我本来是 append 到了 TLS 自动机研发, 但是想了想也可以摘出来,所以又发了一次。

    1.1 安全开发流程初期

    安全开发名字高大上,但是实际上是个苦差事,因为安全并不是水桶,而是一个气球:哪里扎破一个洞,立刻整个就崩了。因此初期把握好安全开发就很重要,我比较喜欢从下面几个方面来分析:

    • 目的是提供一款什么样子的安全产品?是提供端到端的加密?认证服务不可抵赖?秘钥管理?权限管理?安全监测?每种不同的属性对应着不同的功能。project leader 还常常需要进行产品的横向对比,从而能够保证功能的灵活性和创造性。
    • 需要保护哪些敏感信息,等级分为几种?比方说身份信息,权限信息,支付信息,爱好信息等等方面都可以被划归为敏感信息。
    • 可能遭受哪些攻击?相比上两种,这个问题是最具体的攻击,常见的攻击很多种:供应链攻击,SQL 注入
    • 可以复用哪些已有的安全工具和代码块?不要老去造轮子,要学会组合而不是创造。

    上面几个问题实际上是安全开发当中大的目标,分析好上面几个问题之后,最大的问题就来了,怎么落地?说起来也不难:

    1. 第一步 培训:培训的目的包含三个方面:使得每个参与者(不限于开发者,测试者,经理,审计....)了解产品提供的安全属性,安全准则和具体功能,尤其是要对产品经理培训使得其明白安全不是个绝对概念,是有选择倾向的,总要做出抉择;对每个参与进来的开发者培训,使得其清楚常见的安全知识,比方说对称加密的安全性由秘钥保证,hash 不是加密,什么方法提供认证功能等基础知识;对核心开发者明确产品的核心逻辑和模块的设计(不一定是高速开发者,而是让核心开发者设计),必须达成对功能和安全的共识!我们在做 TLS 自动机的时候核心就三个人,每个人都可以相互替换对面的功能,TLS1.3 新功能 REUSE 和 0-RTT 的核心逻辑也是我设计完了,争论了几次才确定的,我们的测试完全参与不到我们的培训里,因为听不懂。。。
    2. 第二步 需求和功能划分:确定需求是个很有趣,却不困难的工作。因为核心逻辑是围绕关键信息的,所以基本确定了敏感信息和核心逻辑之后,需求划分就比较简单了。但功能划分是个很麻烦的事情,一方面核心逻辑可能并不复杂,但是边界错误和细枝末节可能会出现大量问题,因此每个细微的工程都需要有人把关;另一方面,安全开发产品有很强的连续性,安全经常是成环的,因此要确保具体的代码开发者是了解开发的模块的输入 /输出 /隐喻 /保障的,因此需要保证开发者是真的懂怎么回事,而不是似是而非模棱两可。这里注意,划分功能意味着划分责任,有的开发爱甩锅,有的 QA 爱甩锅,这时候就看 project leader 的功力了。
    3. 第三步 颁发安全准则:培训了,需求确定了,功能划分了,到了写代码的时候新的问题就来了,怎么保证代码是安全的呢?针对 TLS 可以看我写过 TLS 三理念,更具体的一般是:第三方安全性,很多安全问题是由第三方安全保证的,开发工程师精力不够,找 QA 啊;函数安全;工具安全。

    多赘述一点东西:安全属性不是隔离的,端到端加密是很多功能的保证,但是奥卡姆的剃刀原则务必不要忘记,如无必要勿增实体,不要把其他层的东西放到本层来做!

    1.2 安全开发流程中

    安全开发流程中期实际上是个工程师埋头干活,抬头开会报进度的流程,这阶段的关注点在于 project leader 上。project leader 不但要对项目进度做好把握还要把握好需求变更的问题。project leader 还需要检查行为变化,细化安全规范。这就需要 project leader 能够明确安全的行为,并且能够根据具体的功能黑盒灵活的改变行为。

    坦白讲,做 TLS 自动机研发的时候,虽然复用和 0-RTT 是我负责,但是关于排期这事我没咋催,主力是我,小功能分出去的时候我会提前培训开发的同事;每天问问进度和问题;明确行为规范。所以没啥排期的变更,行为这块一开始三个核心争了很久,也很确定,所以没遇到啥大问题。

    1.3 安全开发流程后期

    安全开发流程后期实际上主要的关注点不再开发工程师上了,在于 QA 和运营人员:运营人员要执行静态检测和动态监测; QA 要执行模糊测试,输入测试等多种功能,这都不是问题。问题在于:project leader 和开发者要在开发前期和开发后期以高度透明的角度,参与 QA 的测试 CASE 制定!换言之 QA 和开发必须都审核过测试 CASE,从而避免出现什么“现实不可能发生,测试不全面”的扯皮。

    此外,需要记录开发过程当中遇到的实际问题和 BUG,并且将这些问题归类,加入到安全规范中。一方面能够给工程师提供具体的案例分析,另一方面能够很明确的细化规范和经验。实际上关于 0-RTT 的 DDOS 攻击我在分析 OPENSSL 的时候虽然想到了但是没明确,是后来 QA 参与进来我们才定性规定这是个问题的。

    最后,最蛋疼的收尾工作来了:

    • 如果出现问题,如何应对? project leader 需要根据具体的威胁制定针对补足方案,开发需要明确出现某种问题时,谁第一阶段参与,谁来参与追责。
    • 如果在具体的安全规范出现问题,依据什么原则,听谁的?
    • 开发和测试当中的资料归档在哪里?值得商榷的行为和安全保证的细节必须高度透明的写出来,并且能够被明确归档。
    • 可复用的工具,代码和属性是哪些?哪些应当成为标准组件?这些(第三方,第一方)工具,代码安全吗?实际上这里我最直接想到的就是 HKDF-EXTRACT & HKDF-EXPAND,一个安全并且规范化的灵活伪随机码产生工具。实际上这个工作是需要一线开发工程师一起参与的。

    1.4 遇到的安全开发中的问题

    简单说说我们在开发过程当中遇到的一些实际问题:

    • 人力不充足:人员短缺的问题很蛋疼,核心三人组是又订规范,又商量行为,光研究 RFC 就花了很久,更别提给其他人培训了。虽然能力增加了不少,但是确实很蛋疼。
    • 需求的变更:我对需求变更实在是太烦了,小的需求比方说拓展的支持还好说,解析的时候多花点功夫即可。如果大的属性变了,那排期就得大变。
    • 项目周期紧:这个对我们来说还好,虽然我们设计阶段功夫很多,但是设计好了我们的开发还是很快的。

    结尾

    实际上,从某种意义来说,安全开发是个文档>开发的过程,惊不惊喜,意不意外?

    目前尚无回复
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     907 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 21:59 PVG 05:59 LAX 14:59 JFK 17:59
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86