オフラインGitLab

オフライン環境のコンピュータは、セキュリティ対策として公開インターネットから隔離されています。 このページでは、オフライン環境でGitLabを実行するために利用可能なすべての情報を示します。

クイックスタート

物理的に隔離されたオフラインネットワーク上にGitLabインスタンスをデプロイする予定の場合は、クイックスタートガイドの設定手順を参照してください。

特徴

オフライン環境でGitLabの機能を使うには、以下のベストプラクティスに従ってください:

オフラインホストへのDockerイメージのロード

セキュリティスキャンやAuto DevOpsを含む多くのGitLab機能を使うには、GitLab Runnerが関連するDockerイメージをフェッチできなければなりません。

公開インターネットに直接アクセスすることなく、これらの画像を利用できるようにするには、画像をダウンロードし、パッケージ化してオフラインのホストに転送する必要があります。 以下は、そのような転送の例です:

  1. 公開インターネットからDockerイメージをダウンロードします。
  2. Dockerイメージをtarアーカイブとしてパッケージ化します。
  3. オフライン環境に画像を転送します。
  4. 転送されたイメージをオフラインのDockerレジストリにロードします。

GitLab公式テンプレートを使う

GitLabはこのプロセスを簡単にするために、ベンダリングテンプレートを提供しています。

このテンプレートは、gitlab-ci.yml ファイルを含む、新しい空のプロジェクトで使用する必要があります:

include:
  - template: Secure-Binaries.gitlab-ci.yml

パイプラインはセキュリティスキャナに必要なDockerイメージをダウンロードし、ジョブのアーティファクトとして保存するか、パイプラインが実行されるプロジェクトのコンテナレジストリにプッシュします。 これらのアーカイブは別の場所に転送し、Dockerデーモンでロードすることができます。 この方法では、gitlab.comregistry.gitlab.comを含む)とローカルのオフラインインスタンスの両方にアクセスできるGitLabランナーが必要です。このランナーは、ジョブ内でdocker コマンドを使用できるように特権モードで実行する必要があります。このランナーはDMZやbastionにインストールすることができ、この特定のプロジェクトだけに使用されます。

アップデートのスケジューリング

デフォルトでは、このプロジェクトのパイプラインは.gitlab-ci.yml がリポジトリに追加されたときに一度だけ実行されます。 GitLab のセキュリティスキャナとシグネチャを更新するには、このパイプラインを定期的に実行する必要があります。 GitLab にはパイプラインをスケジュールする方法があります。 例えば、毎週 Docker イメージをダウンロードして保存するように設定することができます。

例えば、コンテナスキャン用の脆弱性データベースは毎日更新されます。 この単一のイメージを更新するには、毎日実行する新しいスケジュールパイプラインを作成し、SECURE_BINARIES_ANALYZERSclair-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