5.10. トークン認証
5.10.1. クラウドプロバイダー上の Operator のトークン認証 リンクのコピーリンクがクリップボードにコピーされました!
多くのクラウドプロバイダーは、短期的で権限が限定されたセキュリティー認証情報を提供するアカウントトークンを使用して認証を有効にできます。
					OpenShift Container Platform には、クラウドプロバイダーの認証情報をカスタムリソース定義 (CRD) として管理するための Cloud Credential Operator (CCO) が含まれています。CCO は CredentialsRequest カスタムリソース (CR) と同期して、OpenShift Container Platform コンポーネントが必要な特定のパーミッションを持つクラウドプロバイダーの認証情報をリクエストできるようにします。
				
以前は、CCO が 手動モード のクラスターでは、Operator Lifecycle Manager (OLM) によって管理される Operator が、ユーザーが必要なクラウド認証情報を手動でプロビジョニングする方法に関する詳細な手順を OperatorHub に提供することがよくありました。
OpenShift Container Platform 4.14 以降、CCO は、特定のクラウドプロバイダーで短期認証情報の使用が有効になっているクラスター上で CCO が実行していることを検出できるようになりました。その後、Operator の作成者が Operator が更新された CCO をサポートできるようにしている場合は、特定の認証情報のプロビジョニングを半自動化できます。
5.10.2. AWS STS を使用した OLM 管理 Operator 向けの CCO ベースのワークフロー リンクのコピーリンクがクリップボードにコピーされました!
AWS 上で実行している OpenShift Container Platform クラスターが Security Token Service (STS) モードである場合、クラスターは AWS と OpenShift Container Platform の機能を利用して、アプリケーションレベルで IAM ロールを使用していることを意味します。STS を使用すると、アプリケーションは IAM ロールを引き受けることができる JSON Web トークン (JWT) を提供できます。
					JWT には、サービスアカウントに一時的に許可されるパーミッションを許可する sts:AssumeRoleWithWebIdentity IAM アクションの Amazon Resource Name (ARN) が含まれています。JWT には、AWS IAM が検証できる ProjectedServiceAccountToken の署名キーが含まれています。署名されたサービスアカウントトークン自体は、AWS ロールを引き受けるために必要な JWT として使用されます。
				
Cloud Credential Operator (CCO) は、クラウドプロバイダー上で実行している OpenShift Container Platform クラスターにデフォルトでインストールされる Cluster Operator です。CCO は STS のために次の機能を提供します。
- STS が有効なクラスター上で実行していることを検出します
 - 
							Operator に AWS リソースへのアクセスを許可するために必要な情報を提供する 
CredentialsRequestオブジェクト内のフィールドの存在を確認します。 
					CCO は、手動モードの場合でもこの検出を実行します。適切に設定されている場合、CCO は必要なアクセス情報を含む Secret オブジェクトを Operator namespace に投影します。
				
					OpenShift Container Platform 4.14 以降、CCO は、STS ワークフローに必要な情報を含む Secrets の作成を要求できる CredentialsRequest オブジェクトの使用を拡張することで、このタスクを半自動化できるようになりました。ユーザーは、Web コンソールまたは CLI から Operator をインストールするときにロール ARN を指定できます。
				
更新前に権限の変更が必要になる可能性があるため、自動更新承認のあるサブスクリプションは推奨できません。手動更新承認付きのサブスクリプションにより、管理者は新しいバージョンの権限を確認し、更新前に必要な手順を実行する機会が確保されます。
					OpenShift Container Platform 4.14 以降の更新された CCO と一緒に使用するために Operator を準備する Operator 作成者は、STS トークン認証の処理に加えて、ユーザーに指示し、以前の CCO バージョンからの相違を処理するコードを追加する必要があります (Operator がまだ STS 未対応の場合)。推奨される方法は、正しく入力された STS 関連フィールドを含む CredentialsRequest オブジェクトを提供し、CCO に Secret を作成させることです。
				
						バージョン 4.14 より前の OpenShift Container Platform クラスターをサポートする予定がる場合は、CCO ユーティリティー (ccoctl) を使用して STS 対応情報を含むシークレットを手動で作成する方法をユーザーに提供することを検討してください。以前の CCO バージョンはクラスター上の STS モードを認識しないため、シークレットを作成できません。
					
