Geo移行のシークレットの収集
- プラン: Ultimate
- 提供形態: GitLab Dedicated
GitLab Dedicated for Governmentは、継続的なGeoレプリケーションやGeoベースのフェイルオーバーをサポートしていません。新しいテナントのオンボーディング用のGeo移行はサポートされていますが、VPN接続が必要です。これを設定するには、GitLab Dedicated for Governmentのオンボーディングチームにお問い合わせください。
Geo移行には、移行後にGitLab Dedicatedがデータを復号化できるように、GitLab Self-Managedのプライマリインスタンスからのシークレットが必要です。これらのシークレットには、データベースの暗号化キー、CI/CD変数、その他の機密性の高い設定の詳細が含まれます。
SSHホストキーはオプションですが、強く推奨されます。これらを保持しておくと、移行後にユーザーがSSH経由でgit cloneまたはgit pullを実行する際のSSHホストキー検証の失敗を防げます。独自のドメインを使用する予定がある場合は、特に重要です。
収集スクリプトは、ファイル暗号化ツールであるageを使用して、Switchboardにアップロードする前にシークレットを安全に暗号化します。
移行シークレットを収集してアップロードする
GitLab Dedicatedインスタンスを作成する際に、Geo移行シークレットを収集してアップロードします。
前提条件:
- GitLab Self-Managedのプライマリインスタンスへの管理アクセス権
- Python 3.x
- SwitchboardのGeo移行シークレットページにある
age公開キー - GitLabクラスターへのアクセス用に設定された
kubectl(Kubernetesインストールのみ)
移行シークレットを収集してアップロードするには、次の手順に従います:
Switchboardにサインインします。
Geo移行シークレットページで、インストールタイプに適した収集スクリプトをダウンロードします。
オプション。オフライン環境の場合は、実行する前に
ageバイナリを収集スクリプトに埋め込みます。詳細については、オフライン環境を参照してください。インストールタイプに応じた収集スクリプトを実行し、
<age_public_key>をページに表示されているキーに置き換えます:Linuxパッケージインストールの場合は、Railsノードで次のコマンドを実行します:
python3 collect_secrets_linux_package.py <age_public_key>/etc/gitlab/gitlab-secrets.json、/var/opt/gitlab/gitlab-rails/etc/database.yml、および/etc/ssh/への読み取りアクセス権が必要です。Kubernetesインストールの場合は、
kubectlアクセス権を持つワークステーションから次のコマンドを実行します:python3 collect_secrets_k8s.py <age_public_key>デフォルト値を上書きするには、追加のフラグを渡すことができます。詳細については、Kubernetes収集スクリプトのフラグを参照してください。
オプション。SSHホストキーのみを収集するには、コマンドに
--hostkeys-onlyフラグを追加します。このスクリプトは、次を生成します:
migration_secrets.json.age: GitLabシークレット(必須)ssh_host_keys.json.age: SSHホストキー(オプションですが推奨)
migration_secrets.json.ageファイルをアップロードします。オプション。
ssh_host_keys.json.ageファイルをアップロードします。検証が完了するまで待ちます。検証には、ファイルごとに約10~20秒かかります。
表示されるファイル名とフィンガープリントが、アップロードしたファイルと一致することを確認します。
検証では、ファイルが適切に暗号化され、期待される構造を含んでいることを確認します。ファイルの内容を復号化したり、公開したりすることはありません。
シークレットをアップロードしたら、残りの手順を完了してテナントを作成します。
Kubernetes収集スクリプトのフラグ
デフォルト値を上書きするには、これらのオプションフラグをcollect_secrets_k8s.pyとともに使用します:
| フラグ | デフォルト | 説明 |
|---|---|---|
--namespace NAME | 現在のコンテキスト | Kubernetesネームスペース。 |
--release NAME | gitlab | Helmリリース名のプレフィックス。 |
--rails-secret NAME | なし | Railsシークレットのシークレット名。 |
--registry-secret NAME | なし | レジストリシークレット名。 |
--postgres-secret NAME | なし | Postgresパスワードのシークレット名。 |
--hostkeys-secret NAME | なし | SSHホストキーのシークレット名。 |
オフライン環境
GitLab Self-Managedインスタンスにインターネットアクセスがない場合は、実行する前にageバイナリを収集スクリプトに埋め込みます。
オフライン環境用に収集スクリプトを設定するには:
インターネットアクセスのあるマシンで、Geoシークレット収集プロジェクトから
download_age_binaries.pyとembed_age_binary.pyをダウンロードし、Switchboardからダウンロードした収集スクリプトと同じディレクトリに配置します。ageバイナリをダウンロードしてエンコードします:python3 download_age_binaries.py > age_binaries.txtこのスクリプトは、Linux AMD64およびARM64用のbase64エンコードされた
ageバイナリを標準出力に出力するため、その出力をage_binaries.txtにリダイレクトする必要があります。バイナリを収集スクリプトに埋め込みます:
python3 embed_age_binary.pyこのスクリプトは、現在のディレクトリから
age_binaries.txtを読み取り、collect_secrets_linux_package.pyとcollect_secrets_k8s.pyを埋め込みバイナリを含むバージョンで上書きします。更新された収集スクリプトをオフライン環境に転送します。
移行シークレットを収集してアップロードするの説明に従って、GitLab Self-Managedインスタンスでスクリプトを実行します。
更新されたスクリプトは自己完結型であり、埋め込まれたageバイナリを自動的に抽出して使用します。
トラブルシューティング
Geo移行を使用する際に、次の問題が発生する可能性があります。
エラー: 収集スクリプトの実行時にPermission deniedが発生する
収集スクリプトがGitLab設定ファイルにアクセスしようとすると、権限エラーが発生することがあります。
この問題は、スクリプトが必要なファイルを読み取るのに十分な権限なしで実行された場合に発生します。
この問題を解決するには:
- Linuxパッケージインストールの場合は、
rootユーザーとしてスクリプトを実行するか、sudoを使用してください。 - Kubernetesインストールの場合は、
kubectlコンテキストがGitLabネームスペースへのアクセス権を持っていることを確認してください。 - 必要なファイルが想定されるパスに存在することを確認します。
収集スクリプトがGitLabインストールを見つけられない
スクリプトがGitLabのインストールまたは設定ファイルを見つけられないというエラーが発生することがあります。
この問題は、次のシナリオで発生します:
- GitLabがインストールされていないマシンでスクリプトが実行される。
- GitLabが非標準の場所にインストールされている。
- 必要な設定ファイルが不足しているか、移動されている。
一般的なエラーメッセージには、次のものがあります:
- Linuxパッケージ:
Error: database.yml not found: /var/opt/gitlab/gitlab-rails/etc/database.ymlの後に✗ Failed to collect GitLab secretsが続く - Kubernetes:
Error: Could not retrieve gitlab-rails-secrets
この問題を解決するには:
- スクリプトが正しいマシン(Linuxパッケージインストールの場合はRailsノード)で実行されることを確認します。
- GitLabが正しくインストールおよび設定されていることを確認します。
- GitLabが非標準の場所にインストールされている場合は、設定ファイルのパスがインストール内容と一致していることを確認します。
- 必要なファイルが不足しているか破損している場合は、移行を進める前にプロフェッショナルサービスに連絡して、インストールのヘルスチェックを実施してください。