第4章 ユーザーの管理

本セクションでは、Red Hat CodeReady Workspaces で認可および認証を設定する方法と、ユーザーグループおよびユーザーを管理する方法について説明します。

4.1. ユーザーの認証

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

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

ワークスペースでの認証は、自己署名されたワークごとの JWT トークンの発行と、JWTProxy に基づく専用サービスでの検証について示唆します。

4.1.1. CodeReady Workspaces サーバーに対する認証

4.1.1.1. OpenID を使用した CodeReady Workspaces サーバーに対する認証

CodeReady Workspaces サーバー上の OpenID 認証は、外部の OpenID Connect プロバイダーが存在することを示し、以下の主な手順が実行されます。

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

サポートされ、テスト済みの OpenID プロバイダーは RH-SSO のみです。

手順

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

  1. クライアントが JSON 形式で返される、jwks.endpointtoken.endpointlogout.endpointrealm.name、または client_id などの、クライアントが OpenId プロバイダーの必要なすべての URL およびプロパティーを見つけることができる OpenID 設定サービスを要求します。
  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"
    }

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

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

トークン署名の検証は、2 つの主なステップで実行されます。

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

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

  2. 環境の初期化: フィルターは JWT トークン要求からデータを抽出し、(ない場合は) ローカルデータベースにユーザーを作成します。また、subject オブジェクトを構築して、これを、どこからでも静的にアクセスできる要求別の EnvironmentContext に設定します。

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

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

注記

ユーザー固有のデータを提供します。

RH-SSO はユーザー固有の情報(名前および姓、電話番号、肩書き) を保存できるため、このデータをコンシューマーに提供できる ProfileDao の特別な実装を使用できます。この実装は読み取り専用であるため、ユーザーは作成および更新操作を実行できません。

4.1.1.1.1. RH-SSO を使用した認証情報からのトークンの取得

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

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

$ curl --insecure --data "grant_type=password&client_id=codeready-public&username=<USERNAME>&password=<PASSWORD>" \ 1 2
https://<keyckloak_host>/auth/realms/codeready/protocol/openid-connect/token 3
1
Red Hat CodeReady Workspaces のユーザー名
2
Red Hat CodeReady Workspaces ユーザーのパスワード
3
RH-SSO ホスト

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

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

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

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

$ curl --insecure -X POST  \
-d "client_id=codeready-public" \
-d "subject_token=<USER_OPENSHIFT_TOKEN>" \ 1
-d "subject_issuer=<OPENSHIFT_IDENTITY_PROVIDER_NAME>" \ 2
--data-urlencode "grant_type=urn:ietf:params:oauth:grant-type:token-exchange" \
--data-urlencode "subject_token_type=urn:ietf:params:oauth:token-type:access_token" \
https://<KEYCKLOAK_HOST>/auth/realms/codeready/protocol/openid-connect/token 3
1
コマンド oc whoami --show-token でエンドユーザーが実行するトークン
2
openshift-v4 (OpenShift 4.x の場合) および openshift-v3 (OpenShift 3.11 の場合)
3
RH-SSO ホスト
警告

このトークンの交換機能を使用する前に、エンドユーザーは、少なくとも 1 回は OpenShift ログインページを使用して CodeReady Workspaces ダッシュボードに対話的にログインする必要があります。この手順は、OpenShift および RH-SSO ユーザーアカウントを適切にリンクし、必要なユーザープロファイル情報を設定するために必要です。

4.1.1.2. 他の認証の実装を使用した CodeReady Workspaces サーバーに対する認証

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

手順

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

4.1.1.3. OAuth を使用した CodeReady Workspaces サーバーに対する認証

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

OAuth 認証には、2 つの主要なフローがあります。

delegated
デフォルトです。OAuth 認証を RH-SSO サーバーに委譲します。
embedded
ビルトイン CodeReady Workspaces サーバーメカニズムを使用して OAuth プロバイダーと通信します。

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

OAuth API の主な REST エンドポイントは /api/oauth であり、以下が含まれます。

  • OAuth 認証フローを開始できる認証メソッドの /authenticate
  • プロバイダーからのコールバックを処理するコールバックメソッドの /callback
  • 現行ユーザーの OAuth トークンを取得するためのトークン GET メソッドの /token
  • 現行ユーザーの OAuth トークンを無効にするためのトークン DELETE メソッドの /token
  • 設定済みのアイデンティティープロバイダーの一覧を取得する GET メソッドの /

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

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

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

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

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

JWT トークンを使用すると、RH-SSO トークンをワークスペースコンテナーに渡す必要がなくなります(セキュアではなくなる可能性があります)。また、RH-SSO トークンの有効期間は比較的短く、定期的な更新またはリフレッシュが必要になる場合があります。このため、クライアントの同じユーザーセッショントークンを管理し、これらとの同期を維持するのは容易ではありません。

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

crw authentication inside the workspace

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

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

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

components:
  - type: dockerimage
    endpoints:
      - attributes:
          secure: 'true'

4.1.2.2. ワークスペース JWT トークン

ワークスペーストークンは、要求に以下の情報が含まれる 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))"
}

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

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

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

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