ROSA HCPのAccountロールとOperatorロールについて

# 1. はじめに
ROSA HCPのクラスターを作成する際、CLIでアカウントロールとオペレーターロールというIAMロールを作成する手順があります。
これらのロールがなぜ必要なのか、また、これらのロールの中身（実際にどのようなプリンシパルに対して、どのような操作を許可しているのか）について、ドキュメントから情報を集めるのに苦労したため、ざっくりとでもまとめられればと思いこの記事を執筆しました。

※この記事の内容は2024年12月現在の情報であり、下記の製品リリースに基づいています。
Red Hat OpenShift Service on AWS with Hosted Control Planes v4.14.37

# 2. 目次
- [1. はじめに](#1-はじめに)
- [2. 目次](#2-目次)
- [3. そもそも、これらのロールは何者なのか](#3-そもそもこれらのロールは何者なのか)
  - [3.1. そもそも、AWS STS(Security Token Service)とは](#31-そもそもaws-stssecurity-token-serviceとは)
  - [3.2. ROSA HCPとSTS](#32-rosa-hcpとsts)
- [4. 作成されるIAMロール一覧](#4-作成されるiamロール一覧)
  - [4.1. Accountロール](#41-accountロール)
  - [4.2. Operatorロール](#42-operatorロール)
- [5. それぞれのIAMロールに紐づいているポリシーの内容](#5-それぞれのiamロールに紐づいているポリシーの内容)
  - [5.1 Accountロール](#51-accountロール)
    - [5.1.1. ManagedOpenShift-Installer-Role](#511-managedopenshift-installer-role)
    - [5.1.2. ManagedOpenShift-Worker-Role](#512-managedopenshift-worker-role)
    - [5.1.3. ManagedOpenShift-Support-Role](#513-managedopenshift-support-role)
  - [5.2. Operatorロール](#52-operatorロール)
    - [5.2.1. \< prefix \>-kube-system-capa-controller-manager](#521--prefix--kube-system-capa-controller-manager)
    - [5.2.2. \< prefix \>-kube-system-control-plane-operator](#522--prefix--kube-system-control-plane-operator)
    - [5.2.3. \< prefix \>-kube-system-kms-provider](#523--prefix--kube-system-kms-provider)
    - [5.2.4. \< prefix \>-kube-system-kube-controller-manager](#524--prefix--kube-system-kube-controller-manager)
    - [5.2.5. \< prefix \>-openshift-cloud-network-config-controller-cloud-credenti](#525--prefix--openshift-cloud-network-config-controller-cloud-credenti)
    - [5.2.6. \< prefix \>-openshift-cluster-csi-drivers-ebs-cloud-credentials](#526--prefix--openshift-cluster-csi-drivers-ebs-cloud-credentials)
    - [5.2.7. \< prefix \>-openshift-image-registry-installer-cloud-credentials](#527--prefix--openshift-image-registry-installer-cloud-credentials)
    - [5.2.8. \< prefix \>-openshift-ingress-operator-cloud-credentials](#528--prefix--openshift-ingress-operator-cloud-credentials)

# 3. そもそも、これらのロールは何者なのか
一言でいうと、AWSアカウント内のリソースを管理する権限をRed Hatアカウントや、クラスター内で特定のタスクを実行するコンポーネント（Operator）に付与するためのものです。
この権限付与は、AWS STS（Security Token Service）とIAMロールを使用して行われます。それに使用されるIAMロールです。
## 3.1. そもそも、AWS STS(Security Token Service)とは
- STSは、AWSリソースにアクセスするのための一時的なセキュリティ認証情報を発行するサービスです。
- STSとIAMロールは密接に連携して動作します。STSは、一時的な認証情報を発行する役割を担い、IAMロールはその認証情報がアクセスできる権限範囲を管理します。
  - IAMロールには以下の2つのポリシーが紐づいており、それによって各プリンシパルのAWSリソースへのアクセス権限を制御しています。
    1. アクセス許可ポリシー：このポリシーは、ロールを使用した際に、**どのAWSリソースに対してどのアクションを実行できるかを定義**します（例：S3の特定のバケットに書き込み許可を付与するなど）。
    2. 信頼ポリシー：このポリシーは、ロールを**引き受ける（AssumeRole）ことを許可するエンティティ（例：ユーザー、サービス、または別のAWSアカウント）を定義**します。STSがロールの引き受けを許可するかどうかの検証は、こちらのポリシーをもとに行われます。
- STSのワークフローは大雑把に書くと以下の通りです。
  1. まず、リクエスト元（ユーザー、サービス、またはOIDCプロバイダー）はAWSリソースへのアクセスが必要な際、`AssumeRole`や`GetSessionToken`などのSTS APIを呼び出します。このとき、STS APIリクエストには、引き受けたいIAMロールの情報やその他必要なパラメータが含まれます。
  2. STSは、リクエストされたIAMロールの**信頼ポリシー**を確認し、以下の２点を確認します。
      - リクエスト元（ユーザー、サービス、または外部IDプロバイダー）がそのIAMロールを引き受ける権限を持っているか。
      - 信頼ポリシーの条件（IPアドレス、リクエスト元のAWSアカウント、MFAの使用など）が満たされているか。
  3. STSは、信頼ポリシーの検証が成功すると、一時的な認証情報を生成して、リクエスト元に返します。この一時的な認証情報は、以下の３つの要素で構成されています。
      - アクセスキーID
      - シークレットアクセスキー
      - セッショントークン
  
## 3.2. ROSA HCPとSTS
- ROSA HCPのクラスター作成時にCLIで作成する「アカウントロール」と「オペレーターロール」は、Red Hat Site Reliability Engineering（SRE）サポートチームや、クラスター内のコンポーネント（Operator）に対して、AWSアカウント内のリソースを管理する権限を与えるためのIAMロールです。リクエスト元と実行するタスクの種類ごとに分割されており、**アカウントロールは計３つ、オペレーターロールは計8つ**あります。
- アカウントロールとオペレーターロールの違いは以下の通りと認識しています。
  - アカウントロールはクラスターを作成するアカウントごとに１つ必要なIAMロールです。RedHatアカウントやEC2インスタンスがロールの引き受け先となっており、**クラスターの作成や監視などのタスクに使用**されます。
  - 一方オペレーターロールはクラスターごとに１つ必要なIAMロールです。引き受けるのは、クラスター内のOperatorです。**ストレージやクラウドプロバイダーの認証情報、クラスターへのアクセス管理など様々なタスク**に使用されます。
- 実際に「アカウントロール」と「オペレーターロール」が作成されるときの内部的な挙動については、公式ドキュメントに図を交えて分かりやすく書いてありましたのでご参照ください。
[ROSA with HCP ワークフロー](https://docs.redhat.com/ja/documentation/red_hat_openshift_service_on_aws/4/html-single/about/index#hcp-sts-process)


# 4. 作成されるIAMロール一覧
以下が、実際に作成されるロール一覧です。
## 4.1. Accountロール
- ManagedOpenShift-Installer-Role
- ManagedOpenShift-Worker-Role
- ManagedOpenShift-Support-Role

## 4.2. Operatorロール
- < prefix >-kube-system-capa-controller-manager                       
- < prefix >-kube-system-control-plane-operator                        
- < prefix >-kube-system-kms-provider                                  
- < prefix >-kube-system-kube-controller-manager                       
- < prefix >-openshift-cloud-network-config-controller-cloud-credenti  
- < prefix >-openshift-cluster-csi-drivers-ebs-cloud-credentials       
- < prefix >-openshift-image-registry-installer-cloud-credentials  
- < prefix >-openshift-ingress-operator-cloud-credentials  


# 5. それぞれのIAMロールに紐づいているポリシーの内容
それぞれのロールに紐づいているポリシーについて、その中身を簡単にまとめました。
ロール名の下に記載したポリシーが、それぞれのロールに紐づいているアクセス許可ポリシーになります。
これらのポリシーは全てAWS管理のものであり、CLI実行時に自動でそれぞれのロールにアタッチされます。
なお、現時点（2024年12月）のROSA公式ドキュメント内、[アカウント全体の IAM ロールおよびポリシー参照](https://docs.redhat.com/ja/documentation/red_hat_openshift_service_on_aws/4/html-single/introduction_to_rosa/index#rosa-sts-account-wide-roles-and-policies_rosa-sts-about-iam-resources)に書かれている内容は、筆者が実際に作成したHCP環境とは異なっていました（ROSA Classicの内容なのでしょうか）。
そのため、ポリシーの詳細説明についてはAWSの[ROSAのためのAWS管理ポリシー](https://docs.aws.amazon.com/rosa/latest/userguide/security-iam-awsmanpol.html)というドキュメントを参考にしています。
## 5.1 Accountロール
### 5.1.1. ManagedOpenShift-Installer-Role
- **ポリシー名**：
  - ROSAInstallerPolicy 
- **ポリシー概要**：
  - ROSAインストーラーに対して、クラスターのインストールタスクを完了するのに必要な権限を付与
- **許可内容**：
  - ec2
    - Red Hatが所有・管理するAWSアカウント内のAMIを使用して、Amazon EC2インスタンスを起動する。
    - Amazon EC2ノードに関連するインスタンス、ボリューム、ネットワークリソースを操作する。これにより、Kubernetesコントロールプレーンがインスタンスをクラスターに参加させ、VPC内の存在を確認できるようにする。
    - "kubernetes.io/cluster/*"タグキーを使ってサブネットにタグ付けし、ロードバランサーが指定されたサブネット内でのみ作成されるようにする。
  - elasticloadbalancing
    - クラスター上のターゲットノードにロードバランサーを追加・削除する。
    - Kubernetesコントロールプレーンが、KubernetesサービスやOpenShiftアプリケーションが要求するロードバランサーを動的にプロビジョニングするために必要。
  - kms
    - AWS KMSキーを読み取り、EC2インスタンスに対する権限付与を作成・管理する。また、外部で利用するための一意の対称データキーを返す。
    クラスター作成時にetcd暗号化が有効な場合、暗号化されたetcdデータを利用するために必要。
  - iam
    - IAMロールとポリシーを検証する。
    - クラスターに関連するEC2インスタンスプロファイルを動的に作成・管理する。
    - iam:TagInstanceProfile権限を使い、インスタンスプロファイルにタグを追加する。
    - 指定されたOIDCプロバイダーがない場合、クラスターインストール失敗時にエラーメッセージを提供する。
  - route53
    - クラスター作成時に必要なRoute 53リソースを管理する。
  - servicequotas
    - クラスター作成時に必要なサービスクォータを確認する。
  - sts
    - ROSAコンポーネント用の一時的なAWS STS認証情報を生成する。クラスター作成時の認証に使用する。
  - secretsmanager
    - クラスターのプロビジョニングの一環として、OIDC構成を安全に利用するためにシークレットデータを取得する。

### 5.1.2. ManagedOpenShift-Worker-Role
- **ポリシー名**：
  - ROSAWorkerInstancePolicy
- **ポリシー概要**：
  - ROSAコンピュートインスタンスに対して、コンポーネントの管理に必要な権限を付与
- **許可内容**：
  - ec2
    - ROSA クラスター内のワーカーノードのライフサイクル管理の一環として、AWS リージョンと Amazon EC2 インスタンスの詳細を確認

### 5.1.3. ManagedOpenShift-Support-Role
- **ポリシー名**：
  - ROSASRESupportPolicy 
- **ポリシー概要**：
  - Red Hat SRE サポートチームにROSA クラスターをサポートするために必要な権限を付与
- **許可内容**：
  - cloudtrail
    - クラスターに関連するAWS CloudTrailのイベントと証跡を取得する。
  - cloudwatch
    - クラスターに関連するAmazon CloudWatchのメトリクスを取得する。
  - ec2
    - セキュリティグループ、VPCエンドポイント接続、ボリュームステータスなど、クラスターの正常性に関連するAmazon EC2コンポーネントを確認・説明する。また、EC2インスタンスの起動、停止、再起動、終了を実行する。
  - elasticloadbalancing
    - クラスターの健全性に関連するElastic Load Balancingのパラメータを取得・確認する。
  - iam
    - クラスターの健全性に関連するIAMロールを評価する。
  - route53
    - クラスターの健全性に関連するDNS設定を確認する。
  - sts
    - DecodeAuthorizationMessageを使用して、デバッグの目的でIAMメッセージを取得する。

## 5.2. Operatorロール
### 5.2.1. < prefix >-kube-system-capa-controller-manager       
- **ポリシー名**：
  - ROSANodePoolManagementPolicy   
- **ポリシー概要**：
  - NodePool コントローラーにワーカーノードとして管理されるAmazon EC2インスタンスを記述、実行、終了するために必要な権限を付与。
- **許可内容**：
  - ec2
    - Red Hatが所有・管理するAWSアカウント内のAMIを使用して、Amazon EC2インスタンスを起動する。
    - ROSAクラスターでEC2のライフサイクルを管理し、Elastic Load Balancing、Amazon VPC、Route 53、Amazon EBS、Amazon EC2を利用して、ワーカーノードを動的に作成・統合する。
  - iam
    - AWSServiceRoleForElasticLoadBalancingというサービスにリンクされたロールを通じてElastic Load Balancingを利用する。
    - Amazon EC2インスタンスプロファイルにロールを割り当てる。
  - kms
    - AWS KMSキーを使用してAmazon EC2への権限を作成・管理し、外部で利用するための一意の対称データキーを返す。これにより、ワーカーノードのルートボリュームでディスク暗号化を有効にする。

### 5.2.2. < prefix >-kube-system-control-plane-operator 
- **ポリシー名**：
  - ROSAControlPlaneOperatorPolicy   
- **ポリシー概要**：
  - コントロールプレーンオペレーターにROSA HCPのAmazon EC2およびRoute 53リソースを管理するために必要な権限を付与
- **許可内容**：
  - ec2
    - Amazon VPCエンドポイントを作成・管理する。
  - route53
    - Route 53のレコードセットを一覧表示・変更し、ホストゾーンを一覧表示する。
  
### 5.2.3. < prefix >-kube-system-kms-provider    
- **ポリシー名**：
  - ROSAKMSProviderPolicy    
- **ポリシー概要**：
  - 組み込みのAWS暗号化プロバイダーに、etcdデータ暗号化をサポートするAWS KMSキーを管理するために必要なアクセス許可を付与
- **許可内容**：
  - kms
    - AWS KMSキーを使用してデータを暗号化、復号化、取得する。クラスター作成時にetcd暗号化が有効な場合、暗号化されたetcdデータを使用するために必要。

### 5.2.4. < prefix >-kube-system-kube-controller-manager 
- **ポリシー名**：
  - ROSAKubeControllerPolicy  
- **ポリシー概要**：
  - kubeコントローラーにROSA HCPのAmazon EC2、Elastic Load Balancing、AWS KMSリソースを管理するために必要な権限を付与
- **許可内容**：
  - ec2
    - Amazon EC2インスタンスのセキュリティグループにタグを作成・削除・追加する。セキュリティグループにインバウンドルールを追加する。
    - アベイラビリティゾーン、Amazon EC2インスタンス、ルートテーブル、セキュリティグループ、VPC、サブネットに関する操作や説明を行う。
  - elasticloadbalancing
    - ロードバランサーおよびそのポリシーを作成・管理する。ロードバランサーリスナーを作成・管理し、ターゲットをターゲットグループに登録・管理する。
    - Amazon EC2インスタンスをロードバランサーに登録・解除し、ロードバランサーにタグを追加する。
  - kmsetcd
    - AWS KMSキーの詳細情報を取得する。クラスター作成時にetcd暗号化が有効な場合、暗号化されたetcdデータを使用するために必要。

### 5.2.5. < prefix >-openshift-cloud-network-config-controller-cloud-credenti  
- **ポリシー名**：
  - ROSACloudNetworkConfigOperatorPolicy
- **ポリシー概要**：
  - クラウドネットワークコンフィグコントローラーオペレーターにROSAクラスターのネットワークリソースをプロビジョニングおよび管理するために必要な権限を付与。オペレーターはこれらの権限を使用して、ROSAクラスター内のAmazon EC2インスタンスのプライベートIPアドレスを管理
- **許可内容**：
  - ec2
    - ROSAクラスター内のAmazon EC2インスタンス、Amazon VPCサブネット、およびElastic Network Interfaceの構成を読み取り、割り当て、操作の詳細を説明する。

### 5.2.6. < prefix >-openshift-cluster-csi-drivers-ebs-cloud-credentials   
- **ポリシー名**：
  - ROSAAmazonEBSCSIDriverOperatorPolicy
- **ポリシー概要**：
  - Amazon EBS CSIドライバーオペレーターに、ROSA クラスターにAmazon EBS CSIドライバーをインストールして保守するために必要な権限を付与
- **許可内容**：
  - ec2
    - Amazon EC2インスタンスに接続されたAmazon EBSボリュームを作成、変更、アタッチ、デタッチ、削除する。
    - EBSボリュームのスナップショットを作成・削除し、EC2インスタンス、ボリューム、スナップショットを一覧表示する。

### 5.2.7. < prefix >-openshift-image-registry-installer-cloud-credentials 
- **ポリシー名**：
  - ROSAImageRegistryOperatorPolicy  
- **ポリシー概要**：
  - イメージレジストリオペレータに、ROSAクラスタ内イメージレジストリとS3を含む依存サービスのリソースをプロビジョニングおよび管理するために必要な権限を付与
- **許可内容**：
  - s3
    - コンテナイメージとクラスターのメタデータを保存するための永続ストレージとして、Amazon S3バケットを管理・評価する。

### 5.2.8. < prefix >-openshift-ingress-operator-cloud-credentials
- **ポリシー名**：
  - ROSAIngressOperatorPolicy
- **ポリシー概要**：
  - Ingress OperatorにROSAクラスターのロードバランサーとDNS構成をプロビジョニングおよび管理するために必要な権限を付与
- **許可内容**：
  - elasticloadbalancing
    - プロビジョニングされたロードバランサーの状態を確認する。
  - route53
    - Route 53のホストゾーンを一覧表示し、ROSAクラスターが管理するDNSレコードを編集する。
  - tag
    - tag:GetResources権限を使用して、タグ付けされたリソースを管理する。