本文内容均来自个人笔记并重新梳理,如有错误欢迎指正!
如果对您有帮助,烦请点赞、关注、转发、订阅专栏!
专栏订阅入口
| 精选文章 | Kubernetes | Docker | Linux | 羊毛资源 | 工具推荐 |
往期精彩文章
【Docker】(全网首发)Kylin V10 下 MySQL 容器内存占用异常的解决方法
目录
一、背景介绍
继笔者不久前实现了基于 GitLab 流水线的 Golang 代码质量检查后,公司研发侧再次提出,需要在 Golang 代码项目发起合并请求时,自动对代码内容进行漏洞扫描,用于及时发现代码安全隐患。经过调研和验证,笔者最终通过 gitlab-runner + Govulncheck 的方式实现了该需求。
本文将详细介绍 GitLab 实现 Golang 代码漏洞扫描的相关过程,GitLab 服务相关信息如下:
-
版本信息:GitLab CE 17.4.2
-
部署组件:GitLab、PostgreSQL、Redis
-
部署方式:Kubernetes 环境下,部署为 StatefulSet 对象(后续找时间出部署教程)
-
镜像名称:sameersbn/gitlab:17.4.2
二、过程介绍
1、gitlab-runner 部分
1)新建实例 runner
- 使用管理员账号登录 GitLab 服务控制台,进入 Admin area 界面后依次点击:「CI/CD」->「Runner」->「创建实例 runner」

-
填写好相关信息后,点击「创建 runner」

-
记录下身份验证令牌后,直接返回即可


2)部署 gitlab-runner 并注册
由于当前部署的 GitLab 服务的版本高于 15.6,gitlab-runner 只能采用 Helm Chart 方式部署。
https://docs.gitlab.com/runner/install/kubernetes.html
-
下载 Helm Chart 文件(以 17.4.2 版本为例),命令如下:
helm repo add gitlab https://charts.gitlab.io --force-updatehelm search repo -l gitlab/gitlab-runner | grep 17.4.2helm pull gitlab/gitlab-runner --version 0.69.2 --untar
-
创建部署配置(在此配置注册信息),命令如下:
cat > values-config.yaml <<EOF
image:
registry: docker.io
image: gitlab/gitlab-runner
tag: alpine-v17.4.2
livenessProbe:
initialDelaySeconds: 60
periodSeconds: 10
successThreshold: 1
failureThreshold: 3
terminationGracePeriodSeconds: 30
readinessProbe:
initialDelaySeconds: 60
periodSeconds: 10
successThreshold: 1
failureThreshold: 3
gitlabUrl: https://gitlab.demo.com/ # GitLab 服务地址
runnerRegistrationToken: "glrt-xxxx" # 之前记录的身份验证令牌
runnerToken: "glrt-xxxx" # 之前记录的身份验证令牌
rbac:
create: true
generatedServiceAccountName: "gitlab-ci-runner"
serviceAccount:
create: true
name: "gitlab-ci-runner"
metrics:
enabled: true
securityContext:
allowPrivilegeEscalation: true
privileged: true
EOF
-
执行部署命令如下,等待部署完成后,实例 runner 状态将从「未连接过」变为「在线」
helm upgrade -i -f values-config.yaml gitlab-ci-runner ./gitlab-runner
# ⚠️ 若修改后再次执行,可能导致 gitlab-runner 实例被删除!
2、Govulncheck 部分
1)构建 Govulncheck 镜像
mkdir govulncheck && cd $_
cat > Dockerfile <<EOF
FROM golang:1.23
RUN go install golang.org/x/vuln/cmd/govulncheck@v1.1.3
EOF
docker build -t govulncheck:v1.1.3-go1.23.3 -f Dockerfile .
=====================================================================================================
🔔 若后续运行过程中出现报错 "go.mod requires go >= 1.23.2 (running go 1.22.6; GOTOOLCHAIN=local)",
表明 Govulncheck 镜像中 Golang 版本低于项目 go.mod 中声明的版本,需要使用更高版本的 Golang 基础镜像重新构建
2)配置 GitLab 流水线
# 在 GitLab 项目目录下执行
cat > .gitlab-ci.yml <<EOF
govulncheck:
image: govulncheck:v1.1.3-go1.23.3
script:
- export PATH=$PATH:$GOPATH/bin
- export GOPROXY=https://goproxy.cn,direct
- govulncheck ./...
only:
- merge_requests # 仅在代码合并时触发流水线
EOF
=====================================================================================================
🔔 Govulncheck 命令用法
# govulncheck -h
Govulncheck reports known vulnerabilities in dependencies.
Usage:
govulncheck [flags] [patterns]
govulncheck -mode=binary [flags] [binary]
-C dir
change to dir before running govulncheck
-db url
vulnerability database url (default "https://vuln.go.dev")
-format value
specify format output
The supported values are 'text', 'json', 'sarif', and 'openvex' (default 'text')
-json
output JSON (Go compatible legacy flag, see format flag)
-mode value
supports 'source', 'binary', and 'extract' (default 'source')
-scan value
set the scanning level desired, one of 'module', 'package', or 'symbol' (default 'symbol')
-show list
enable display of additional information specified by the comma separated list
The supported values are 'traces','color', 'version', and 'verbose'
-tags list
comma-separated list of build tags
-test
analyze test files (only valid for source mode, default false)
-version
print the version information
3、最终效果验证
-
为某个 Golang 代码项目提交 cr-test 分支到 cr-master 分支的合并请求,GitLab 服务将自动触发代码漏洞扫描的流水线,合并请求详情如下图:

-
点击流水线 #830 可以跳转查看代码漏洞扫描过程详情,如下图:


最终可以看到合并请求流水线的状态变为「已失败」,审批人可以根据代码漏洞扫描结果决策是否继续执行合并操作

1037

被折叠的 条评论
为什么被折叠?



