基础设施即代码 (IaC) 扫描

基础设施及代码(IaC)扫描在您的 CI/CD 流水线中运行,检查您的基础设施定义文件中是否存在已知漏洞。在变更被提交到默认分支前识别漏洞,以积极应对应用程序面临的风险。

IaC 扫描分析器输出 JSON 格式的报告,作为 作业产物

在极狐GitLab 旗舰版中,IaC 扫描结果也经过处理,以便你可以:

  • 在合并请求中查看它们。
  • 在审批工作流程中使用它们。
  • 在漏洞报告中审查它们。

启用扫描器

先决条件:

  • IaC 扫描需要 AMD64 架构。Microsoft Windows 不受支持。
  • 至少需要 4 GB RAM 以确保性能一致。
  • .gitlab-ci.yml 文件中需要 test 阶段。
  • 在极狐GitLab 私有化部署中,需要使用 dockerkubernetes 执行器的 Runner。
  • 如果您在 JihuLab.com 上使用 SaaS Runner,则默认启用此功能。

要启用项目的 IaC 扫描:

  1. 在左侧边栏中,选择 搜索或转到 并找到您的项目。
  2. 选择 构建 > 流水线编辑器
  3. 将以下内容复制并粘贴到 .gitlab-ci.yml 文件的底部。如果已经存在 include 行,请仅添加 template 行。

    include:
      - template: Jobs/SAST-IaC.gitlab-ci.yml
    
  4. 选择 眼这个,然后选择 验证流水线。消息模拟完成成功表示文件有效。
  5. 选择 编辑 选项卡。
  6. 选择 提交更改

流水线现在已包含了一个 IaC 扫描作业。

支持的语言和框架

IaC 扫描支持多种 IaC 配置文件。当在项目中检测到任何支持的文件,它们将会被 KICS 进行扫描。支持混合 IaC 配置文件的项目。

支持的配置格式:

  • Ansible
  • AWS CloudFormation
  • Azure Resource Manager

    note IaC 扫描可以分析 Azure 资源管理器模板的 JSON 格式。如果您使用 Bicep 编写模板,那么您必须使用 Bicep CLI 将您的 Bicep 文件转换为 JSON,然后 IaC 扫描才能分析它们。
  • Dockerfile
  • Google Deployment Manager
  • Kubernetes
  • OpenAPI
  • Terraform

    note 位于自定义仓库中的 Terraform 模块不会被扫描漏洞。

自定义规则集

您可以自定义极狐GitLab 提供的默认 IaC 扫描规则。

以下自定义选项可以单独使用,也可以一起使用:

规则集定义

每一个 IaC 扫描规则都被包含到一个 ruleset 部分,其中包含:

  • 规则的 type 字段。对于 IaC 扫描,标识符类型是 kics_id
  • 规则标识符的 value 字段。KICS 规则标识符是字母数字字符串。要查找规则标识符,您可以:

禁用规则

您可以禁用指定的 IaC 扫描规则。

要禁用分析器规则:

  1. 在项目的根目录下创建一个 .gitlab 目录,如果它不存在的话。
  2. .gitlab 目录下创建一个自定义规则集文件,名为 sast-ruleset.toml,如果它不存在的话。
  3. ruleset 部分中,将 disabled 标志设置为 true
  4. 在一个或多个 ruleset 子部分中,列出要禁用的规则。

在你将 sast-ruleset.toml 文件合并到默认分支后,禁用规则发现的既有漏洞会自动被解决

在下面的示例 sast-ruleset.toml 文件中,禁用的规则被分配给 kics 分析器,通过匹配标识符的 typevalue

[kics]
  [[kics.ruleset]]
    disable = true
    [kics.ruleset.identifier]
      type = "kics_id"
      value = "8212e2d7-e683-49bc-bf78-d6799075c5a7"

  [[kics.ruleset]]
    disable = true
    [kics.ruleset.identifier]
      type = "kics_id"
      value = "b03a748a-542d-44f4-bb86-9199ab4fd2d5"

使用注释禁用扫描

您可以使用 KICS 注释来控制 KICS 基于极狐GitLab IaC 扫描分析器如何扫描您的代码库。例如:

  • 要跳过整个文件的扫描,您可以在文件顶部添加 # kics-scan ignore 作为注释。
  • 要禁用整个文件中的特定规则,您可以在文件顶部添加 # kics-scan disable=<kics_id> 作为注释。
note 此功能仅适用于某些类型的 IaC 文件。

覆盖规则

您可以覆盖特定的 IaC 扫描规则以自定义他们。比如,为规则分配较低的严重性,或链接到你自己的文档,以了解如何修复发现。

要覆盖规则:

  1. 在项目的根目录下创建一个 .gitlab 目录,如果它不存在的话。
  2. .gitlab 目录下创建一个自定义规则集文件,名为 sast-ruleset.toml,如果它不存在的话。
  3. 在一个或多个 ruleset.identifier 子部分中,列出要覆盖的规则。
  4. ruleset 部分的 ruleset.override 上下文中,提供要覆盖的键。可以覆盖任何组合的键。有效的键是:
    • 描述(description)
    • 消息(message)
    • 名称(name)
    • 严重程度(有效的选项为:Critical, High, Medium, Low, Unknown, Info)

在下面的示例 sast-ruleset.toml 文件中,规则通过标识符的 typevalue 进行匹配,然后进行覆盖:

