Static Application Security Testing (SAST)
- Use cases
- Supported languages and frameworks
- Configuration
- Secret detection
- Interacting with the vulnerabilities
Static Application Security Testing (SAST)
Introduced in 10.3.
注意:白皮书“应用程序安全性发生了说明了前 6 种攻击中有 4 种是基于应用程序的 . 下载它以了解如何保护您的组织.
如果您使用的是GitLab CI / CD ,则可以使用静态应用程序安全性测试(SAST)分析源代码中的已知漏洞.
您可以通过执行以下任一操作来利用 SAST:
- 在现有的
.gitlab-ci.yml
文件中 . - 隐式使用Auto DevOps提供的 SAST .
GitLab 检查 SAST 报告,比较发现的源分支和目标分支之间的漏洞,并在合并请求中显示信息.
结果按漏洞的优先级排序:
- Critical
- High
- Medium
- Low
- Unknown
- 其他一切
注意:管道包含多个作业,包括 SAST 和 DAST 扫描. 如果任何作业由于任何原因未能完成,则安全信息中心将不会显示 SAST 扫描仪输出. 例如,如果 SAST 作业完成但 DAST 作业失败,则安全性仪表板将不会显示 SAST 结果. 分析器将在失败时输出退出代码 .
Use cases
- 您的代码在类中具有潜在的危险属性,或者不安全的代码可能导致意外的代码执行.
- 您的应用程序容易受到跨站点脚本(XSS)攻击的攻击,这些攻击可用于未经授权访问会话数据.
Requirements
要运行 SAST 工作,默认情况下,你需要 GitLab 亚军与或kubernetes
执行. 如果您在 GitLab.com 上使用共享的 Runners,则默认启用该功能.
从 GitLab 13.0 开始,仅当您已需要 Docker 特权模式.
警告:目前,我们的 SAST 作业需要 Linux 容器类型. Windows 容器尚不支持.注意:如果使用自己的 Runners,请确保安装的 Docker 版本不是 19.03.0
. 有关详细信息 ,请参见 .
Supported languages and frameworks
下表显示了支持的语言,程序包管理器和框架以及使用了哪些工具.
注意: Java 分析器还可以用于 , Grails和等变体.
所有开放源代码(OSS)分析器都正在接受审核,并有可能移至 GitLab 核心层. 可以在相应的史诗中跟踪进度.
请注意,对支持不会扩展到 GitLab 核心层.
Summary of features per tier
下表列出了在不同的中可用的不同功能:
Capability | 在核心 | 终极 |
---|---|---|
Configure SAST Scanners | ||
View JSON Report | ||
Interaction with Vulnerabilities | ||
安全扫描程序集成文档说明了如何将其他安全扫描到 GitLab 中.
Configuration
注意:如果您使用的是提供的Auto 按照本节中的说明手动配置 SAST.
对于 GitLab 11.9 和更高版本,要启用 SAST,您必须包括作为 GitLab 安装的一部分提供的 . 对于 11.9 之前的 GitLab 版本,您可以复制和使用该模板中定义的作业.
将以下内容添加到您的.gitlab-ci.yml
文件中:
结果将保存为SAST 报告工件 ,您可以稍后下载和分析. 由于实施限制,我们始终采用最新的 SAST 工件.
Customizing the SAST settings
可以使用.gitlab-ci.yml
的variables
参数通过更改 SAST 设置. 在下面的示例中,我们包括 SAST 模板,同时将SAST_GOSEC_LEVEL
变量设置为2
:
include:
- template: SAST.gitlab-ci.yml
variables:
SAST_GOSEC_LEVEL: 2
因为模板是在管道配置的,所以最后提到的变量优先.
Overriding SAST jobs
弃用:从 GitLab 13.0 开始,不再支持的使用. 覆盖模板时,必须使用rules
.
要覆盖作业定义(例如,更改variables
或dependencies
类的属性),请声明与要覆盖的 SAST 作业同名的作业. 将此新作业放置在包含模板之后,并在其下指定其他任何键. 例如,这使得能够FAIL_NEVER
为spotbugs
分析器:
include:
- template: SAST.gitlab-ci.yml
spotbugs-sast:
variables:
FAIL_NEVER: 1
一些分析器需要下载项目的依赖项才能执行分析. 反过来,此类依赖项可能存在于私有 Git 存储库中,因此需要诸如用户名和密码之类的凭据才能下载它们. 根据分析器的不同,可以通过向其提供此类凭据.
Using a variable to pass username and password to a private Maven repository
如果您的私有 Maven 存储库需要登录凭据,则可以使用MAVEN_CLI_OPTS
环境变量.
阅读有关更多信息 .
Enabling Docker-in-Docker
如果需要,您可以启用 Docker-in-Docker 来还原 GitLab 13.0 之前存在的 SAST 行为. 请按照以下步骤操作:
- 在特权模式下使用 Docker-inDocker 配置 GitLab Runner.
将变量
SAST_DISABLE_DIND
设置为false
:
这将创建一个单一的sast
在你的 CI / CD 管道,而不是多个作业<analyzer-name>-sast
工作.
Enabling Kubesec analyzer
在 GitLab Ultimate 12.6 中引入 .
您需要将SCAN_KUBERNETES_MANIFESTS
设置为"true"
才能启用 Kubesec 分析器. 在.gitlab-ci.yml
,定义:
include:
- template: SAST.gitlab-ci.yml
variables:
SCAN_KUBERNETES_MANIFESTS: "true"
Pre-compilation
如果您的项目需要自定义构建配置,则最好避免在 SAST 执行期间进行编译,而应将管道中较早阶段的所有作业工件传递出去. 当需要执行before_script
来准备扫描作业时,这是当前的策略.
要将项目的依赖项作为工件传递,这些依赖项必须包含在项目的工作目录中,并使用artifacts:path
配置进行指定. 如果存在所有依赖项,则可以将COMPILE=false
变量提供给分析器,并且将跳过编译:
image: maven:3.6-jdk-8-alpine
- build
- test
include:
- template: SAST.gitlab-ci.yml
build:
stage: build
script:
- mvn package -Dmaven.repo.local=./.m2/repository
artifacts:
paths:
- .m2/
- target/
spotbugs-sast:
dependencies:
- build
variables:
MAVEN_REPO_PATH: ./.m2/repository
COMPILE: false
artifacts:
reports:
sast: gl-sast-report.json
注意:必须显式指定供应商目录的路径,以允许分析器识别已编译的工件. 每个分析器的配置可能有所不同,但在上述 Java 的情况下,可以使用MAVEN_REPO_PATH
. 有关可用选项的完整列表,请参见分析器设置 .
Available variables
可以使用环境变量配置 SAST.
Logging Level
您可以通过设置SECURE_LOG_LEVEL
env var 来控制日志的详细程度. 默认设置为info
,您可以将其设置为以下任意级别:
error
warn
info
debug
Custom Certificate Authority
要信任自定义证书颁发机构,请将ADDITIONAL_CA_CERT_BUNDLE
变量设置为要在 SAST 环境中信任的 CA 证书包.
Docker images
以下是与 Docker 映像相关的变量.
Vulnerability filters
环境变量 | 默认值 | Description |
---|---|---|
SAST_EXCLUDED_PATHS |
spec, test, tests, tmp |
根据路径从输出中排除漏洞. 这是逗号分隔的模式列表. 模式可以是全局变量,也可以是文件或文件夹路径(例如doc,spec ). 父目录也将匹配模式. |
SAST_BANDIT_EXCLUDED_PATHS |
逗号分隔的路径列表,可从扫描中排除. 使用 Python 的 ; 例如: '*/tests/*, */venv/*' |
|
SAST_BRAKEMAN_LEVEL |
1 | 在给定的置信度下忽略 Brakeman 漏洞. 整数,1 =低 3 =高. |
SAST_DISABLE_BABEL |
false |
禁用 NodeJsScan 扫描仪的 Babel 处理. 设置为true 将禁用 Babel 处理. 在 GitLab 13.2 中引入 . |
SAST_FLAWFINDER_LEVEL |
1 | 在给定风险级别下忽略 Flawfinder 漏洞. 整数,0 =无风险,5 =高风险. |
SAST_GITLEAKS_ENTROPY_LEVEL |
8.0 | 秘密检测的最小熵. 浮动,0.0 =低,8.0 =高. |
SAST_GOSEC_LEVEL |
0 | 在给定的置信度下忽略 Gosec 漏洞. 整数,0 =未定义,1 =低,2 =中,3 =高. |
SAST_GITLEAKS_COMMIT_FROM |
提交 Gitleaks 扫描始于. | |
SAST_GITLEAKS_COMMIT_TO |
Gitleaks 扫描的提交结束于. | |
SAST_GITLEAKS_HISTORIC_SCAN |
false |
标记以启用历史性的 Gitleaks 扫描. |
Docker-in-Docker orchestrator
以下变量配置 Docker-in-Docker 协调器,因此仅在启用 Docker-in-Docker 模式时才使用.
Analyzer settings
某些分析仪可以使用环境变量进行自定义.
Environment variable | Analyzer | Description |
---|---|---|
SCAN_KUBERNETES_MANIFESTS |
Kubesec | 设置为"true" 以扫描 Kubernetes 清单. |
KUBESEC_HELM_CHARTS_PATH |
Kubesec | helm 将用于生成kubesec 将扫描的 Kubernetes 清单的舵图的可选路径. 如果定义了helm dependency build 则应在before_script 运行helm dependency build 以获取必要的依赖关系. |
KUBESEC_HELM_OPTIONS |
Kubesec | helm 可执行文件的其他参数. |
SpotBugs | 设置为false 可禁用项目编译和依赖项获取. 在 GitLab 13.1 中引入 . |
|
ANT_HOME |
SpotBugs | ANT_HOME 环境变量. |
ANT_PATH |
SpotBugs | ant 可执行文件的路径. |
GRADLE_PATH |
SpotBugs | gradle 可执行文件的路径. |
JAVA_OPTS |
SpotBugs | java 可执行文件的附加参数. |
JAVA_PATH |
SpotBugs | java 可执行文件的路径. |
SAST_JAVA_VERSION |
SpotBugs | 使用哪个 Java 版本. 支持的版本是8 和11 . 默认为8 . |
MAVEN_CLI_OPTS |
SpotBugs | mvn 或mvnw 可执行文件的其他参数. |
MAVEN_PATH |
SpotBugs | mvn 可执行文件的路径. |
MAVEN_REPO_PATH |
SpotBugs | Maven 本地存储库的路径( maven.repo.local 属性的快捷方式). |
SBT_PATH |
SpotBugs | sbt 可执行文件的路径. |
FAIL_NEVER |
SpotBugs | 设置为1 可忽略编译失败. |
SAST_GOSEC_CONFIG |
Gosec | Gosec 的配置路径(可选). |
PHPCS_SECURITY_AUDIT_PHP_EXTENSIONS |
phpcs-security-audit | 以逗号分隔的其他 PHP 扩展列表. |
SEARCH_MAX_DEPTH |
any | 搜索源代码文件时遍历的最大目录数. 默认值: 4 . |
Custom environment variables
在 GitLab Ultimate 12.5 中引入 .
除上述 SAST 配置变量外,如果 ,则所有自定义环境变量都将传播到基础 SAST 分析器映像.
警告:名称以这些前缀开头的变量将不会传播到 SAST Docker 容器和/或分析器容器: DOCKER_
, CI
, GITLAB_
, FF_
, HOME
, PWD
, OLDPWD
, PATH
, SHLVL
, HOSTNAME
.
Reports JSON format
SAST 工具会发出 JSON 报告文件. 有关更多信息,请参见此报告的 .
这是一个示例 SAST 报告:
Secret detection
了解有关更多信息.
在”安全仪表板”中,您可以概览您的组,项目和管道中的所有安全漏洞. 阅读有关安全仪表板的更多 .
Interacting with the vulnerabilities
一旦发现漏洞,便可以与其进行交互. 阅读有关如何进行交互的更多信息.
Vulnerabilities database
Vulnerabilities contained within the vulnerability database can be searched and viewed at the GitLab vulnerability advisory database.
有关漏洞数据库更新的更多信息,请查看 .
Running SAST in an offline environment
对于在通过 Internet 限制,限制或间歇性访问外部资源的环境中进行自我管理的 GitLab 实例,需要进行一些调整才能使 SAST 作业成功运行. 有关更多信息,请参阅 .
Requirements for offline SAST
要在离线环境中使用 SAST,您需要:
- 保持 Docker-In-Docker 禁用(默认).
- GitLab 亚军与 .
- Docker Container Registry,带有本地可用的 SAST 分析器映像副本.
注意: GitLab Runner 的 ,这意味着即使本地副本可用,Runner 也会尝试从 GitLab 容器注册表中拉取 Docker 映像. 如果您只喜欢使用本地可用的 Docker 映像,则可以在离线环境pull_policy
GitLab Runner 的 . 但是,如果不在离线环境中,我们建议将拉取策略设置保持为always
,因为这样可以在 CI / CD 管道中使用更新的扫描仪.
Make GitLab SAST analyzer images available inside your Docker registry
对于具有所有 SAST,请将以下默认 SAST 分析器图像从registry.gitlab.com
导入本地 Docker 容器注册表 :
registry.gitlab.com/gitlab-org/security-products/analyzers/bandit:2
registry.gitlab.com/gitlab-org/security-products/analyzers/brakeman:2
registry.gitlab.com/gitlab-org/security-products/analyzers/eslint:2
registry.gitlab.com/gitlab-org/security-products/analyzers/flawfinder:2
registry.gitlab.com/gitlab-org/security-products/analyzers/gosec:2
registry.gitlab.com/gitlab-org/security-products/analyzers/kubesec:2
registry.gitlab.com/gitlab-org/security-products/analyzers/nodejs-scan:2
registry.gitlab.com/gitlab-org/security-products/analyzers/phpcs-security-audit:2
registry.gitlab.com/gitlab-org/security-products/analyzers/pmd-apex:2
registry.gitlab.com/gitlab-org/security-products/analyzers/secrets:2
registry.gitlab.com/gitlab-org/security-products/analyzers/security-code-scan:2
registry.gitlab.com/gitlab-org/security-products/analyzers/sobelow:2
registry.gitlab.com/gitlab-org/security-products/analyzers/spotbugs:2
将 Docker 映像导入本地脱机 Docker 注册表的过程取决于您的网络安全策略 . 请咨询您的 IT 员工,以找到可以导入或临时访问外部资源的已接受和批准的流程. 请注意,这些扫描程序会使用新定义进行更新 ,因此请考虑您是否能够自己进行定期更新.
有关将 Docker 映像保存和传输为文件的详细信息,请参阅 Docker 有关 , docker load
, 和docker import
的文档.
将以下配置添加到您的.gitlab-ci.yml
文件. 您必须替换SECURE_ANALYZERS_PREFIX
才能引用本地 Docker 容器注册表:
include:
- template: SAST.gitlab-ci.yml
variables:
SECURE_ANALYZERS_PREFIX: "localhost:5000/analyzers"
现在,SAST 作业应使用 SAST 分析器的本地副本来扫描您的代码并生成安全报告,而无需访问 Internet.