如何进行安全设计评审
记录一次安全设计评审的过程,当然这也是我第一次进行安全评审。因此做一个总结。安全设计评审应该是SDL落地安全人员参与过程中首当其冲的地方。仅指安全人员自身的功用。如果按照SDL
流程来讲,最前期应该是进行安全培训。我们可以看两个微软SDL官方给出的流程图。
那么在安全设计评审这一阶段,应该怎么去做。我们可以先看下唯品会的SDL中在落地安全设计这一块怎么做的。
就我自身而言。是按照以下这个流程进行的。
看着一大堆乱七八糟,自上而下的流程,但是做起来其实很快的。此处默认安全人员熟悉各种基本的开发过程中的安全规范以及一些Checklist
(必须要了解公司开发语言对应的安全开发规范),举例: web
安全开发规范,Python
安全编码规范,Flask
安全, Django
安全,常用的安全配置,面临哪些攻击点等等。
ps: 明确逻辑是非常重要的,可以说最为重要,如果连逻辑都不明白,谈什么设计评审。
一些比较基础的:
- HTTPS Everywhere
- Bcypt 存储Hash
- OTP
- 频率限制
- 盐不要硬编码
- secret 和 auth-token 不要硬编码
- 服务器间调用的api不要在app出现
- CSP, CSRF, HSTS, X-FRAME-OPTIONS, X-XSS-PROTECTION
- 过滤输入
等等等….
下面以C2C
平台交易部分为例进行说明,可以简单的想一下,在智联买一张火车票,打开了支付宝进行支付。:
然后,你知道数字签名当然是很基础的部分了。那么接下来,你就要细化支付流程过程中出现哪些操作,针对这些操作需要做什么样的防护措施。下图是针对用户商户支付方之间的流程:
针对每个输入点,自身可控的输入输出的地方,进行过滤,校验等操作。
所以那么问题来了,如果只单单是用户和支付方之间的呢?
你也可以思考一下如何进行。
并且在OWASP
应用安全设计中,详细指出了其他一些问题(中文版 Version 1.0 5):
数据流:
用户输入是否被直接用于引用业务逻辑的类或函数?
是否有一个数据绑定缺陷?
是否暴露任何后门参数来调用业务逻辑?
应用程序的执行流程是否正确?
身份验证和访问控制:
是否对所有文件实现访问控制?
是否安全地处理会话?
是否存在单点登录?单点登录是否留下后门?
已有或内置的安全控制:
在现有任意安全控制中的弱点;
安全控制的部署是否正确?
架构:
对所有的输入是否有验证?
到外部服务器的连接是安全的吗?
配置或代码文件和数据存储:
配置文件中是否含有敏感数据?
是否支持任何不安全的数据源?
下图(来自OWASP官方文档)详列上述条目以及其他需要检查的地方。
但是其实并不需要按照上述所有清单做自检,或者说是当你和开发团队在讨论的过程中不需要涉及全部的checklist,可能只需要在架构上,设计上进行检验,以及身份验证和数据检验上。当然,都是需要根据自己的业务场景去实现,因地制宜。