オフラインGitLab
オフライン環境のコンピュータは、セキュリティ対策として公開インターネットから隔離されています。 このページでは、オフライン環境でGitLabを実行するために利用可能なすべての情報を示します。
クイックスタート
物理的に隔離されたオフラインネットワーク上にGitLabインスタンスをデプロイする予定の場合は、クイックスタートガイドの設定手順を参照してください。
特徴
オフライン環境でGitLabの機能を使うには、以下のベストプラクティスに従ってください:
- オフライン環境でのGitLabSecure スキャナーのオペレーション。
オフラインホストへのDockerイメージのロード
セキュリティスキャンやAuto DevOpsを含む多くのGitLab機能を使うには、GitLab Runnerが関連するDockerイメージをフェッチできなければなりません。
公開インターネットに直接アクセスすることなく、これらの画像を利用できるようにするには、画像をダウンロードし、パッケージ化してオフラインのホストに転送する必要があります。 以下は、そのような転送の例です:
- 公開インターネットからDockerイメージをダウンロードします。
- Dockerイメージをtarアーカイブとしてパッケージ化します。
- オフライン環境に画像を転送します。
- 転送されたイメージをオフラインのDockerレジストリにロードします。
GitLab公式テンプレートを使う
GitLabはこのプロセスを簡単にするために、ベンダリングテンプレートを提供しています。
このテンプレートは、gitlab-ci.yml
ファイルを含む、新しい空のプロジェクトで使用する必要があります:
include:
- template: Secure-Binaries.gitlab-ci.yml
パイプラインはセキュリティスキャナに必要なDockerイメージをダウンロードし、ジョブのアーティファクトとして保存するか、パイプラインが実行されるプロジェクトのコンテナレジストリにプッシュします。 これらのアーカイブは別の場所に転送し、Dockerデーモンでロードすることができます。 この方法では、gitlab.com
(registry.gitlab.com
を含む)とローカルのオフラインインスタンスの両方にアクセスできるGitLabランナーが必要です。このランナーは、ジョブ内でdocker
コマンドを使用できるように特権モードで実行する必要があります。このランナーはDMZやbastionにインストールすることができ、この特定のプロジェクトだけに使用されます。
アップデートのスケジューリング
デフォルトでは、このプロジェクトのパイプラインは.gitlab-ci.yml
がリポジトリに追加されたときに一度だけ実行されます。 GitLab のセキュリティスキャナとシグネチャを更新するには、このパイプラインを定期的に実行する必要があります。 GitLab にはパイプラインをスケジュールする方法があります。 例えば、毎週 Docker イメージをダウンロードして保存するように設定することができます。
例えば、コンテナスキャン用の脆弱性データベースは毎日更新されます。 この単一のイメージを更新するには、毎日実行する新しいスケジュールパイプラインを作成し、SECURE_BINARIES_ANALYZERS
をclair-vulnerabilities-db
に設定します。このジョブのみがトリガされ、イメージは毎日更新され、プロジェクトレジストリで利用できるようになります。
作成されたセキュリティバンドルの使用
Secure-Binaries.gitlab-ci.yml
テンプレートを使っているプロジェクトは、GitLab セキュリティ機能を実行するために必要なすべての必要なイメージとリソースをホストしているはずです。
次に、オフラインインスタンスに GitLab.com のデフォルトリソースの代わりにこれらのリソースを使うように指示しなければなりません。そのためには、環境変数SECURE_ANALYZERS_PREFIX
にプロジェクトコンテナレジストリのURL を設定します。
この変数はプロジェクトの.gitlab-ci.yml
、または GitLab UI のプロジェクトやグループレベルで設定することができます。 詳しくはGitLab CI/CD環境変数のページをご覧ください。
変数
次の表は、Secure-Binaries.gitlab-ci.yml
テンプレートで使用できる変数を示しています:
変数 | 説明 | デフォルト値 |
---|---|---|
SECURE_BINARIES_ANALYZERS
| ダウンロードする分析装置のコンマ区切りリスト | "bandit, brakeman, gosec, and so on..."
|
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
# Specify needed analyzer images
analyzers=${SAST_ANALYZERS:-"bandit eslint gosec"}
gitlab=registry.gitlab.com/gitlab-org/security-products/analyzers/
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
# Specify needed analyzer images
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