コードでは、決して表示されないシークレットをチェックし、提供したフォールバック手順に従うようにユーザーに警告する必要があります。詳細は、「代替方法」サブセクションを参照してください。
5.10.2.1. Operator が AWS STS を使用した CCO ベースのワークフローをサポートできるようにする リンクのコピーリンクがクリップボードにコピーされました!
Operator Lifecycle Manager (OLM) で実行するプロジェクトを設計する Operator 作成者は、Cloud Credential Operator (CCO) をサポートするようにプロジェクトをカスタマイズすることで、STS 対応の OpenShift Container Platform クラスター上で Operator が AWS に対して認証できるようにすることができます。
						このメソッドでは、Operator が CredentialsRequest オブジェクトの作成を担当します。つまり、Operator がこれらのオブジェクトを作成するには RBAC 権限が必要です。次に、Operator は、結果として得られる Secret オブジェクトを読み取ることができなければなりません。
					
							デフォルトでは、Operator デプロイメントに関連する Pod は、結果として得られる Secret オブジェクトでサービスアカウントトークンを参照できるように、serviceAccountToken ボリュームをマウントします。
						
前提条件
- OpenShift Container Platform 4.14 以降
 - STS モードのクラスター
 - OLM ベースの Operator プロジェクト
 
手順
Operator プロジェクトの
ClusterServiceVersion(CSV) オブジェクトを更新します。Operator が
CredentialsRequestsオブジェクトを作成する RBAC 権限を持っていることを確認します。例5.15
clusterPermissionsリストの例Copy to Clipboard Copied! Toggle word wrap Toggle overflow AWS STS を使用したこの CCO ベースのワークフロー方式のサポートを要求するために、次のアノテーションを追加します。
# ... metadata: annotations: features.operators.openshift.io/token-auth-aws: "true"
# ... metadata: annotations: features.operators.openshift.io/token-auth-aws: "true"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 
Operator プロジェクトコードを更新します。
Subscriptionオブジェクトによって Pod に設定された環境変数からロール ARN を取得します。以下に例を示します。// Get ENV var roleARN := os.Getenv("ROLEARN") setupLog.Info("getting role ARN", "role ARN = ", roleARN) webIdentityTokenPath := "/var/run/secrets/openshift/serviceaccount/token"// Get ENV var roleARN := os.Getenv("ROLEARN") setupLog.Info("getting role ARN", "role ARN = ", roleARN) webIdentityTokenPath := "/var/run/secrets/openshift/serviceaccount/token"Copy to Clipboard Copied! Toggle word wrap Toggle overflow パッチを適用して適用できる
CredentialsRequestオブジェクトがあることを確認してください。以下に例を示します。例5.16
CredentialsRequestオブジェクトの作成例Copy to Clipboard Copied! Toggle word wrap Toggle overflow あるいは、YAML 形式の
CredentialsRequestオブジェクトから開始している場合 (たとえば、Operator プロジェクトコードの一部として)、別の方法で処理することもできます。例5.17 YAML フォームでの
CredentialsRequestオブジェクト作成の例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記CredentialsRequestオブジェクトを Operator バンドルに追加することは現在サポートされていません。ロール ARN と Web ID トークンパスを認証情報リクエストに追加し、Operator の初期化中に適用します。
例5.18 Operator の初期化中に
CredentialsRequestオブジェクトを適用する例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次の例に示すように、Operator が CCO から
Secretオブジェクトが表示されるのを待機できるようにします。これは、Operator で調整している他の項目とともに呼び出されます。例5.19
Secretオブジェクトを待機する例Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
 timeout値は、CCO が追加されたCredentialsRequestオブジェクトを検出してSecretオブジェクトを生成する速度の推定に基づいています。Operator がまだクラウドリソースにアクセスしていない理由を疑問に思っているクラスター管理者のために、時間を短縮するか、カスタムフィードバックを作成することを検討してください。
