正式なドキュメントは英語版であり、この日本語訳はAI支援翻訳により作成された参考用のものです。日本語訳の一部の内容は人間によるレビューがまだ行われていないため、翻訳のタイミングにより英語版との間に差異が生じることがあります。最新かつ正確な情報については、英語版をご参照ください。

リカバリーキー管理

リカバリーキーは、OpenBaoの緊急クレデンシャルです。プライマリJWT認証メソッドが使用できなくなったときに、一時的なルートトークンを生成するために使用します。

リカバリーキーは、シークレットフェッチやネームスペースプロビジョニングなどの通常の操作では使用されません。高特権のクレデンシャルとして扱い、安全に保存してください。

リカバリーキーはOpenBaoデータベースに保存されているデータを復号化することはできません。すべてのOpenBaoデータは、設定されたアンシールメカニズムによって保護されています。これは、gitlab-openbao-unseal Kubernetesシークレットに保存されている静的キー、あるいは外部KMSのいずれかです。アンシールメカニズムは、リカバリーキーとは別にバックアップしてください。

このページでコマンドを実行するには、ツールボックスポッドの名前が必要です。それを見つけるには、次を実行します:

kubectl get pods -n gitlab -lapp=toolbox

以下のコマンドでは、<toolbox-pod-name>の代わりにポッド名を使用してください。

リカバリーキーを保存

インシデントが発生する前に、初期設定時にこのコマンドを一度実行してください:

kubectl exec -n gitlab -it -c toolbox <toolbox-pod-name> -- \
  gitlab-rake "gitlab:secrets_management:openbao:recovery_key:store"

このコマンドはOpenBaoでリカバリーキーを生成し、暗号化された状態でGitLabデータベースに保存します。

リカバリーキーは1度しか生成できません。recovery_key:storeを2回目に実行したり、recovery_key:fetchの実行後に実行したりすることはできません。

このコマンドを実行するまで、OpenBaoはポッドを再起動するたびに警告[WARN] core: post-unseal upgrade seal keys failed: error="no recovery key found"をログに記録します。キーを保存すると、その警告は停止します。

保存されたリカバリーキーを表示

GitLabデータベースからリカバリーキーをフェッチして表示するには、次を実行します:

kubectl exec -n gitlab -it -c toolbox <toolbox-pod-name> -- \
  gitlab-rake "gitlab:secrets_management:openbao:recovery_key:show"

コマンドは、キーをプレーンテキストで表示する前に確認を求めます。出力を安全に保存してください。ログに記録したり、安全なチャンネル以外で共有したりしないでください。

リカバリーキーを保存せずにフェッチ

recovery_key:fetchを使用して、リカバリーキーをGitLabデータベースに保存せずにターミナルに生成および表示します。このタスクは、キーを外部システム(パスワードマネージャーやハードウェアセキュリティモジュールなど)に保存する場合に使用します。

リカバリーキーは1度しか生成できません。recovery_key:fetchを2回目に実行したり、recovery_key:storeの実行後に実行したりすることはできません。

kubectl exec -n gitlab -it -c toolbox <toolbox-pod-name> -- \
  gitlab-rake "gitlab:secrets_management:openbao:recovery_key:fetch"

このタスクは、キーを生成および表示する前に確認を求めます。キーはプレーンテキストで表示されます。

リカバリーキーからルートトークンを生成

JWT認証の再構成やシールの移行など、特権的なOpenBao操作を実行する必要がある場合は、リカバリーキーを使用して一時的なルートトークンを生成します。たとえば、別のドメインを持つGeoセカンダリサイトに失敗した場合などです。詳細については、JWT認証を設定を参照してください。

必要な操作が完了したらすぐにルートトークンを失効する。ルートトークンは、すべてのOpenBao操作およびネームスペースへの無制限のアクセス権を持ちます。

baoバイナリはOpenBaoポッド内で利用可能です。すべてのコマンドはkubectl execを使用して実行します。ポートフォワードは不要です。

  1. リカバリーキーを取得する:

    kubectl exec -n gitlab -it -c toolbox <toolbox-pod-name> -- \
      gitlab-rake "gitlab:secrets_management:openbao:recovery_key:show"

    recovery_key:fetchを使用してキーを外部に保存した場合は、代わりにその場所から取得する。

  2. OpenBaoポッド名を取得する:

    kubectl get pods -n gitlab -l app.kubernetes.io/name=openbao -o name

    以下のステップでは、<openbao-pod-name>をこのコマンドからの出力で置き換えます。たとえば、pod/gitlab-openbao-0などです。

  3. OTPを生成する:

    kubectl exec -n gitlab <openbao-pod-name> -- \
      sh -c "BAO_ADDR=http://127.0.0.1:8200 bao operator generate-root -generate-otp"

    以下のコマンドでは、<otp>をこの出力で置き換えます。

  4. ルート生成を初期化する:

    kubectl exec -n gitlab <openbao-pod-name> -- \
      sh -c "BAO_ADDR=http://127.0.0.1:8200 bao operator generate-root -init -otp=<otp>"

    成功した応答には、Started: trueNonceの値が含まれます。以下のステップでは、<nonce>をこのNonceの値で置き換えます。

  5. リカバリーキーを送信する:

    kubectl exec -n gitlab <openbao-pod-name> -- \
      sh -c "echo '<recovery_key>' | BAO_ADDR=http://127.0.0.1:8200 bao operator generate-root -nonce=<nonce>"

    OpenBaoは単一のリカバリーキーシェアで設定されているため、操作はすぐに完了します。成功した応答には、Complete: trueEncoded Tokenの値が含まれます。次のステップでは、<encoded_token>をこのトークン値で置き換えます。

  6. ルートトークンをデコードする:

    kubectl exec -n gitlab <openbao-pod-name> -- \
      sh -c "BAO_ADDR=http://127.0.0.1:8200 bao operator generate-root -decode=<encoded_token> -otp=<otp>"

    以下のステップでは、<root_token>をデコードされたルートトークンで置き換えます。

  7. ルートトークンが機能することを確認する:

    kubectl exec -n gitlab <openbao-pod-name> -- \
      sh -c "BAO_ADDR=http://127.0.0.1:8200 BAO_TOKEN=<root_token> bao token lookup"

    成功した応答にはpolicies [root]が含まれます。

  8. 必要な特権操作を実行します。

  9. ルートトークンを失効する:

    kubectl exec -n gitlab <openbao-pod-name> -- \
      sh -c "BAO_ADDR=http://127.0.0.1:8200 BAO_TOKEN=<root_token> bao token revoke -self"