8.2. 直接認証に使用する外部 OIDC アイデンティティープロバイダーの設定
認証用のトークン発行に外部 OIDC アイデンティティープロバイダーを直接使用するように OpenShift Container Platform を設定できます。
OIDC アイデンティティープロバイダーを使用した直接認証は、テクノロジープレビュー機能です。テクノロジープレビュー機能は、Red Hat 製品のサービスレベルアグリーメント (SLA) の対象外であり、機能的に完全ではないことがあります。Red Hat は、実稼働環境でこれらを使用することを推奨していません。テクノロジープレビュー機能は、最新の製品機能をいち早く提供して、開発段階で機能のテストを行い、フィードバックを提供していただくことを目的としています。
Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、以下のリンクを参照してください。
前提条件
-
TechPreviewNoUpgrade機能セットが有効化されている。 外部認証プロバイダーを設定した。
この手順では、Keycloak をアイデンティティープロバイダーとして使用し、以下のクライアントが設定されていることを前提としています。
-
有効なリダイレクト URI が
https://<openshift_console_route>/auth/callbackに設定されたconsole-testという Web コンソールの機密クライアント -
有効なリダイレクト URI が
http://localhost:8080に設定された、oc-cli-testという OpenShift CLI (oc) の公開クライアント
-
有効なリダイレクト URI が
-
クラスターのインストールプログラムによって生成された
kubeconfigファイルにアクセスできる。 - 認証に組み込みの OAuth サーバーを使用するように戻す必要がある場合に備えて、既存の認証設定をバックアップした。
手順
-
インストールプログラムによって生成された
kubeconfigファイル、またはクラスター管理者としてログインする別の長期的な方法を使用していることを確認します。 次のコマンドを実行して、Web コンソールでの認証を可能にするシークレットを作成します。
$ oc create secret generic console-secret \ --from-literal=clientSecret=<secret_value> \1 -n openshift-config- 1
<secret_value>は、アイデンティティープロバイダーのconsole-testクライアントのシークレット値に置き換えます。
オプション: 次のコマンドを実行して、プロバイダーの認証局バンドルを含む config map を作成します。
$ oc create configmap keycloak-oidc-ca --from-file=ca-bundle.crt=my-directory/ca-bundle.crt \1 -n openshift-config- 1
- プロバイダーの
ca-bundle.crtファイルへのパスを指定します。
次のコマンドを実行して認証設定を編集します。
$ oc edit authentication.config/clustertypeフィールドをOIDCに設定し、プロバイダーのoidcProvidersフィールドを設定し、webhookTokenAuthenticatorフィールドをnullに設定して、認証設定を更新します。apiVersion: config.openshift.io/v1 kind: Authentication metadata: # ... spec: oidcProviders:1 - claimMappings: groups: claim: groups2 prefix: 'oidc-groups-test:' username: claim: email3 prefixPolicy: Prefix prefix: prefixString: 'oidc-user-test:' issuer: audiences:4 - console-test - oc-cli-test issuerCertificateAuthority: name: keycloak-oidc-ca5 issuerURL: https://keycloak-keycloak.apps.example.com/realms/master6 name: 'keycloak-oidc-server'7 oidcClients: - clientID: oc-cli-test8 componentName: cli componentNamespace: openshift-console - clientID: console-test9 clientSecret: name: console-secret10 componentName: console componentNamespace: openshift-console type: OIDC11 webhookTokenAuthenticator: null12 - 1
- OIDC プロバイダーの設定。現在、OIDC プロバイダー設定は 1 つだけ許可されています。
- 2
- クラスターアイデンティティーのグループ名を構築するために使用されるクレームの名前。
- 3
- クラスターアイデンティティーのユーザー名を構築するために使用されるクレームの名前。
- 4
- この認証プロバイダーがトークンを発行するオーディエンスのリスト。
- 5
ca-bundle.crtキーが含まれる config map の名前。設定されていない場合は、代わりにシステム信頼が使用されます。- 6
- トークン発行者の URL。
- 7
- 外部 OIDC プロバイダーの名前。
- 8
- プロバイダーが OpenShift CLI (
oc) に使用するクライアント ID。 - 9
- プロバイダーが OpenShift Container Platform Web コンソールに使用するクライアント ID。
- 10
- コンソールクライアントのシークレット値を保存するシークレットの名前。
- 11
- 外部 OIDC アイデンティティープロバイダーを使用することを示すには、
OIDCに設定する必要があります。 - 12
typeがOIDCに設定されている場合はnullに設定する必要があります。
使用可能なすべてのパラメーターの詳細は、「OIDC プロバイダー設定パラメーター」を参照してください。
- 終了して変更を保存し、新しい設定を適用します。
クラスターが新しいリビジョンをすべてのノードにロールアウトするまで待ちます。
次のコマンドを実行して、Kubernetes API server Operator のステータスを確認します。
$ oc get co kube-apiserver出力例
NAME VERSION AVAILABLE PROGRESSING DEGRADED SINCE MESSAGE kube-apiserver 4.19.0 True True False 85m NodeInstallerProgressing: 2 node are at revision 8; 1 node is at revision 10前の例のメッセージは、1 つのノードが新しいリビジョンに進み、2 つのノードがまだ更新されていないことを示しています。クラスターのサイズによっては、新しいリビジョンをすべてのノードにロールアウトするのに 20 分以上かかる場合があります。
-
問題をトラブルシューティングするために、Cluster Authentication Operator と
kube-apiserverPod のログでエラーを確認することもできます。
検証
アイデンティティープロバイダーで認証して、OpenShift CLI (
oc) にログインできることを確認します。次のコマンドを実行してログインします。
$ oc login --exec-plugin=oc-oidc \1 --issuer-url=https://keycloak-keycloak.apps.example.com/realms/master \2 --client-id=oc-cli-test \3 --extra-scopes=email --callback-port=8080 \ --oidc-certificate-authority my-directory/ca-bundle.crt4 出力例
Please visit the following URL in your browser: http://localhost:8080- ブラウザーで http://localhost:8080 を開きます。
アイデンティティープロバイダーからの認証情報を使用して認証します。
認証に成功すると、ターミナルに次の出力のようなメッセージが表示されます。
Logged into "https://api.my-cluster.example.com:6443" as "oidc-user-test:user1@example.com" from an external oidc issuer.
アイデンティティープロバイダーで認証して、OpenShift Container Platform Web コンソールにログインできることを確認します。
ブラウザーでクラスターの Web コンソール URL を開きます。
ログインのために、アイデンティティープロバイダーにリダイレクトされます。
アイデンティティープロバイダーからの認証情報を使用して認証します。
正常にログインし、OpenShift Container Platform Web コンソールにリダイレクトされたことを確認します。
8.2.1. OIDC プロバイダーの設定パラメーター リンクのコピーリンクがクリップボードにコピーされました!
次の表には、直接認証に使用できるすべての OIDC プロバイダーパラメーターがリストされています。
| パラメーター | 説明 |
|---|---|
|
| Kubernetes API サーバーが、アイデンティティープロバイダーによって発行された JWT トークン内のクレームをクラスターアイデンティティーに変換するために使用するルールを設定します。 |
|
| クラスターアイデンティティーのグループが、アイデンティティープロバイダーによって発行された JWT トークン内のクレームから構築される方法を設定します。クレームの参照時にクレームが JWT トークン内に存在する場合、その値はグループのコンマ区切りリストである必要があります。 |
|
| このマッピングに関連付けられたクラスターアイデンティティーフィールドに値が割り当てられる JWT トークンクレームを設定します。 |
|
| JWT クレームをクラスターアイデンティティー属性にマッピングするプロセス中にクラスターアイデンティティー属性に適用される接頭辞を設定します。 |
|
| アイデンティティープロバイダーによって発行された JWT トークン内のクレームからクラスターアイデンティティーのユーザー名を構築する方法を設定します。 |
|
| このマッピングに関連付けられたクラスターアイデンティティーフィールドに値が割り当てられる JWT トークンクレームを設定します。 |
|
|
JWT クレームの値の先頭に追加する接頭辞を設定します。 |
|
|
JWT クレームをクラスターアイデンティティーユーザー名属性にマッピングするプロセス中にクラスターアイデンティティー属性に適用される接頭辞を設定します。空の文字列 ( |
|
|
省略すると、指定なしとみなされ、プラットフォームによって選択された接頭辞が適用されます。ただし、これは今後変更される可能性があります。
現時点では、クレームが |
|
|
アイデンティティープロバイダーによって発行された JWT トークン内のクレームを検証するために Kubernetes API サーバーが使用するルールを設定します。検証ルールは |
|
| Kubernetes API サーバーが、受信 JWT がこのアイデンティティープロバイダーに対して有効かどうかを検証するために使用する、必須のクレームと値を設定します。 |
|
|
必須クレームの名前を設定します。JWT クレームから取得する場合、クレームは文字列の値である必要があります。空の文字列 ( |
|
|
受信した JWT クレームから取得した場合に |
|
|
検証ルールのタイプを設定します。許可される値は
|
|
| プラットフォームがアイデンティティープロバイダーと対話する方法と、アイデンティティープロバイダーから発行されたトークンが Kubernetes API サーバーによって評価される方法を設定する必須フィールド。 |
|
|
アイデンティティープロバイダーによって発行される JWT トークンの発行先として許可されるオーディエンスを設定する必須フィールド。エントリーの少なくとも 1 つは、JWT トークンの |
|
|
Kubernetes API サーバーが使用する認証局を設定して、検出情報を取得するときにアイデンティティープロバイダーへの接続を検証します。指定しない場合は、システム信頼が使用されます。指定する場合は、config map の |
|
| 参照される config map の名前。 |
|
|
アイデンティティープロバイダーによってトークンを発行するために使用される URL を設定します。Kubernetes API サーバーは、JWT の |
|
|
アイデンティティープロバイダーに関連付けられた、人間が判読できる一意の識別子を設定する必須フィールド。複数のアイデンティティープロバイダーを区別するために使用され、トークンの検証や認証メカニズムには影響しません。空の文字列 ( |
|
| クラスター上のプラットフォームクライアントがアイデンティティープロバイダーからトークンを要求する方法を設定します。エントリーは 20 以下でなければならず、エントリーには一意の namespace/名前のペアが必要です。 |
|
|
プラットフォームコンポーネントがアイデンティティープロバイダーへの認証要求に使用する、アイデンティティープロバイダーからのクライアント ID を設定します。プラットフォームコンポーネントがアイデンティティープロバイダーを認証モードとして使用するためには、アイデンティティープロバイダーがこの識別子を受け入れる必要があります。空の文字列 ( |
|
| アイデンティティープロバイダーへの認証要求を行うときにプラットフォームコンポーネントによって使用されるクライアントシークレットを設定します。 指定しない場合、アイデンティティープロバイダーへの認証要求時にクライアントシークレットは使用されません。
指定すると、 パブリッククライアントにクライアントシークレットは必要ありませんが、プライベートクライアントにはアイデンティティープロバイダーと連携するためにクライアントシークレットが必要です。 |
|
| 参照されるシークレットの名前。 |
|
|
認証モードとしてアイデンティティープロバイダーを使用するように設定されているプラットフォームコンポーネントの名前を指定します。一意の識別子として、 |
|
|
認証モードとしてアイデンティティープロバイダーを使用するように設定されているプラットフォームコンポーネントが実行されている namespace を指定します。一意の識別子として、 |
|
| アイデンティティープロバイダーへの認証要求を行うときに、プラットフォームコンポーネントによって要求される追加のスコープを設定します。標準の OIDC スコープを超えて特定のスコープを要求するクレームマッピングを設定した場合に役立ちます。省略すると、追加のスコープは要求されません。 |