認証情報リクエストから CCO によって作成されたシークレットを読み取り、そのシークレットのデータを含む AWS 設定ファイルを作成することで、AWS 設定をセットアップします。
例5.20 AWS 設定の作成例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重要シークレットは存在すると想定されますが、このシークレットを使用する場合、CCO がシークレットを作成する時間を与えるために、Operator コードは待機して再試行する必要があります。
さらに、待機期間は最終的にタイムアウトになり、OpenShift Container Platform クラスターのバージョン、つまり CCO が、STS 検出による
CredentialsRequestオブジェクトのワークフローをサポートしていない以前のバージョンである可能性があることをユーザーに警告します。このような場合は、別の方法を使用してシークレットを追加する必要があることをユーザーに指示します。AWS SDK セッションを設定します。以下に例を示します。
例5.21 AWS SDK セッション設定の例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 
5.10.2.2. ロールの指定 リンクのコピーリンクがクリップボードにコピーされました!
Operator の説明には、インストール前に作成する必要があるロールの詳細を、理想的には管理者が実行できるスクリプトの形式で含める必要があります。以下に例を示します。
例5.22 ロール作成スクリプトの例
5.10.2.3. トラブルシューティング リンクのコピーリンクがクリップボードにコピーされました!
5.10.2.3.1. 認証失敗 リンクのコピーリンクがクリップボードにコピーされました!
認証が成功しなかった場合は、Operator に提供されたトークンを使用して、Web ID でロールを引き受けることができることを確認してください。
手順
Pod からトークンを抽出します。
oc exec operator-pod -n <namespace_name> \ -- cat /var/run/secrets/openshift/serviceaccount/token$ oc exec operator-pod -n <namespace_name> \ -- cat /var/run/secrets/openshift/serviceaccount/tokenCopy to Clipboard Copied! Toggle word wrap Toggle overflow Pod からロール ARN を抽出します。
oc exec operator-pod -n <namespace_name> \ -- cat /<path>/<to>/<secret_name>$ oc exec operator-pod -n <namespace_name> \ -- cat /<path>/<to>/<secret_name>1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
 - パスに root を使用しないでください。
 
Web ID トークンを使用してロールを引き受けてみます。
aws sts assume-role-with-web-identity \ --role-arn $ROLEARN \ --role-session-name <session_name> \ --web-identity-token $TOKEN$ aws sts assume-role-with-web-identity \ --role-arn $ROLEARN \ --role-session-name <session_name> \ --web-identity-token $TOKENCopy to Clipboard Copied! Toggle word wrap Toggle overflow 
5.10.2.3.2. Secret が正しくマウントされていない リンクのコピーリンクがクリップボードにコピーされました!
							非 root ユーザーとして実行する Pod は、デフォルトで AWS 共有認証情報ファイルが存在すると想定される /root ディレクトリーに書き込むことができません。シークレットが AWS 認証情報ファイルのパスに正しくマウントされていない場合は、シークレットを別の場所にマウントし、AWS SDK で共有認証情報ファイルオプションを有効にすることを検討してください。
						
5.10.2.4. 代替方法 リンクのコピーリンクがクリップボードにコピーされました!
						Operator 作成者向けの代替方法として、Operator をインストールする前に、ユーザーが Cloud Credential Operator (CCO) の CredentialsRequest オブジェクトを作成する責任があることを示すことができます。
					
Operator の指示では、ユーザーに次のことを示す必要があります。
- 
								手順に YAML をインラインで指定するか、ユーザーにダウンロード場所を示すことで、
CredentialsRequestオブジェクトの YAML バージョンを提供します。 - 
								ユーザーに 