[kics]
  [[kics.ruleset]]
    [kics.ruleset.identifier]
      type = "kics_id"
      value = "8212e2d7-e683-49bc-bf78-d6799075c5a7"
    [kics.ruleset.override]
      description = "OVERRIDDEN description"
      message = "OVERRIDDEN message"
      name = "OVERRIDDEN name"
      severity = "Info"

离线配置

离线环境是受限的、被严格限制的货无法通过互联网访问外部资源的。对于这样环境中的私有化部署实例,IaC 需要一些配置变更。此部分的指南必须与离线环境中的指南一起完成。

配置 极狐GitLab Runner

默认情况下,runner 会尝试从极狐GitLab 容器仓库中拉取 Docker 镜像,即使本地副本可用。您应该使用此默认设置,以确保 Docker 镜像保持最新。但是,如果没有网络连接可用,您必须更改默认的极狐GitLab Runner pull_policy 变量。

将极狐GitLab CI/CD 变量 pull_policy 配置为 if-not-present

使用本地的分析器镜像

如果你想从本地 Docker 镜像而不是极狐GitLab 容器镜像获取镜像,请使用本地的分析器镜像。

先决条件:

  • 取决于你的网络安全策略,将 Docker 镜像导入一个本地离线的 Docker 镜像仓库。请咨询你的 IT 人员,以找到一个接受和批准的流程,以导入或暂时访问外部资源。
  1. registry.gitlab.cn 导入默认的 IaC 分析器镜像到你的本地 Docker 容器仓库

    registry.gitlab.com/security-products/kics:5
    

    IaC 分析器的镜像是周期性更新的,所以您应该周期性更新本地副本。

  2. 将 CI/CD 变量 SECURE_ANALYZERS_PREFIX 设置为本地 Docker 容器仓库。

    include:
      - template: Jobs/SAST-IaC.gitlab-ci.yml
    
    variables:
      SECURE_ANALYZERS_PREFIX: "localhost:5000/analyzers"
    

IaC 作业应该使用分析器 Docker 镜像的本地副本,而无需访问互联网。

使用指定的分析器版本

极狐GitLab 管理的 CI/CD 模板制定了分析器的主要版本,且会自动拉取与主版本对应的最新分析器版本。在有些情况下,你可能需要使用指定的版本。比如,你可能需要避免在后续版本中出现的回归。

要使用指定版本的分析器:

  1. 在左侧导航栏,选择 搜索或前往 并找到你的项目。
  2. 选择 构建 > 流水线编辑器
  3. SAST-IaC.gitlab-ci.yml 模板的下一行,添加 SAST_ANALYZER_IMAGE_TAG CI/CD 变量。

    note 仅能在指定作业中设置此变量。如果你在作业顶部设置,你设置的版本就会被其他 SAST 分析器使用。

    将标签设置为:

    • 主药版本,比如 3。你的流水线会使用此主版本中发布的任何次要版本或补丁版本。
    • 次要版本,比如 3.7。你的流水线会使用此次要版本中发布的任何补丁版本。
    • 补丁版本,比如 3.7.0。你的流水线不会接收任何更新。

下面的示例使用了特定次要版本的 IaC 分析器:

include:
  - template: Jobs/SAST-IaC.gitlab-ci.yml

kics-iac-sast:
  variables:
    SAST_ANALYZER_IMAGE_TAG: "3.1"

支持的发行版

由于尺寸和可维护性,极狐GitLab 扫描器使用 Apline 基础镜像。

使用启用了 FIPS 的镜像

除了标准镜像之外,极狐GitLab 提供了启用 FIPS 的 Red Hat UBI 版本的扫描器镜像。

要在流水线中使用启用了 FIPS 的镜像,请将 SAST_IMAGE_SUFFIX 设置为 -fips 或修改标准标记加上 -fips 扩展名。

下面是使用 SAST_IMAGE_SUFFIX CI/CD 变量的示例:

variables:
  SAST_IMAGE_SUFFIX: '-fips'

include:
  - template: Jobs/SAST-IaC.gitlab-ci.yml

漏洞的自动修复

  • 引入于极狐GitLab 15.9,使用名为 sec_mark_dropped_findings_as_resolved 的项目级功能标志。
  • 在极狐GitLab 16.2 中 GA。功能标志 sec_mark_dropped_findings_as_resolved 被移除。

为了帮你更加聚焦在相关的漏洞上,IaC 扫描可以在以下情况中自动修复漏洞:

如果你在随后重启了规则,漏洞会被重新打开,以供审查。

当漏洞被自动解决时,漏洞管理系统会添加一个注释。

报告 JSON 格式

IaC 工具以现有 SAST 报告格式发出 JSON 报告文件。

可以从如下内容中下载 JSON 报告文件:

  • CI 流水线页面。
  • 在合并请求的流水线选项卡上,通过设置 artifacts: pathsgl-sast-report.json

更多详情,可查阅下载产物

Troubleshooting

当和 IaC 扫描工作时候,你可能会遇到如下问题。

IaC 扫描漏洞显示为 No longer detected

如果之前检测到的安全漏洞意料之外的展示为 No longer detected,可能是因为扫描器的更新。更新可以禁用发现的规则,这些规则被发现是无效的或假阳性,发现被标记为 No longer detected

在极狐GitLab 15.3 中,禁用了 IaC 扫描器中的密钥检测,因此 IaC 发现显示为 No longer detected

作业日志中的 exec /bin/sh: exec format error 消息

你可能会在作业日志中看到诸如 exec /bin/sh: exec format error 的错误。在尝试在非 AMD64 架构上运行 IaC 扫描分析器时,就会发生此错误。有关 IaC 扫描先决条件的详细信息,请参阅启用扫描器