【K8s】GitLab 实现 Golang 代码漏洞扫描

本文内容均来自个人笔记并重新梳理,如有错误欢迎指正!

如果对您有帮助,烦请点赞、关注、转发、订阅专栏!


专栏订阅入口

| 精选文章 | Kubernetes | Docker | Linux | 羊毛资源 | 工具推荐 |


往期精彩文章

【Docker】(全网首发)Kylin V10 下 MySQL 容器内存占用异常的解决方法

【Docker】(全网首发)Kylin V10 下 MySQL 容器内存占用异常的解决方法(续)

【K8s】GitLab 实现 Golang 代码质量检查


目录

一、背景介绍

二、过程介绍

1、gitlab-runner 部分

2、Govulncheck 部分

3、最终效果验证


一、背景介绍

继笔者不久前实现了基于 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 可以跳转查看代码漏洞扫描过程详情,如下图:

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

行者Sun1989

您的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值