CredentialsRequestオブジェクトを作成するように指示します。 
						OpenShift Container Platform 4.14 以降では、適切な STS 情報が追加された CredentialsRequest オブジェクトがクラスター上に表示されると、Operator は CCO が生成した Secret を読み取るか、クラスターサービスバージョン (CSV) でマウントを定義してマウントすることができます。
					
OpenShift Container Platform の以前のバージョンでは、Operator の指示でユーザーに次のことも示す必要があります。
- 
								CCO ユーティリティー (
ccoctl) を使用して、CredentialsRequestオブジェクトからSecretYAML オブジェクトを生成します。 - 
								
Secretオブジェクトを適切な namespace のクラスターに適用します。 
Operator は、クラウド API と通信するために、結果として得られるシークレットを利用できる必要があります。この場合、シークレットは Operator がインストールされる前にユーザーによって作成されるため、Operator は次のいずれかを実行できます。
- 
								CSV 内の 
Deploymentオブジェクトで明示的なマウントを定義します。 - 
								推奨される「AWS STS を使用して Operator が CCO ベースのワークフローをサポートできるようにする」方法に示すように、API サーバーからプログラムで 
Secretオブジェクトを読み取ります。 
5.10.3. Microsoft Entra Workload ID を使用した OLM 管理 Operator 向けの CCO ベースのワークフロー リンクのコピーリンクがクリップボードにコピーされました!
Azure 上で実行されている OpenShift Container Platform クラスターが Workload Identity/Federated Identity モードである場合、そのクラスターは、Azure と OpenShift Container Platform の機能を利用して、Microsoft Entra Workload ID の ユーザー割り当てマネージド ID または アプリケーション登録 をアプリケーションレベルで適用しています。
Cloud Credential Operator (CCO) は、クラウドプロバイダー上で実行している OpenShift Container Platform クラスターにデフォルトでインストールされる Cluster Operator です。OpenShift Container Platform 4.14.8 以降、CCO は Workload ID を使用した OLM 管理 Operator のワークフローをサポートします。
CCO は Workload ID のために次の機能を提供します。
- Workload ID 対応のクラスターで実行しているかどうかを検出します
 - 
							Operator に Azure リソースへのアクセスを許可するために必要な情報を提供する 
CredentialsRequestオブジェクト内のフィールドの存在を確認します。 
					CCO は、CredentialsRequest オブジェクトの使用を拡張することで、このプロセスを半自動化できます。このオブジェクトにより、Workload ID ワークフローに必要な情報を含む Secrets の作成を要求できます。
				
更新前に権限の変更が必要になる可能性があるため、自動更新承認のあるサブスクリプションは推奨できません。手動更新承認付きのサブスクリプションにより、管理者は新しいバージョンの権限を確認し、更新前に必要な手順を実行する機会が確保されます。
					Operator 作成者は、OpenShift Container Platform 4.14 以降の更新された CCO と一緒に使用する Operator を準備する際に、Workload ID トークン認証への対処 (Operator がまだ未対応の場合) に加えて、ユーザーに指示し、以前の CCO バージョンからの相違を処理するコードを追加する必要があります。推奨される方法は、正しく入力された Workload ID 関連フィールドを含む CredentialsRequest オブジェクトを提供し、CCO に Secret オブジェクトを作成させることです。
				
						バージョン 4.14 より前の OpenShift Container Platform クラスターをサポートする予定がる場合は、CCO ユーティリティー (ccoctl) を使用して Workload ID 対応情報を含むシークレットを手動で作成する方法をユーザーに提供することを検討してください。以前の CCO バージョンはクラスター上の Workload ID モードを認識しないため、シークレットを作成できません。
					
コードでは、決して表示されないシークレットをチェックし、提供したフォールバック手順に従うようにユーザーに警告する必要があります。
Workload ID による認証には次の情報が必要です。
- 
							
azure_client_id - 
							
azure_tenant_id - 
							
