第6章 CodeReady Workspaces のセキュリティー保護


本セクションでは、CodeReady Workspaces サーバーおよびそのワークスペースのユーザー認証、認証のタイプ、およびパーミッションモデルのあらゆる側面について説明します。

6.1. ユーザーの認証

本書では、CodeReady Workspaces サーバーとワークスペースの両方で、Red Hat CodeReady Workspaces でのユーザー認証のあらゆる側面について説明します。これには、すべての REST API エンドポイント、WebSocket または JSON RPC 接続、および一部の Web リソースのセキュリティー保護が含まれます。

すべての認証タイプは、ユーザー ID 情報を転送するためのコンテナーとして JWT オープン標準 を使用します。さらに、CodeReady Workspaces サーバー認証は、Keycloak によってデフォルトで提供される OpenID Connect プロトコル実装に基づいています。

ワークスペースでの認証は、ワークスペースごとに自己署名型の JWT トークンと、JWTProxy をベースとした専用のサービスで検証されることを意味し ます

6.1.1. CodeReady Workspaces サーバーへの認証

6.1.1.1. OpenID を使用した CodeReady Workspaces サーバーへの認証

CodeReady Workspaces サーバーの OpenID 認証は、外部 OpenID Connect プロバイダーが存在し、以下の主なステップを持つことを意味します。

  • HTTP リクエストから取得された JWT トークンを使用するか、トークンが見つからないか、無効な場合は、ユーザーを RH-SSO ログインページにリダイレクトします。
  • Authorization ヘッダーで認証トークンを送信します。一部のケースでは、Authorization ヘッダーを使用できない場合は、トークンをトークンクエリーパラメーターに送信できます。例: OAuth 認証の初期化
  • CodeReady Workspaces サーバーコード内の現在のユーザーを表す内部 サブジェクト オブジェクトを作成します。
注記

対応している OpenID プロバイダーのみが RH-SSO です。

手順

OpenID 認証を使用して CodeReady Workspaces サーバーへの認証を行うには、以下を実行します。

  1. OpenID 設定サービスをリクエストします。ここで 、クライアントが、JSON 形式で返される jwks.endpoint、token .endpointlogout.endpoint 、または client_id などの OpenId プロバイダーの必要な URL およびプロパティーをすべて検索できます。
  2. サービス URL は https://codeready-<openshift_deployment_name>.<domain_name>/api/keycloak/settings で、CodeReady Workspaces マルチユーザーモードでのみ利用できます。URL にサービスが存在すると、現在のデプロイメントで認証が有効になっていることを確認します。

    出力例:

    {
        "che.keycloak.token.endpoint": "http://172.19.20.9:5050/auth/realms/che/protocol/openid-connect/token",
        "che.keycloak.profile.endpoint": "http://172.19.20.9:5050/auth/realms/che/account",
        "che.keycloak.client_id": "che-public",
        "che.keycloak.auth_server_url": "http://172.19.20.9:5050/auth",
        "che.keycloak.password.endpoint": "http://172.19.20.9:5050/auth/realms/che/account/password",
        "che.keycloak.logout.endpoint": "http://172.19.20.9:5050/auth/realms/che/protocol/openid-connect/logout",
        "che.keycloak.realm": "che"
    }
    Copy to Clipboard Toggle word wrap

    このサービスは、JavaScript クライアントライブラリーをダウンロードし、https://codeready-<openshift_deployment_name>.<domain_name>/api/keycloak/OIDCKeycloak.js URL を使用してプロバイダーと対話 でき ます。

  3. client_id および return redirection パスを含む必要なパラメーターをすべて使用して、ユーザーを適切なプロバイダーのログインページにリダイレクトします。これは、すべてのクライアントライブラリー(JS または Java)で実行できます。
  4. ユーザーがプロバイダーにログインすると、クライアント側のサイドコードを取得し、JWT トークンがトークンを検証すると、サブジェクト の作成が開始されます。

トークン署名の検証は、以下の 2 つの手順で行われます。

  1. Authentication: トークンは Authorization ヘッダーまたはトークンクエリーパラメーターから抽出され、プロバイダーから取得さ た公開鍵を使用して解析されます。期限切れ、無効なトークン、または不適切な場合、403 エラーがユーザーに送信されます。今後のバージョンでのサポート制限や完全削除により、クエリーパラメーターの最小使用が推奨されます。

    検証に成功すると、トークンの解析形式は環境初期化ステップに渡されます。

  2. 環境の初期化 - フィルターは JWT トークンクレームからデータを抽出し、ローカルデータベースにユーザーを作成します(まだ利用できない場合は)、サブジェクト オブジェクトを構築し、これを各リクエストの EnvironmentContext オブジェクトに設定します。この オブジェクト は、どこにでもアクセスできます。

    リクエストが JWT トークンのみを使用して作成された場合、以下の単一の認証フィルターが使用されます。

    org.eclipse.che.multiuser.machine.machine.server.MachineLoginFilter: フィルターは userId トークン が属するユーザーを見つけ、ユーザーインスタンスを取得し、プリンシパルをセッションに設定します。CodeReady Workspaces のサーバー間の要求は、EnvironmentContext オブジェクト から取得した現在のサブジェクトトークンですべてのリクエストに署名する専用のリクエストファクトリーを使用して実行されます。

