ウェブ端末(非推奨)
- GitLab 14.5 で非推奨。
- GitLab 15.0ではセルフマネージドで無効。
フラグ: セルフマネジメントのGitLabでは、デフォルトではこの機能は利用できません。利用可能にするには、管理者がcertificate_based_clusters
という機能フラグを有効にします。
- Web IDE からアクセスできる非推奨のWeb ターミナルについてはこちらをご覧ください。
- 実行中の CI ジョブからアクセスできる非推奨の Web ターミナルについては、こちらをご覧ください。
Kubernetesインテグレーションが導入されたことで、GitLabはKubernetesクラスターの認証情報を保存して使用することができるようになりました。GitLabはこれらの認証情報を使用して、環境用のWebターミナルへのアクセスを提供します。
どのように動作するか
ウェブターミナルのアーキテクチャとその仕組みの詳細については、このドキュメントをご覧ください。簡単に説明すると
- 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/HOST
とPORT
は設定されたlisten_address
です。 - 作成されるセッション URL にはすべて、
wss
接続を確立するために送信する必要がある作成者ヘッダがあります。 - セッションURLはユーザーには一切公開されません。GitLabは内部ですべての状態を保持し、それに応じてプロキシを行います。
ターミナルサポートの有効化と無効化
ウェブ端末はウェブソケットを使用するため、Workhorseの前にあるすべてのHTTP/HTTPSリバースプロキシは、Connection
とUpgrade
ヘッダをチェーンの次のものに渡すように設定する必要があります。GitLabはデフォルトでそのように設定されています。
しかし、GitLabの前でロードバランサーを実行する場合は、設定を変更する必要があるかもしれません。これらのガイドでは、一般的なリバースプロキシに必要な手順を説明しています:
Workhorse は WebSocket 以外のエンドポイントへの WebSocket リクエストを許可しないので、これらのヘッダのサポートをグローバルに有効にしても安全です。より狭い範囲のルールにしたい場合は、/terminal.ws
で終わる URL に限定することができます。このアプローチでも少数の誤検出があるかもしれません。
インストールをセルフコンパイルしている場合は、設定を変更する必要があるかもしれません。詳細は、コミュニティ版とエンタープライズ版のソースからのアップグレードを参照してください。
GitLab でウェブターミナルのサポートを無効にするには、チェーン内の最初のHTTP リバースプロキシでConnection
とUpgrade
のホップバイホップヘッダを渡さないようにします。ほとんどのユーザーにとって、これはLinuxパッケージインストールにバンドルされているNGINXサーバーです。この場合は
-
gitlab.rb
ファイルのnginx['proxy_set_headers']
セクションを見つけてください。 - ブロック全体がコメントアウトされていないことを確認し、
Connection
とUpgrade
の行をコメントアウトするか削除してください。
あなた自身のロードバランサについては、上記のガイドで推奨されている設定の変更を逆にするだけです。
これらのヘッダを通さない場合、Workhorse はウェブ端末を使おうとするユーザーに400 Bad Request
応答を返します。そして、Connection failed
というメッセージを受け取ります。
WebSocket 接続時間の制限
デフォルトでは、ターミナルセッションの有効期限はありません。GitLabインスタンスでターミナルセッションの有効期限を制限するには、次のようにします:
- 左のサイドバーで、Search を選択するか、次のページに進んでください。
- Admin Areaを選択します。
- 設定 > ウェブ端末を選択します。
-
max session time
を設定します。