ウェブ端末(非推奨)

caution
この機能はGitLab 14.5で非推奨となりました。

フラグ: セルフマネジメントのGitLabでは、デフォルトではこの機能は利用できません。利用可能にするには、管理者がcertificate_based_clustersという機能フラグを有効にします。


Kubernetesインテグレーションが導入されたことで、GitLabはKubernetesクラスターの認証情報を保存して使用することができるようになりました。GitLabはこれらの認証情報を使用して、環境用のWebターミナルへのアクセスを提供します。

note
プロジェクトのメンテナー以上のロールを持つユーザーのみがウェブターミナルにアクセスできます。

どのように動作するか

ウェブターミナルのアーキテクチャとその仕組みの詳細については、このドキュメントをご覧ください。簡単に説明すると

  • GitLabはユーザーが自分のKubernetes認証情報を提供し、デプロイ時に作成するポッドに適切なラベルを付けることに依存しています。
  • ユーザーが環境のターミナルページに移動すると、GitLabに戻るWebSocket接続を開くJavaScriptアプリケーションが提供されます。
  • WebSocketはRailsアプリケーションサーバーではなくWorkhorseで処理されます。
  • WorkhorseはRailsに接続の詳細とユーザー権限をクエリします。RailsはSidekiqを使ってバックグラウンドでKubernetesにクエリします。
  • WorkhorseはユーザーのブラウザとKubernetes API間のプロキシサーバとして動作し、両者間でWebSocketフレームを渡します。
  • Workhorseは定期的にRailsをポーリングし、ユーザーがターミナルにアクセスする権限がなくなったり、接続の詳細が変更されたりした場合にWebSocket接続を終了します。

セキュリティ

GitLabとGitLab Runnerは、インタラクティブなウェブ端末のデータを暗号化し、作成者を保護するためのいくつかの予防措置をとっています。これについては以下で詳しく説明します。

  • [session_server] が設定されていない限り、対話型ウェブターミナルは完全に無効です。
  • Runner が起動するたびに、wss (Web Socket Secure) 接続に使用されるx509 証明書が生成されます。
  • 作成されたジョブごとに、ジョブの終了時に破棄されるランダムなURLが生成されます。このURLはウェブソケット接続を確立するために使用されます。セッションの URL は(IP|HOST):PORT/session/$SOME_HASH の形式で、IP/HOSTPORT は設定されたlisten_addressです。
  • 作成されるセッション URL にはすべて、wss 接続を確立するために送信する必要がある作成者ヘッダがあります。
  • セッションURLはユーザーには一切公開されません。GitLabは内部ですべての状態を保持し、それに応じてプロキシを行います。

ターミナルサポートの有効化と無効化

note
AWS Classic Load BalancersはWebソケットをサポートしていません。Web 端末を動作させたい場合は、AWS Network Load Balancers を使用してください。詳しくはAWS Elastic Load Balancing Product Comparisonをご覧ください。

ウェブ端末はウェブソケットを使用するため、Workhorseの前にあるすべてのHTTP/HTTPSリバースプロキシは、ConnectionUpgrade ヘッダをチェーンの次のものに渡すように設定する必要があります。GitLabはデフォルトでそのように設定されています。

しかし、GitLabの前でロードバランサーを実行する場合は、設定を変更する必要があるかもしれません。これらのガイドでは、一般的なリバースプロキシに必要な手順を説明しています:

Workhorse は WebSocket 以外のエンドポイントへの WebSocket リクエストを許可しないので、これらのヘッダのサポートをグローバルに有効にしても安全です。より狭い範囲のルールにしたい場合は、/terminal.ws で終わる URL に限定することができます。このアプローチでも少数の誤検出があるかもしれません。

インストールをセルフコンパイルしている場合は、設定を変更する必要があるかもしれません。詳細は、コミュニティ版とエンタープライズ版のソースからのアップグレードを参照してください。

GitLab でウェブターミナルのサポートを無効にするには、チェーン内の最初のHTTP リバースプロキシでConnectionUpgrade のホップバイホップヘッダを渡さないようにします。ほとんどのユーザーにとって、これはLinuxパッケージインストールにバンドルされているNGINXサーバーです。この場合は

  • gitlab.rb ファイルのnginx['proxy_set_headers'] セクションを見つけてください。
  • ブロック全体がコメントアウトされていないことを確認し、ConnectionUpgrade の行をコメントアウトするか削除してください。

あなた自身のロードバランサについては、上記のガイドで推奨されている設定の変更を逆にするだけです。

これらのヘッダを通さない場合、Workhorse はウェブ端末を使おうとするユーザーに400 Bad Request 応答を返します。そして、Connection failed というメッセージを受け取ります。

WebSocket 接続時間の制限

デフォルトでは、ターミナルセッションの有効期限はありません。GitLabインスタンスでターミナルセッションの有効期限を制限するには、次のようにします:

  1. 左のサイドバーで、Search を選択するか、次のページに進んでください。
  2. Admin Areaを選択します。
  3. 設定 > ウェブ端末を選択します。
  4. max session time を設定します。