Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

优化容器化执行扫描时漏洞库下载与缓存持久化相关逻辑 #39

Open
myqonnt opened this issue May 23, 2023 · 4 comments
Assignees
Labels
enhancement New feature or request

Comments

@myqonnt
Copy link
Contributor

myqonnt commented May 23, 2023

dbUrl := config.GetStringArg(ConfigDbUrl)

方案 1:将离线扫描相关配置的处理逻辑改为由服务端处理,包括校验是否需要更新等,即由服务下载漏洞数据后挂载到执行容器上,移除镜像中下载漏洞数据的逻辑
-v {workDir}/persist/{scanner}/{version}/data/:/usr/share/dependency-check/data:rw
方案 2:服务端默认添加一个数据目录挂载参数,无论是否为离线扫描都挂载,在下载漏洞数据之前先判断数据目录下是否已有漏洞库,校验是否需要更新等,
-v {workDir}/persist/{scanner}/{version}/data/:/usr/share/dependency-check/data:rw

两种方案容器执行完不清除数据目录,或者只清理扫描产生的 cache等文件

@cnlkl cnlkl added the enhancement New feature or request label May 23, 2023
@cnlkl cnlkl changed the title 离线扫描时每次都需要重复下载漏洞数据,这部分是否可以优化? 优化容器化执行扫描时漏洞库下载与缓存持久化相关逻辑 May 23, 2023
@myqonnt
Copy link
Contributor Author

myqonnt commented May 24, 2023

请问更推荐哪种方案呢?我可以尝试先改一版 @cnlkl

@cnlkl
Copy link
Collaborator

cnlkl commented May 24, 2023

@myqonnt

1. 挂载参数配置

可以像方案二提到的支持为不同扫描器单独配置挂载参数,这里需要同时支持在k8s和docker中挂载存储

每次启动扫描容器时根据配置挂载存储到容器内,比如固定挂载到目标目录/bkrepo/scanner,扫描器可以用这个目录存储任意需要持久化的数据

2. 漏洞库更新方式

不适合放在服务内实现,因为不同扫描器的漏洞库更新方式不一样,单独一个定时任务处理与分析服务完全解耦会更好

因为离线扫描环境不一定能访问外网,本身就需要一个定时任务更新漏洞库到离线环境可访问的位置,可以在这个定时任务中更新漏洞库到要挂载的源目录

这里提到的定时任务可以用任意方式实现,不将这块逻辑放在分析服务或工具代码中

@myqonnt
Copy link
Contributor Author

myqonnt commented May 24, 2023

明白,确实放在外部实现会更好,存储离线漏洞库服务器可能也没有合适接口去查询漏洞库的更新时间、sha256等信息,由第三方在自己的定时脚本中处理更方便。
analysis-tool-sdk-golang 中关于下载离线库的逻辑打算增加如下逻辑不知道合不合适,还是说可以完全移除工具中下载离线漏洞库的逻辑?, 看了下代码,只要不配置dbUrl 就不会下载漏洞库了,好像不需要修改 sdk的代码了。 @cnlkl

// 检查目标数据目录是否存在指定数据文件列表, 如果任一指定文件不存在, 则删除目标数据目录
func existPersistData(dstDir string, filenames []string) bool {
	for _, filename := range filenames {
		filePath := filepath.Join(dstDir, filename)
		fileInfo, err := os.Stat(filePath)
		if err != nil {
			Info("File %s does not exist\n", filePath)
			removeAllFiles(dstDir)
			return false
		}
		Info("File %s exists with size %d bytes and mode %s\n",
			filePath, fileInfo.Size(), fileInfo.Mode().String())
	}
	return true
}

func removeAllFiles(dstDir string) {
	err := os.RemoveAll(dstDir)
	if err != nil {
		fmt.Printf("Error removing directory %s: %s\n", dstDir, err.Error())
	}
}

@cnlkl
Copy link
Collaborator

cnlkl commented May 25, 2023

@myqonnt 不需要修改sdk代码,但是要调整扫描器代码,把漏洞库和缓存的存放目录改成挂载到容器中的路径

myqonnt added a commit to myqonnt/ci-repoAnalysis that referenced this issue May 30, 2023
cnlkl pushed a commit that referenced this issue May 31, 2023
* feat: 统一扫描器离线相关配置处理逻辑 #39

* feat: 统一扫描器离线相关配置处理逻辑 -- 兼容历史配置 #39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

2 participants