azure_region - 
							
azure_subscription_id - 
							
azure_federated_token_file 
					クラスター管理者は、Web コンソールの Install Operator ページを使用してこの情報をインストール時に提供できます。その場合、この情報は、Operator Pod の環境変数として Subscription オブジェクトに伝播されます。
				
5.10.3.1. Operator が Microsoft Entra Workload ID を使用した CCO ベースのワークフローをサポートできるようにする リンクのコピーリンクがクリップボードにコピーされました!
Operator 作成者は、Operator Lifecycle Manager (OLM) で実行するプロジェクトを設計する際に、Cloud Credential Operator (CCO) をサポートするようにプロジェクトをカスタマイズすることで、Microsoft Entra Workload ID 対応の OpenShift Container Platform クラスターに対して Operator が認証できるようにすることができます。
						このメソッドでは、Operator が CredentialsRequest オブジェクトの作成を担当します。つまり、Operator がこれらのオブジェクトを作成するには RBAC 権限が必要です。次に、Operator は、結果として得られる Secret オブジェクトを読み取ることができなければなりません。
					
							デフォルトでは、Operator デプロイメントに関連する Pod は、結果として得られる Secret オブジェクトでサービスアカウントトークンを参照できるように、serviceAccountToken ボリュームをマウントします。
						
前提条件
- OpenShift Container Platform 4.14 以降
 - Workload ID モードのクラスター
 - OLM ベースの Operator プロジェクト
 
手順
Operator プロジェクトの
ClusterServiceVersion(CSV) オブジェクトを更新します。Operator が
CredentialsRequestsオブジェクトを作成する RBAC 権限を持っていることを確認します。例5.23
clusterPermissionsリストの例Copy to Clipboard Copied! Toggle word wrap Toggle overflow Workload ID を使用したこの CCO ベースのワークフロー方式のサポートを要求するために、次のアノテーションを追加します。
# ... metadata: annotations: features.operators.openshift.io/token-auth-azure: "true"
# ... metadata: annotations: features.operators.openshift.io/token-auth-azure: "true"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 
Operator プロジェクトコードを更新します。
Subscriptionオブジェクトによって Pod に設定された環境変数からクライアント ID、テナント ID、およびサブスクリプション ID を取得します。以下に例を示します。// Get ENV var clientID := os.Getenv("CLIENTID") tenantID := os.Getenv("TENANTID") subscriptionID := os.Getenv("SUBSCRIPTIONID") azureFederatedTokenFile := "/var/run/secrets/openshift/serviceaccount/token"// Get ENV var clientID := os.Getenv("CLIENTID") tenantID := os.Getenv("TENANTID") subscriptionID := os.Getenv("SUBSCRIPTIONID") azureFederatedTokenFile := "/var/run/secrets/openshift/serviceaccount/token"Copy to Clipboard Copied! Toggle word wrap Toggle overflow パッチを適用して適用できる
CredentialsRequestオブジェクトがあることを確認してください。注記CredentialsRequestオブジェクトを Operator バンドルに追加することは現在サポートされていません。Azure 認証情報と Web ID トークンパスを認証情報リクエストに追加し、Operator の初期化中に適用します。
例5.24 Operator の初期化中に
CredentialsRequestオブジェクトを適用する例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次の例に示すように、Operator が CCO から
Secretオブジェクトが表示されるのを待機できるようにします。これは、Operator で調整している他の項目とともに呼び出されます。例5.25
Secretオブジェクトを待機する例Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
 timeout値は、CCO が追加されたCredentialsRequestオブジェクトを検出してSecretオブジェクトを生成する速度の推定に基づいています。Operator がまだクラウドリソースにアクセスしていない理由を疑問に思っているクラスター管理者のために、時間を短縮するか、カスタムフィードバックを作成することを検討してください。
- 
										CCO によって作成されたシークレットを 
CredentialsRequestオブジェクトから読み取り、Azure で認証して、必要な認証情報を受け取ります。