基础设施即代码 (IaC) 扫描
基础设施及代码(IaC)扫描在您的 CI/CD 流水线中运行,检查您的基础设施定义文件中是否存在已知漏洞。在变更被提交到默认分支前识别漏洞,以积极应对应用程序面临的风险。
IaC 扫描分析器输出 JSON 格式的报告,作为 作业产物。
在极狐GitLab 旗舰版中,IaC 扫描结果也经过处理,以便你可以:
- 在合并请求中查看它们。
- 在审批工作流程中使用它们。
- 在漏洞报告中审查它们。
启用扫描器
先决条件:
- IaC 扫描需要 AMD64 架构。Microsoft Windows 不受支持。
- 至少需要 4 GB RAM 以确保性能一致。
-
.gitlab-ci.yml
文件中需要test
阶段。 - 在极狐GitLab 私有化部署中,需要使用
docker
或kubernetes
执行器的 Runner。 - 如果您在 JihuLab.com 上使用 SaaS Runner,则默认启用此功能。
要启用项目的 IaC 扫描:
- 在左侧边栏中,选择 搜索或转到 并找到您的项目。
- 选择 构建 > 流水线编辑器。
-
将以下内容复制并粘贴到
.gitlab-ci.yml
文件的底部。如果已经存在include
行,请仅添加template
行。include: - template: Jobs/SAST-IaC.gitlab-ci.yml
- 选择 眼这个,然后选择 验证流水线。消息模拟完成成功表示文件有效。
- 选择 编辑 选项卡。
- 选择 提交更改。
流水线现在已包含了一个 IaC 扫描作业。
支持的语言和框架
IaC 扫描支持多种 IaC 配置文件。当在项目中检测到任何支持的文件,它们将会被 KICS 进行扫描。支持混合 IaC 配置文件的项目。
支持的配置格式:
- Ansible
- AWS CloudFormation
-
Azure Resource Manager
- Dockerfile
- Google Deployment Manager
- Kubernetes
- OpenAPI
-
Terraform
位于自定义仓库中的 Terraform 模块不会被扫描漏洞。
自定义规则集
您可以自定义极狐GitLab 提供的默认 IaC 扫描规则。
以下自定义选项可以单独使用,也可以一起使用:
规则集定义
每一个 IaC 扫描规则都被包含到一个 ruleset
部分,其中包含:
- 规则的
type
字段。对于 IaC 扫描,标识符类型是kics_id
。 - 规则标识符的
value
字段。KICS 规则标识符是字母数字字符串。要查找规则标识符,您可以:
禁用规则
您可以禁用指定的 IaC 扫描规则。
要禁用分析器规则:
- 在项目的根目录下创建一个
.gitlab
目录,如果它不存在的话。 - 在
.gitlab
目录下创建一个自定义规则集文件,名为sast-ruleset.toml
,如果它不存在的话。 - 在
ruleset
部分中,将disabled
标志设置为true
。 - 在一个或多个
ruleset
子部分中,列出要禁用的规则。
在你将 sast-ruleset.toml
文件合并到默认分支后,禁用规则发现的既有漏洞会自动被解决。
在下面的示例 sast-ruleset.toml
文件中,禁用的规则被分配给 kics
分析器,通过匹配标识符的 type
和 value
:
[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>
作为注释。
覆盖规则
您可以覆盖特定的 IaC 扫描规则以自定义他们。比如,为规则分配较低的严重性,或链接到你自己的文档,以了解如何修复发现。
要覆盖规则:
- 在项目的根目录下创建一个
.gitlab
目录,如果它不存在的话。 - 在
.gitlab
目录下创建一个自定义规则集文件,名为sast-ruleset.toml
,如果它不存在的话。 - 在一个或多个
ruleset.identifier
子部分中,列出要覆盖的规则。 - 在
ruleset
部分的ruleset.override
上下文中,提供要覆盖的键。可以覆盖任何组合的键。有效的键是:- 描述(description)
- 消息(message)
- 名称(name)
- 严重程度(有效的选项为:Critical, High, Medium, Low, Unknown, Info)
在下面的示例 sast-ruleset.toml
文件中,规则通过标识符的 type
和 value
进行匹配,然后进行覆盖:
[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 人员,以找到一个接受和批准的流程,以导入或暂时访问外部资源。
-
从
registry.gitlab.cn
导入默认的 IaC 分析器镜像到你的本地 Docker 容器仓库:registry.gitlab.com/security-products/kics:5
IaC 分析器的镜像是周期性更新的,所以您应该周期性更新本地副本。
-
将 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 模板制定了分析器的主要版本,且会自动拉取与主版本对应的最新分析器版本。在有些情况下,你可能需要使用指定的版本。比如,你可能需要避免在后续版本中出现的回归。
要使用指定版本的分析器:
- 在左侧导航栏,选择 搜索或前往 并找到你的项目。
- 选择 构建 > 流水线编辑器。
-
在
SAST-IaC.gitlab-ci.yml
模板的下一行,添加SAST_ANALYZER_IMAGE_TAG
CI/CD 变量。仅能在指定作业中设置此变量。如果你在作业顶部设置,你设置的版本就会被其他 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: paths
为gl-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 扫描先决条件的详细信息,请参阅启用扫描器。