当前位置:首页 > 技术文章 > 正文内容

「终极方案」Dependency Check定时稳定更新cve数据的实现思路

zonemu2个月前 (08-07)技术文章28


在文章「干货」Dependency check配置Mysql数据库存储nvd数据

介绍了如何把nvd库中的cve信息保存到数据库中的方法!但这仍然不是最优的方案,客户端执行脚本后,仍然需要更新cve数据到数据库中,虽然稳定性会得到保障,但是依然会浪费一定时间!那么我们的终极方案是什么呢?

实现思路其实也非常简单,只需两步

步骤一、定时更新最新的cve信息到数据库

步骤二、客户端执行dependency-check时,设置较长的校验时间使其无须检测更新,直接从数据库中读取数据

这里注意,步骤一和步骤二是分开进行的,先执行cve信息的更新,然后客户端执行dependency-check,这样就能保证dependency-check执行时数据库中cve数据的即时性了!

定时更新cve

定时更新最新的cve信息到数据库

dependency-check.bat --cveStartYear 2022 --updateonly --dbDriverName com.mysql.cj.jdbc.Driver --connectionString jdbc:mysql://127.0.0.1:3306/dependencycheck --dbUser dcuser --propertyfile d:\dependency\pwd.properties

这条语句需要注意的参数有:

cveStartYear 2022 表示只更新2022年的nvd种子数据,因为我们数据库中已经有以前年份的数据了,所以通过这种形式则实现了迭代更新,会大量的缩短更新时间!注意:在dependencycheck 7.1才开始有该参数。

updateonly 表示只更新数据,不进行扫描

dbDriverName 表示数据库的dirver名称

connectionString 表示连接数据库的字符串,执行初始化脚本后创建的数据库叫dependencycheck

dbUser 是用户名,初始化的用户名叫 dcuser

propertyfile 这个参数是表示dcuser 的密码,需要在properties文件中存储,形式是:data.password=DC-Pass1337! 这个密码是执行初始化脚本后的默认密码

如果我们不需要对某种指定类型的文件进行检测分析,可以使用参数—disable*** 放弃对指定的文件类型进行分析进而提升检测效率。例如:disableRetireJS、disableNodeJS、disableNodeAudit、disableAssembly等等。

详细参数使用可以参考官方文档:

https://jeremylong.github.io/DependencyCheck/dependency-check-cli/arguments.html

详细的分析器参数含义如下图所示:

文档链接,
https://jeremylong.github.io/DependencyCheck/analyzers/index.html

定时任务更新CVE

最后我们就可以写一条定时任务,在指定的时间对cve数据库进行及时更新了!

思路一:脚本编写定时任务,具体实现方式这里不再赘述,自行百度即可。也可以参考文档
https://jeremylong.github.io/DependencyCheck/data/cachenvd.html)

思路二:通过jenkins 创建一个定时任务执行dependency-check

设置较长的cve有效检测时间

dependency-check.bat --scan ${scanProject} --format HTML --out ${project_path} --dbDriverName com.mysql.cj.jdbc.Driver --connectionString jdbc:mysql://127.0.0.1:3306/dependencycheck --dbUser dcuser --propertyfile /opt/scripts/config/pwd.properties --cveValidForHours 8800 --disableRetireJS --disableNodeJS --disableNodeAudit –disableAssembly

注意这里使用了参数--cveValidForHours 8800 ,它的定义是每8800 小时(即一年)才更新nvd数据库中的cve信息(默认是4小时)。因为我们已经实现了从数据库中读取cve信息,而数据库里的cve信息是每天都进行增量更新的,因此在客户端我们就不需要再重新发起检测cve信息的请求了,这样也就避免了客户端与定时任务更新nvd库的重复操作!

总结

最后总结一下定时稳定更新cve数据的实现的思路!

1.在jenkins 中每天执行更新cve的操作

dependency-check.bat --cveStartYear 2022 --updateonly --dbDriverName com.mysql.cj.jdbc.Driver --connectionString jdbc:mysql://127.0.0.1:3306/dependencycheck --dbUser dcuser --propertyfile d:\dependency\pwd.properties

2.客户端执行时,设置较长的cve有效检测时间

dependency-check.bat --scan ${scanProject} --format HTML --out ${project_path} --dbDriverName com.mysql.cj.jdbc.Driver --connectionString jdbc:mysql://127.0.0.1:3306/dependencycheck --dbUser dcuser --propertyfile /opt/scripts/config/pwd.properties --cveValidForHours 8800 --disableRetireJS --disableNodeJS --disableNodeAudit –disableAssembly

相关文章

vue 3 学习笔记 (八)——provide 和 inject 用法及原理

在父子组件传递数据时,通常使用的是 props 和 emit,父传子时,使用的是 props,如果是父组件传孙组件时,就需要先传给子组件,子组件再传给孙组件,如果多个子组件或多个孙组件使用时,就需要传...

jenkins2.107+tomcat8+jdk1.8的安装和发布代码3种方式

jenkins2.107+tomcat8+jdk1.8的安装和发布代码3种方式如果对运维课程感兴趣,可以在b站上或csdn上搜索我的账号: 运维实战课程,可以关注我,学习更多免费的运维实战技术视频1....

Jenkins 学习笔记(jenkins要学多久)

本学习笔记参考《Jenkins 2.x实践指南》。1. Jenkins 简介#Jenkins 是一款自动化的任务执行工具。通常用于持续集成/持续交付领域。可以通过界面或Jenkinsfile告诉Jen...

基于Docker构建安装Git/GitLab,以及制作springboot工程镜像

今天给大家分享的是《领先的开源自动化服务器Jenkins的应用实战》之基于Docker安装构建Git/GitLab版本控制与代码云存储的场所;使用Git管理项目,springboot工程制作镜像知识体...

「云原生」Containerd ctr,crictl 和 nerdctl 命令介绍与实战操作

一、概述作为接替Docker运行时的Containerd在早在Kubernetes1.7时就能直接与Kubelet集成使用,只是大部分时候我们因熟悉Docker,在部署集群时采用了默认的dockers...

web前端是什么,在哪些地方有应用,html和html5区别都在这里了

web前端是什么,在哪些地方有应用简介web前端开发技术什么是html、html5什么是css、css3什么是js,javascriptweb前端的应用大家好,我是ots_luo,很多小伙伴不知道we...