离线环境
- 层级:免费版、高级版、旗舰版
- 提供:GitLab 自托管
要设置离线环境,您必须在购买前获得 云许可豁免。更多详情,请联系您的 GitLab 销售代表。
在不连接互联网的情况下,可以运行大多数 GitLab 安全扫描器。
本文档描述了如何在离线环境中运行安全类别(即扫描器类型)。这些说明也适用于已进行安全加固、具有安全策略(例如防火墙策略)或以其他方式限制访问完整互联网的 GitLab 自托管实例。GitLab 将这些环境称为 离线环境。其他常见名称包括:
- 物理隔离环境
- 连接受限环境
- 局域网 (LAN) 环境
- 内网环境
这些环境具有物理屏障或安全策略(例如防火墙),可以防止或限制互联网访问。这些说明专为物理断开的网络设计,但也可以在这些其他用例中遵循。
定义离线环境
在离线环境中,GitLab 实例可以是一个或多个能够在本地网络上通信的服务器和服务,但对互联网的访问没有或受到严格限制。假设 GitLab 实例和支持基础设施(例如私有 Maven 仓库)中的任何内容都可以通过本地网络连接访问。假设来自互联网的任何文件都必须通过物理介质(USB 驱动器、硬盘、可写 DVD 等)传入。
使用离线扫描器
GitLab 扫描器通常连接到互联网以下载最新的签名、规则和补丁集合。需要一些额外的步骤来配置工具,使其能够正确使用本地网络上可用的资源。
容器注册表和包仓库
从高层次来看,安全分析器以 Docker 镜像的形式交付,并可能利用各种包仓库。当您在连接互联网的 GitLab 安装上运行作业时,GitLab 会检查 GitLab.com 托管的容器注册表,以确保您拥有这些 Docker 镜像的最新版本,并可能连接到包仓库以安装必要的依赖项。
在离线环境中,必须禁用这些检查,以免查询 GitLab.com。由于 GitLab.com 的注册表和仓库不可用,您必须更新每个扫描器,以引用不同的内部托管注册表或提供对各个扫描器镜像的访问权限。
您还必须确保您的应用程序能够访问不在 GitLab.com 上托管的常见包仓库,例如 npm、yarn 或 Ruby gems。可以通过临时连接到网络或在您自己的离线网络内镜像这些仓库中的包来获取这些包。
与漏洞交互
一旦发现漏洞,您就可以与之交互。更多关于如何处理漏洞的信息。
在某些情况下,报告的漏洞提供的元数据可能包含在 UI 中显示的外部链接。这些链接在离线环境中可能无法访问。
修复漏洞
解决漏洞功能可用于离线依赖扫描和容器扫描,但根据您的实例配置可能无法工作。只有当我们能够访问托管该依赖项或镜像最新版本的最新注册表服务时,我们才能建议解决方案,这些解决方案通常是已修补的较新版本。
扫描器签名和规则更新
连接互联网时,一些扫描器会引用公共数据库来获取最新的签名和规则集进行检查。没有连接,这是不可能的。根据扫描器的不同,您必须禁用这些自动更新检查,要么使用它们自带的数据库并手动更新这些数据库,要么提供对您自己网络内托管的副本的访问权限。
特定扫描器说明
每个单独的扫描器可能与前面描述的步骤略有不同。您可以在以下每个页面找到更多信息:
将 Docker 镜像加载到您的离线主机上
要使用许多 GitLab 功能,包括安全扫描和 Auto DevOps,runner 必须能够获取相关的 Docker 镜像。
在没有直接访问公共互联网的情况下使这些镜像可用的过程涉及下载镜像,然后将它们打包并传输到离线主机。以下是此类传输的示例:
- 从公共互联网下载 Docker 镜像。
- 将 Docker 镜像打包为 tar 归档文件。
- 将镜像传输到离线环境。
- 将传输的镜像加载到离线 Docker 注册表中。
使用官方 GitLab 模板
GitLab 提供了一个 官方模板 来简化此过程。
此模板应在一个新的空项目中使用,包含一个 .gitlab-ci.yml 文件,内容如下:
include:
- template: Security/Secure-Binaries.gitlab-ci.yml该管道下载安全扫描器所需的 Docker 镜像,并将它们保存为 作业产物 或推送到执行该管道的项目 容器注册表 中。这些归档文件可以传输到另一个位置,并在 Docker 守护进程中 加载。
此方法需要一个能够访问 gitlab.com(包括 registry.gitlab.com)和本地离线实例的 runner。该 runner 必须在 特权模式 下运行,以便能够在作业中使用 docker 命令。该 runner 可以安装在 DMZ 或堡垒主机上,并且仅用于此特定项目。
此模板不包括容器扫描分析器的更新。请参阅 容器扫描离线指南。
调度更新
默认情况下,此项目的管道仅在将 .gitlab-ci.yml 添加到仓库时运行一次。要更新 GitLab 安全扫描器和签名,需要定期运行此管道。GitLab 提供了一种 调度管道 的方法。例如,您可以设置它每周下载和存储 Docker 镜像。
使用创建的安全包
使用 Secure-Binaries.gitlab-ci.yml 模板的项目现在应该托管运行 GitLab 安全功能所需的所有镜像和资源。
接下来,您必须告诉离线实例使用这些资源,而不是 GitLab.com 上的默认资源。为此,设置 CI/CD 变量 SECURE_ANALYZERS_PREFIX,值为项目 容器注册表 的 URL。
您可以在项目的 .gitlab-ci.yml 中设置此变量,或在项目或组的 GitLab UI 中设置。更多信息请参阅 GitLab CI/CD 变量页面。
变量
下表显示了您可以与 Secure-Binaries.gitlab-ci.yml 模板一起使用的 CI/CD 变量:
| CI/CD 变量 | 描述 | 默认值 |
|---|---|---|
SECURE_BINARIES_ANALYZERS |
要下载的分析器逗号分隔列表 | "bandit, brakeman, gosec, ..." |
SECURE_BINARIES_DOWNLOAD_IMAGES |
用于禁用作业 | "true" |
SECURE_BINARIES_PUSH_IMAGES |
将文件推送到项目注册表 | "true" |
SECURE_BINARIES_SAVE_ARTIFACTS |
还将镜像归档文件保存为产物 | "false" |
SECURE_BINARIES_ANALYZER_VERSION |
默认分析器版本 (Docker 标签) | "2" |
不使用官方模板的替代方法
如果无法遵循前面的方法,可以手动传输镜像:
示例镜像打包脚本
#!/bin/bash
set -ux
# 指定需要的分析器镜像
analyzers=${SAST_ANALYZERS:-"bandit eslint gosec"}
gitlab=registry.gitlab.com/security-products/
for i in "${analyzers[@]}"
do
tarname="${i}_2.tar"
docker pull $gitlab$i:2
docker save $gitlab$i:2 -o ./analyzers/${tarname}
chmod +r ./analyzers/${tarname}
done示例镜像加载脚本
此示例将镜像从堡垒主机加载到离线主机。在某些配置中,可能需要物理介质进行此类传输:
#!/bin/bash
set -ux
# 指定需要的分析器镜像
analyzers=${SAST_ANALYZERS:-"bandit eslint gosec"}
registry=$GITLAB_HOST:4567
for i in "${analyzers[@]}"
do
tarname="${i}_2.tar"
scp ./analyzers/${tarname} ${GITLAB_HOST}:~/${tarname}
ssh $GITLAB_HOST "sudo docker load -i ${tarname}"
ssh $GITLAB_HOST "sudo docker tag $(sudo docker images | grep $i | awk '{print $3}') ${registry}/analyzers/${i}:2"
ssh $GITLAB_HOST "sudo docker push ${registry}/analyzers/${i}:2"
done在离线环境中使用 GitLab Secure 与 AutoDevOps
您可以在离线环境中使用 GitLab AutoDevOps 进行安全扫描。但是,您必须首先执行以下步骤:
-
将容器镜像加载到本地注册表。GitLab Secure 利用分析器容器镜像进行各种扫描。这些镜像必须作为运行 AutoDevOps 的一部分可用。在运行 AutoDevOps 之前,请按照 官方 GitLab 模板 中的步骤,将这些容器镜像加载到本地容器注册表中。
-
设置 CI/CD 变量,确保 AutoDevOps 在正确的位置查找这些镜像。AutoDevOps 模板利用
SECURE_ANALYZERS_PREFIX变量来识别分析器镜像的位置。有关更多信息,请参阅 使用创建的安全包。确保将此变量设置为分析器镜像加载位置的正确值。您可以考虑使用项目 CI/CD 变量或通过 修改.gitlab-ci.yml文件直接设置。
完成这些步骤后,GitLab 将拥有 Secure 分析器的本地副本,并设置为使用它们而不是互联网托管的容器镜像。这使您能够在离线环境中在 AutoDevOps 中运行 Secure。
这些步骤特定于 GitLab Secure 与 AutoDevOps。使用 AutoDevOps 的其他阶段可能需要 Auto DevOps 文档 中涵盖的其他步骤。