GitLab シークレット検出 ADR 005: サービスデプロイにRunwayを使用する

背景

シークレット検出サービスは、GitLab CI環境を通じた自動デプロイを実行するための戦略が必要です。

提案されたソリューション: Runway

Runway - チームがサービスを迅速かつ安全にデプロイして実行できるようにすることを目的としたGitLab内部のPlatform as a Service - を使用できます。

プラットフォームツールサポート

  • ロギング: Runway ではGitLab管理のElasticsearch/KibanaスタックのJasonロギングが利用できず、近い将来にサポートする計画もないようです。現時点での回避策はGoogle Cloud Run UIでログを確認することです。

  • 可観測性: Runwayは監視スタックとの統合によりサービスの可観測性をサポートしています。Runwayが提供するデフォルトメトリクスダッシュボードの例)は、監視に必要なすべてのシステムメトリクスをカバーしています。

  • 障害時のページャーアラート: Runwayはデフォルトで以下の異常に対してアラートを生成します。これで開始するには十分だと考えています:

    • Apdex SLO violation
    • Error SLO violation
    • Traffic absent SLO violation
  • サービスレベルインジケーター(SLI): Runwayが提供するデフォルトメトリクスダッシュボードの例)は必要なSLI要件をカバーしています。

  • インサイト: ルールパターンのレイテンシ、使用回数、ソースなどの追加メトリクスが必要になる場合があります。カスタムメトリクスを使用する可能性があり、近日中にさらに評価を行います。

既知の制限(シークレット検出サービスに関連するもの)

制限への対応

Runwayが自己管理(SM)環境をサポートしていないという制限により、SM環境向けの他のソリューションを評価することになりました。Cloud ConnectorのAPIベースのアプローチは、SM環境に対する不足しているデプロイソリューションを概ね解決します。しかし、シークレットプッシュ保護機能はGitalyとサービス間でリアルタイムに大量のデータを頻繁に転送する必要があるため、RESTベースのAPIはRPCリクエストでのデータストリーミングとは異なり大幅なネットワークオーバーヘッドを追加するため適切ではありません。Cloud Connectorのアプローチをある程度の追加の複雑さで最適化することもできますが、RunwayがSM環境向けのデプロイソリューションを導入するまでの時間の問題です。SM環境向けのもう1つの代替ソリューションは、DockerイメージのアーティファクトをデプロイJasonの説明とともに顧客と共有すること(カスタムモデルアプローチと同様)でしたが、水平スケーリングが懸念事項になる可能性がありました。

ハイブリッドソリューションを考案しました。GitLab SaaSのスケールに対応するために、Runwayを使用してデプロイされた専用のRPCベースのシークレット検出サービスを持ちます。このサービスはSDのリソース使用量を他のサービス(RailsとGitaly)への影響なく分離し、必要に応じて独立してスケーリングできます。一方、自己管理インスタンスについては、そのアプローチが最大GET 50K リファレンスアーキテクチャまで適切に機能したため、現在のGemベースのアプローチを継続します。RunwayがデプロイJasonサポートを導入した時点で、最終的に自己管理環境をRunwayに移行します。

まとめ: GitLab SaaSにはRunwayを使用してデプロイされたRPCサービスを使用し、GitLab 自己管理インスタンスには現在のRuby Gemアプローチを継続します。

シークレットスキャンのコア実装を再利用するために、2つの異なる配布方式を持つ単一のソースコードを持ちます:

  1. シークレット検出ロジックをRubyGemでラップし、Rails内で使用する(現在のGemを置き換える)。

  2. シークレット検出ロジックをRPCサービスでラップし、Runwayを使用してデプロイし、GitLab SaaSのRailsからサービスを呼び出す。

rpc_service.png {width=“1001” height=“311”}

提案された変更を示すワークフロー:

sequenceDiagram
    autonumber
    %% Phase 2: Iter 1
    Gitaly->>+Rails: invokes `internal/allowed`
    Rails->>Rails: Perform project eligibility checks
    alt On project eligibility check failure
        Rails-->>Gitaly: Scanning Skipped
    end
    Rails->>Gitaly: Get blobs
    Gitaly->>Rails: Quarantined Blobs
    Note over Rails,SD Ruby Gem: For GitLab Self-Managed
    Rails->>SD Ruby Gem: Invoke RPC and forward quarantined blobs
    SD Ruby Gem->>SD Ruby Gem: Runs Secret Detection on input blobs
    SD Ruby Gem->>Rails: Result
    Note over Rails,SD RPC Service: For GitLab SaaS (GitLab.com & Dedicated)
    Rails->>SD RPC Service: Invoke RPC and forward quarantined blobs
    SD RPC Service->>SD RPC Service: Runs Secret Detection on input blobs
    SD RPC Service->>Rails: Result
    Rails->>Gitaly: Result

参考リンク