8.2. 直接認証に使用する外部 OIDC アイデンティティープロバイダーの設定
認証用のトークン発行に外部 OIDC アイデンティティープロバイダーを直接使用するように OpenShift Container Platform を設定できます。
前提条件
外部認証プロバイダーを設定した。
この手順では、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: type: OIDC1 webhookTokenAuthenticator: null2 oidcProviders:3 - claimMappings: extra:4 - key: example.com/role valueExpression: claims.?role.orValue("unknown") groups: claim: groups5 prefix: 'oidc-groups-test:' uid:6 claim: "sub" username: claim: email7 prefixPolicy: Prefix prefix: prefixString: 'oidc-user-test:' issuer: audiences:8 - console-test - oc-cli-test issuerCertificateAuthority: name: keycloak-oidc-ca9 issuerURL: https://keycloak-keycloak.apps.example.com/realms/master10 name: 'keycloak-oidc-server'11 oidcClients: - clientID: oc-cli-test12 componentName: cli componentNamespace: openshift-console - clientID: console-test13 clientSecret: name: console-secret14 componentName: console componentNamespace: openshift-console extraScopes:15 - email - profile- 1
- 外部 OIDC アイデンティティープロバイダーを使用することを示すには、
OIDCに設定する必要があります。 - 2
typeがOIDCに設定されている場合はnullに設定する必要があります。- 3
- OIDC プロバイダーの設定。現在、OIDC プロバイダー設定は 1 つだけ許可されています。
- 4
- クラスターアイデンティティーの追加属性の構築に使用されるマッピングを設定するためのオプションフィールド。
- 5
- クラスターアイデンティティーのグループ名を構築するために使用されるクレームの名前。
- 6
- クラスターアイデンティティーの uid の構築に使用されるクレームマッピングを設定するためのオプションフィールド。
- 7
- クラスターアイデンティティーのユーザー名を構築するために使用されるクレームの名前。
- 8
- この認証プロバイダーがトークンを発行するオーディエンスのリスト。
- 9
ca-bundle.crtキーが含まれる config map の名前。設定されていない場合は、代わりにシステム信頼が使用されます。- 10
- トークン発行者の URL。
- 11
- 外部 OIDC プロバイダーの名前。
- 12
- プロバイダーが OpenShift CLI (
oc) に使用するクライアント ID。 - 13
- プロバイダーが OpenShift Container Platform Web コンソールに使用するクライアント ID。
- 14
- コンソールクライアントのシークレット値を保存するシークレットの名前。
- 15
- 要求する追加のスコープ。GitLab などの一部のプロバイダーでは、Web コンソールから適切にログインするために追加のスコープが必要になる場合があります。
使用可能なすべてのパラメーターの詳細は、「OIDC プロバイダー設定パラメーター」を参照してください。
- 終了して変更を保存し、新しい設定を適用します。
クラスターが新しいリビジョンをすべてのノードにロールアウトするまで待ちます。
次のコマンドを実行して、Kubernetes API server Operator のステータスを確認します。
$ oc get co kube-apiserver出力例
NAME VERSION AVAILABLE PROGRESSING DEGRADED SINCE MESSAGE kube-apiserver 4.20.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 サーバーが、アイデンティティープロバイダーによって発行された JSON web token (JWT) 内のクレームをクラスターアイデンティティーに変換するために使用するルールを設定します。 |
|
| クラスターアイデンティティーの追加属性の構築に使用されるマッピングを設定するためのオプションフィールド。省略すると、クラスターアイデンティティーに追加の属性は存在しなくなります。追加マッピングのキー値は一意である必要があります。最大 32 個の追加属性マッピングを提供できます。 |
|
| 追加属性キーとして使用する文字列を指定する必須フィールド。以下の制限が適用されます。
|
|
|
JWT トークンのクレームから追加の属性値を抽出する CEL 式を指定するための必須フィールド。
|
|
| クラスターアイデンティティーのグループが、アイデンティティープロバイダーによって発行された JWT トークン内のクレームから構築される方法を設定します。クレームの参照時にクレームが JWT トークン内に存在する場合、その値はグループのコンマ区切りリストである必要があります。 |
|
| このマッピングに関連付けられたクラスターアイデンティティーフィールドに値が割り当てられる JWT トークンクレームを設定します。 |
|
| JWT クレームをクラスターアイデンティティー属性にマッピングするプロセス中にクラスターアイデンティティー属性に適用される接頭辞を設定します。 |
|
|
クラスターアイデンティティーの UID の構築に使用されるクレームマッピングを設定するためのオプションフィールド。省略すると、ユーザーによる指定なしとみなされ、プラットフォームによってデフォルトが選択されます。デフォルトは、今後変更される可能性があります。現在のデフォルトでは、 |
|
|
マッピングで使用される JWT トークン要求を指定するためのオプションフィールド。このクレームの値は、このマッピングが関連付けられているフィールドに割り当てられます。クレームを指定するには、
|
|
|
JWT トークンクレームから文字列値を生成する CEL 式を指定するためのオプションフィールド。
CEL 式は、CEL 変数
|
|
| アイデンティティープロバイダーによって発行された 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 スコープを超えて特定のスコープを要求するクレームマッピングを設定した場合に役立ちます。省略すると、追加のスコープは要求されません。 |