注記

ユーザー固有のデータの提供

RH-SSO は、ユーザー固有の情報(ファーストおよび姓、電話番号、ジョブタイトル)を保存する可能性があるため、このデータをコンシューマーに提供 できる ProfileDao には特別な実装があります。実装は読み取り専用であるため、ユーザーは作成および更新の操作を実行できません。

6.1.1.1.1. RH-SSO による認証情報からのトークンの取得

JavaScript やその他のクライアント(コマンドラインクライアントや Selenium テストなど)を実行できないクライアントは、RH-SSO から直接承認トークンを要求する必要があります。

トークンを取得するには、ユーザー名とパスワード認証情報でリクエストをトークンエンドポイントに送信します。このリクエストは、スキーマ的に以下の cURL リクエストとして記述できます。

$ curl --data "grant_type=password&client_id=<client_name>&username=<username>&password=<password>" \
  http://<keyckloak_host>:5050/auth/realms/<realm_name>/protocol/openid-connect/token
Copy to Clipboard Toggle word wrap

CodeReady Workspaces ダッシュボードは、カスタマイズされた RH-SSO ログインページと、grant_type=authorization_code に基づく認証メカニズムを使用します。これは 2 段階の認証プロセスです。

  1. ログインし、承認コードを取得します。
  2. この認可コードを使用したトークンの取得。
6.1.1.1.2. OpenShift トークンから RH-SSO を介したトークンの取得

CodeReady Workspaces が Operator を使用して OpenShift にインストールされ、OpenShift OAuth 統合がデフォルトで有効になると、ユーザーの CodeReady Workspaces 認証トークンをユーザーの OpenShift トークンから取得できます。

OpenShift トークンから認証トークンを取得するには、スキーマで記述された cURL リクエストを OpenShift トークンエンドポイントに送信します。

$ curl -X POST -d "client_id=<client_name>" \
--data-urlencode "grant_type=urn:ietf:params:oauth:grant-type:token-exchange" \
-d "subject_token=<user_openshift_token>" \
 -d "subject_issuer=<openshift_identity_provider_name>" \
 --data-urlencode "subject_token_type=urn:ietf:params:oauth:token-type:access_token" \
 http://<keyckloak_host>:5050/auth/realms/<realm_name>/protocol/openid-connect/token
Copy to Clipboard Toggle word wrap

<openshift_identity_provider_name> のデフォルト値は以下のとおりです。

  • On OpenShift 3.11: openshift-v3
  • OpenShift 4.x の場合: openshift-v4

<user_openshift_token> は、以下のコマンドで end-user によって取得されるトークンです。

$ oc whoami --show-token
Copy to Clipboard Toggle word wrap
警告

このトークン交換機能を使用する前に、エンドユーザーが OpenShift ログインページを使用して CodeReady Workspaces Dashboard に 1 回以上対話形式でログインする必要があります。このステップは、OpenShift および RH-SSO ユーザーアカウントを適切にリンクし、必要なユーザープロファイル情報を設定するために必要です。

6.1.1.2. 他の認証実装を使用した CodeReady Workspaces サーバーへの認証

この手順では、RH-SSO 以外の OpenID Connect(OIDC)認証実装を使用する方法を説明します。

手順

  1. multiuser.properties ファイル(クライアント ID、認証 URL、レルム名など)に保存されている認証設定パラメーターを更新します。
  2. 単一フィルターまたはフィルターチェーンを作成してトークンの検証、CodeReady Workspaces ダッシュボードでユーザーの作成、サブジェクト オブジェクトの作成。
  3. 新しい承認プロバイダーが OpenID プロトコルをサポートする場合は、特定の実装から切り離されたため、設定エンドポイントで利用可能な OIDC JS クライアントライブラリーを使用します。
  4. 選択したプロバイダーがユーザーに関する追加のデータ(最初の名およびジョブタイトル)を保存する場合は、この情報を提供するプロバイダー固有の ProfileDao 実装 を作成することが推奨されます。

6.1.1.3. OAuth を使用した CodeReady Workspaces サーバーへの認証

サードパーティーサービスとのユーザーによる対話を容易にするため、CodeReady Workspaces サーバーは OAuth 認証をサポートします。OAuth トークンは GitHub 関連のプラグインにも使用されます。

