一、背景介绍

咱搞开发的都知道,代码漏洞就像藏在角落里的小怪兽,冷不丁就会跳出来捣乱,给项目带来各种麻烦。Gitlab 作为一个强大的代码托管和协作平台,它自带了一些安全扫描工具,能帮咱们把这些小怪兽揪出来。接下来,咱就详细说说怎么利用 Gitlab 内置工具发现代码漏洞。

二、Gitlab 内置安全扫描工具简介

Gitlab 有好几种内置的安全扫描工具,像静态应用安全测试(SAST)、动态应用安全测试(DAST)、依赖扫描(Dependency Scanning)、容器扫描(Container Scanning)等。

  • 静态应用安全测试(SAST):就好比给代码做一个全面的体检,不用运行代码,直接分析代码的语法、结构,找出潜在的漏洞。比如 SQL 注入、跨站脚本攻击(XSS)等问题。
  • 动态应用安全测试(DAST):这个是在代码运行起来之后,模拟黑客的攻击,看看系统能不能扛得住。就像给系统来一场实战演习。
  • 依赖扫描(Dependency Scanning):现在的项目都依赖很多第三方库,这些库可能存在安全漏洞。依赖扫描就是检查这些依赖库有没有问题。
  • 容器扫描(Container Scanning):如果你的项目用了容器技术,这个工具就能检查容器镜像里有没有安全隐患。

三、配置 SAST 扫描

1. 创建 .gitlab-ci.yml 文件

在项目的根目录下创建一个 .gitlab-ci.yml 文件,这个文件就像是项目的操作指南,告诉 Gitlab 要做哪些事情。以下是一个简单的 SAST 扫描配置示例(技术栈:Java):

# Java 技术栈的 SAST 扫描配置
stages:
  - test

sast:
  stage: test
  image: docker:stable
  services:
    - docker:dind
  script:
    - export SAST_IMAGE="registry.gitlab.com/gitlab-org/security-products/sast:3"
    - docker pull $SAST_IMAGE
    - docker run --rm -e CI_PROJECT_DIR="$PWD" -v "$PWD":/code $SAST_IMAGE analyze
  artifacts:
    paths:
      - gl-sast-report.json
  • stages:定义了项目的阶段,这里只有一个 test 阶段。
  • sast:这是一个具体的任务,属于 test 阶段。
  • image:指定使用的 Docker 镜像。
  • services:使用 Docker 守护进程。
  • script:执行的脚本,先拉取 SAST 扫描的镜像,然后运行扫描。
  • artifacts:扫描结果会保存到 gl-sast-report.json 文件中。

2. 运行扫描

当你把代码推送到 Gitlab 仓库时,Gitlab 会自动根据 .gitlab-ci.yml 文件的配置运行 SAST 扫描。扫描完成后,你可以在 Gitlab 的 CI/CD 页面查看扫描结果。

四、配置 DAST 扫描

1. 配置 .gitlab-ci.yml 文件

以下是一个 DAST 扫描的配置示例(技术栈:Node.js):

# Node.js 技术栈的 DAST 扫描配置
stages:
  - test

dast:
  stage: test
  image: registry.gitlab.com/gitlab-org/security-products/dast:latest
  variables:
    DAST_WEBSITE: "http://your-website-url"
  script:
    - /analyze -t $DAST_WEBSITE
  artifacts:
    paths:
      - gl-dast-report.json
  • DAST_WEBSITE:指定要扫描的网站地址。
  • script:执行扫描命令。

2. 运行扫描

同样,把代码推送到 Gitlab 仓库,Gitlab 会自动运行 DAST 扫描。扫描完成后,查看 gl-dast-report.json 文件获取扫描结果。

五、配置依赖扫描

1. 配置 .gitlab-ci.yml 文件

以下是一个依赖扫描的配置示例(技术栈:Python):

# Python 技术栈的依赖扫描配置
stages:
  - test

dependency_scanning:
  stage: test
  image: registry.gitlab.com/gitlab-org/security-products/dependency-scanning:latest
  script:
    - /analyze
  artifacts:
    paths:
      - gl-dependency-scanning-report.json

2. 运行扫描

推代码到 Gitlab 仓库,触发依赖扫描。扫描结果会保存在 gl-dependency-scanning-report.json 文件中。

六、配置容器扫描

1. 配置 .gitlab-ci.yml 文件

以下是一个容器扫描的配置示例(技术栈:Docker):

# Docker 技术栈的容器扫描配置
stages:
  - test

container_scanning:
  stage: test
  image: registry.gitlab.com/gitlab-org/security-products/container-scanning:latest
  variables:
    CI_APPLICATION_REPOSITORY: $CI_REGISTRY_IMAGE
    CI_APPLICATION_TAG: $CI_COMMIT_SHA
  script:
    - /analyze
  artifacts:
    paths:
      - gl-container-scanning-report.json

2. 运行扫描

推代码到 Gitlab 仓库,Gitlab 会对容器镜像进行扫描,扫描结果保存在 gl-container-scanning-report.json 文件中。

七、应用场景

  • 开发阶段:在代码开发过程中,及时发现漏洞,避免漏洞积累到后期难以修复。比如在写代码的时候,用 SAST 扫描,能快速找出代码里的潜在问题。
  • 测试阶段:DAST 扫描可以模拟真实的攻击,对系统进行全面的测试,确保系统在上线前是安全的。
  • 部署阶段:依赖扫描和容器扫描可以保证项目使用的第三方库和容器镜像没有安全问题,防止在部署过程中引入安全隐患。

八、技术优缺点

优点

  • 集成方便:Gitlab 内置工具和 Gitlab 平台无缝集成,不需要额外的配置和部署。
  • 自动化:可以在代码提交、合并等操作时自动触发扫描,提高开发效率。
  • 多种扫描类型:涵盖了静态、动态、依赖和容器等多种扫描方式,能全面检测代码漏洞。

缺点

  • 误报问题:有时候扫描工具会把一些正常的代码当成漏洞,产生误报,需要人工去判断和排除。
  • 性能影响:扫描过程可能会消耗一定的系统资源,尤其是在大型项目中,可能会影响开发和测试的效率。

九、注意事项

  • 扫描频率:根据项目的实际情况,合理设置扫描频率。如果项目更新频繁,可以设置每次代码提交都进行扫描;如果项目比较稳定,可以适当降低扫描频率。
  • 结果分析:扫描结果出来后,要认真分析,区分真正的漏洞和误报。对于真正的漏洞,要及时修复。
  • 权限管理:确保扫描工具拥有足够的权限访问代码和相关资源,否则可能会导致扫描失败。

十、文章总结

通过 Gitlab 内置的安全扫描工具,我们可以方便地发现代码中的漏洞,提高项目的安全性。不同的扫描工具适用于不同的场景,我们可以根据项目的实际情况进行配置和使用。在使用过程中,要注意扫描频率、结果分析和权限管理等问题,以确保扫描的有效性和准确性。