1. はじめに
ROSA HCPのクラスターを作成する際、CLIでOIDCプロバイダーを設定する手順があります。
OIDCプロバイダーとはどういう働きをするもので、ROSA HCPクラスター作成時にOIDCプロバイダーの設定がなぜ必要なのか、初学者である筆者は理解するのに苦労したため、備忘録もかねて当記事を執筆しました。
※この記事の内容は2024年12月現在の情報であり、下記の製品リリースに基づいています。
Red Hat OpenShift Service on AWS with Hosted Control Planes v4.14.37
2. 目次
3. ROSA HCPにOIDCプロバイダーの設定がなぜ必要なのか
3.1. 前提としてROSA HCPはSTSによる一時認証方式を使用する
- ROSA HCPでは、AWSアカウント内のリソースを管理する権限をRed Hat SREチームや、クラスター内のコンポーネント(Operator)に付与するために、AWS STS(Security Token Service)を使用します。
- こちらについては、わたしが書いた以下の記事も参考にしていただければと思います。
ROSA HCPのAccountロールとOperatorロールについて - STSは、IAMロールの信頼ポリシーの内容を検証し、信頼ポリシーに記載されたプリンシパルからのリクエストの場合のみ、認証情報を発行します。
- しかし、信頼ポリシーのプリンシパルとして指定できるのはIAMエンティティのみであり、クラスター内のOperatorは信頼ポリシー内で直接指定することができません。例えば「このPodだけがS3にアクセスできる」という設定は、STSだけでは実現できません。
- そこで活躍するのが、OIDCプロバイダーです。OIDCプロバイダーを導入することで、クラスター内のOperatorがIAMロールを引き受けられるようになります。
3.2. OIDCプロバイダーの働き
- OIDCプロバイダーは認証にJWT(JSON Web Token)を使用します。
- このJWTには、「誰がどのロールを引き受ける権限を持っているか」という情報が含まれています。この際の「誰が」の部分には、OperetorないしはPodも含めることができます。
- IAMロールの信頼ポリシーに、「このOIDCプロバイダーから発行されたトークンを信頼する」という設定を含めれば、OIDCとSTSが連携してIAMエンティティ以外のコンポーネントにも一時的な認証情報を付与することができます。
4. OIDCプロバイダーとAWS STSがどのように連携して認証を行うか
- 本項目では、OIDCプロバイダーとAWS STSが連携して、一時的なセキュリティ認証情報をROSAクラスター内のOperetarに与える際のざっくりとしたワークフローを説明します。
※ROSA公式ドキュメント内のROSA with HCP ワークフローに記載の内容をもとにまとめております。より正確な情報を知りたい方はこちらを参照してください。-
事前準備として、認証情報を与えたいOperetorに必要な権限が定義されたIAMロールをこちらで割り当てます。
- ROSA HCPクラスターの場合、クラスター作成時の手順としてCLIで「オペレーターロール」作成用のコマンドを実行する必要があります。コマンドを実行すると自動で8つのIAMロールが作成され、AWS管理ポリシーがアタッチされます。
- この「オペレーターロール」こそが、Operetorに必要な権限が定義されたIAMロールです。
-
Operatorが、クラスター内で設定されたOIDCプロバイダーに対して、JWT(JSON Web Token)を送信します。
- OIDCプロバイダーは、このトークンが正しいものであるかを確認します。
-
OIDCプロバイダーがIAMロールを確認します。
- トークンに含まれる情報が、IAMロールの信頼ポリシーに記載された条件と一致するかをOIDCプロバイダーが確認します。
-
OIDCがトークンを承認すると、STSが一時的な認証情報を払い出します。
- OIDCプロバイダーはトークンを承認すると、その情報を元にsts:AssumeRoleWithWebIdentity APIを呼び出します。
- AWS STSは、そのIAMロールに基づいて、一時的な認証情報(アクセスキー、シークレットキー、セッショントークン)を生成し、Operatorに返します。
-
OperatorがAWSリソースにアクセスします。
- Operatorは、受け取った一時的な認証情報を使用して、AWSリソースにアクセスし、必要なタスクを実行します。
- 認証情報は有効期限(通常1時間以内)が切れると無効になります。必要になったら、再度トークンを取得します。
-
事前準備として、認証情報を与えたいOperetorに必要な権限が定義されたIAMロールをこちらで割り当てます。
- より簡単にまとめると、以下のような流れになります。
- Operator → OIDCプロバイダーにJWTを送信。
- OIDCプロバイダー → トークンを検証し、ロールの使用を承認。
- OIDCプロバイダー → STSにリクエストを送信(AssumeRoleWithWebIdentity)。
- STS → 一時的な認証情報を生成してOperatorに提供。
- Operator → 認証情報を使ってAWSリソースにアクセス。
5. まとめ
OIDCプロバイダーは、クラスター内のOperatorとAWS IAMロールを安全に連携させるために必要な仕組みです。STSだけではAWSのIAMエンティティ以外のコンポーネント対して権限を付与することが困難であるため、OIDCプロバイダーを使用します。