OAuth 認証には、RH-SSO ブローカーメカニズムに基づく 2 つの主要なフローがあります。以下は、2 つの主な OAuth API 実装です。

internal
org.eclipse.che.security.oauth.EmbeddedOAuthAPI
External
org.eclipse.che.multiuser.keycloak.server.oauth2.DelegatedOAuthAPI

2 つの実装を切り替えるには、che.oauth.service_mode=<embedded|delegated> 設定プロパティーを使用します。

OAuth API の主な REST エンドポイントは、以下を含む org.eclipse.che.security.oauth. OAuthAuthenticationService です。

  • OAuth 認証フローが起動する認証方法。
  • プロバイダーからのコールバックを処理するコールバックメソッド。
  • 現在のユーザーの OAuth トークンを取得するトークン。

これらのメソッドは、現在アクティベートされ、埋め込みまたは委譲された OAuthAPI に適用されます。その後、OAuthAPI は以下の基礎となる操作を提供します。

  • 適切なオーセンティケーターを見つけます。
  • ログインプロセスを初期化します。
  • ユーザーの転送

6.1.1.4. Swagger または REST クライアントを使用したクエリーの実行

ユーザーの RH-SSO トークンは、REST クライアントを介してユーザーのセキュアな API に対してクエリーを実行するために使用されます。有効なトークンは Request ヘッダーまたは ?token=$token クエリーパラメーターとして割り当てる必要があります。

https://codeready-<openshift_deployment_name>.<domain_name>/swagger で CodeReady Workspaces Swagger インターフェースにアクセスし ます。アクセストークンが Request ヘッダーに含まれるように、ユーザーは RH-SSO を介して署名する必要があります。

6.1.2. CodeReady Workspaces ワークスペースでの認証

ワークスペースコンテナーには、認証で保護する必要のあるサービスが含まれる場合があります。このような保護されているサービスは、セキュア と呼ばれます。これらのサービスのセキュリティーを保護するには、マシン認証メカニズムを使用します。

JWT トークンは、RH-SSO トークンをワークスペースコンテナーに渡す必要がありません(安全でない可能性があります)。また、RH-SSO トークンの有効期間は比較的短く、定期的な更新や更新が必要になる場合があります。これは、クライアントの同じユーザーセッショントークンの管理および同期が困難です。

図6.1 ワークスペース内の認証

6.1.2.1. セキュアなサーバーの作成

CodeReady Workspaces ワークスペースでセキュアなサーバーを作成するには、devfile の dockerimage タイプ のコンポーネントでエンドポイントの secure 属性を true に設定します。

セキュアなサーバー用の devfile スニペット

components:
  - type: dockerimage
    endpoints:
      - attributes:
          secure: 'true'
Copy to Clipboard Toggle word wrap

6.1.2.2. workspace JWT token

ワークスペーストークンは、要求に以下の情報が含まれる JSON Web トークン(JWT)です。

  • UID: このトークンを所有するユーザーの ID
  • Uname: このトークンを所有するユーザーの名前
  • wsid: このトークンでクエリーできるワークスペースの ID

各ユーザーは、各ワークスペースに一意の個人トークンが提供されます。トークンと署名の構造は、RH-SSO とは異なります。トークンビューの例を以下に示します。

# Header
{
  "alg": "RS512",
  "kind": "machine_token"
}
# Payload
{
  "wsid": "workspacekrh99xjenek3h571",
  "uid": "b07e3a58-ed50-4a6e-be17-fcf49ff8b242",
  "uname": "john",
  "jti": "06c73349-2242-45f8-a94c-722e081bb6fd"
}
# Signature
{
  "value": "RSASHA256(base64UrlEncode(header) + . +  base64UrlEncode(payload))"
}
Copy to Clipboard Toggle word wrap

RSA アルゴリズムを使用した SHA-256 暗号は、JWT トークンの署名に使用されます。設定することはできません。また、トークンが署名されるキーペアの公開部分を配布するパブリックサービスはありません。

6.1.2.3. マシントークンの検証

マシントークン(JWT トークン)の検証は、別の Pod の JWTProxy で実行される専用のワークスペースサービスを使用して 実行 されます。ワークスペースが起動すると、このサービスは CodeReady Workspaces サーバーから SHA キーの公開部分を受け取ります。セキュアなサーバーごとに個別の検証エンドポイントが作成されます。トラフィックがエンドポイントに到達すると、JWTProxy はクッキーまたはヘッダーからトークンを 抽出 し、公開鍵の部分を使用して検証します。

CodeReady Workspaces サーバーにクエリーを行うには、ワークスペースサーバーは CHE _MACHINE_TOKEN 環境変数で提供されるマシントークンを使用できます。このトークンは、ワークスペースを起動したユーザーのものです。このような要求の範囲は、現在のワークスペースのみに制限されます。許可される操作のリストは厳密に制限されます。

トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat