最近研究了一下热门话题:DevSecOps,明白了不少网络安全方面的概念和不少顶级的开源安全扫描工具,现分享给大家。
过去,每个公司有一个信息安全防护的部门,专门负责公司的IT信息安全,当公司IT软件部署好以后,信息防护部门会对其进行大量的安全扫描及安全加固,以防止安全漏洞。而扫描出的漏洞,一方面可以通过基础设施或者网络加固解决,一方面可能会对研发部门提Bug,进行漏洞修复。整个过程耗时长,成本高。 DevOps引入后,我们要左移运维,同时左移安全扫描,也就是说,从研发生命周期开始,就考虑安全问题,这就是DevSecOps。
我们以Gitlab Auto DevOps的为例来说一下DevSecOps的流程,可以看到和安全相关的有7步之多(红色部分)。:
自动构建(build): 代码编译, 打包,容器image构建过程。
- 自动代码质量检查(code_quality): 扫描检查代码规范。
- 自动静态安全扫描(auto_sast): 根据代码模式,扫描潜在的安全风险,检查像Sql注入, XSS跨站点脚本攻击等。
- 自动密码检测(auto_secret_detection): 扫描检查代码中出现的明文密码。
- 自动依赖检查(auto_dependency_scanning):扫描项目依赖包中的已发布的安全漏洞。
- 自动开源协议检查(auto_license_compliance):扫描依赖的开源协议是否兼容。
- 自动容器安全扫描(container_scan):扫描检查容器镜像的安全漏洞。
- 自动rewiew(测试部署)
- 自动动态扫描(auto_dast):动态安全扫描,通过爬取网站内容和自动浏览网站进行安全扫描。
- 自动生产环境自动部署
开源软件以势不可挡的趋势在各领域的软件或者IT解决方案中占有越来越大的比重和地位,也让网络安全问题日益突出,每个软件公司或者任何公司的IT部门,都应该尽可能快的引入DevSecOps。同时开源也出现了各种顶级的安全扫描开源软件,为DevSecOps解决方案提供了答案。当然开源解决方案的优势绝不是免费,某种意义上说,开源方案和商业解决方案成本相当。开源解决方案中的成本包括服务成本,集成成本,二次开发成本(外部的成本或者本公司自建研发团队的成本)。开源解决方案的优势主要在于其软件的透明性,可持续性,可掌控性,以及更加广泛的社区支持。
先说CWE,CVE, NVD,CNVD,CNNVD都是什么,以及他们的关系。我们在安全扫描工具的扫描报告中,会看到CVE-xxxxx-xxxxx代表一个漏洞。这个是什么呢?我们看一下CVE网站,CVE是社区维护的(也算是开源的了)以命名,定义,和分类网络安全漏洞为目的的公共网络安全漏洞库,1999年发布, 目前150800个安全漏洞。CVE解决了不同的安全漏洞厂商各自描述漏洞的问题,厂商发现安全漏洞后,在CVE中请求一个统一ID并提交漏洞描述,一旦确认,所有的安全扫描工具都是用此ID及其描述来表述此漏洞,CVE中的每个安全漏洞都是某个软件的已经被证实的安全漏洞。然而,很多安全扫描工具都声称支持NVD安全漏洞库,那NVD是什么呢?NVD是美国国家标准中心提供的网络安全漏洞库,它以CVE的库作为输入,分析CVE中的漏洞,根据漏洞的描述,提供可能出现此漏洞的代码模式(CWE),以及建议的修复方式等信息。所以对于安全扫描工具来说,NVD库当然更有意义了,因为其中信息更多。 顾名思义,CNVD就是中国的NVD了,全名国家信息安全漏洞共享平台(China National Vulnerability Database), 是由国家计算机网络应急技术处理协调中心(中文简称国家互联应急中心,英文简称CNCERT)联合国内重要信息系统单位、基础电信运营商、网络安全厂商、软件厂商和互联网企业建立的国家网络安全漏洞库。而CNNVD是中国国家信息安全漏洞库,隶属于中国信息安全测评中心(一般简称国测,国测的主管单位是Security部),是中国信息安全测评中心为切实履行漏洞分析和风险评估的职能,负责建设运维的国家级信息安全漏洞库。那CWE是什么呢,我们经常看到说某个安全工具是CWE兼容的。CWE和CVE都是mitre公司运营的,也是一个社区主导的list(开源理念再现)。此list和CVE的list不同,我们把它叫做弱点(weakness),注意不是漏洞(Vulnerabilities),这个库是把软硬件可能出现漏洞的模式,例如内存泄漏,Sql注入等分类,用一个标准的通用的分类库描述。我们可以这么理解, 每一个CVE(是某个软件确确实实发现的漏洞)都是某个CWE类型引起的。
理解了以上几个库,我们就会明白,通常情况下,静态安全扫描(SAST),动态安全扫描(DAST)等工具,扫描出来的是疑似的漏洞,符合的是某个CWE特征。 而依赖扫描,会报告依赖的软件已知的漏洞,通常情况下是从NVD,CNVD,CNNVD中查到的某个CVE号,并提供相关的分析信息及修复建议。
下面我来推荐每个安全扫描阶段的开源解决方案:
**代码质量检查(code_quality):**此阶段通常情况下检查代码的编码规范。最流行的就是SonarQube了。 如果我们的方案更接近云原生,建议大家使用Code Climate Cli加上各种engine,都是docker 容器镜像发布。
静态安全扫描(auto_sast):静态代码扫描工具非常多, 不同的语言与不同的扫描工具。
语言 | 工具 |
---|---|
.NET Core | Security Code Scan |
.NET Framework | Security Code Scan |
Apex (Salesforce) | PMD |
C/C++ | Flawfinder |
Elixir (Phoenix) | Sobelow |
Go | Gosec |
Groovy | SpotBugs with the find-sec-bugs plugin |
Helm | Kubesec |
Java | SpotBugs with the find-sec-bugs plugin |
Java (Android) | MobSF (beta) |
JavaScript | ESLint security plugin |
JavaScript | Semgrep |
Kotlin (Android) | MobSF (beta) |
Kubernetes manifests | Kubesec |
Node.js | NodeJsScan |
Objective-C (iOS) | MobSF (beta) |
PHP | phpcs-security-audit |
Python | bandit |
Python | Semgrep |
React | ESLint react plugin |
React | Semgrep |
Ruby | brakeman |
Ruby on Rails | brakeman |
Scala | SpotBugs with the find-sec-bugs plugin |
Swift (iOS) | MobSF (beta) |
TypeScript | ESLint security plugin |
TypeScript | Semgrep |
密码检测(auto_secret_detection):gileaks。
依赖检查(auto_dependency_scanning):snyk, OWASP dependency-check
开源协议检查(auto_license_compliance):License Finder
容器安全扫描(container_scan):Clair
自动动态扫描(auto_dast):OWASO ZAP