翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
ロールベンディングマシンソリューションをデプロイして最小特権の IAM ロールをプロビジョニングする
Benjamin Morris、Nima Fotouhi、Aman Kaur Gandhi、および Chad Moon、Amazon Web Services
概要
パイプラインのスコープを超える AWS Identity and Access Management (IAM) ロールのアクセス許可は、組織に不要なリスクをもたらす可能性があります。開発者は、開発中に広範なアクセス許可を付与することがありますが、コードのトラブルシューティング後にアクセス許可の範囲を絞り込むことを忘れることがあります。これにより、ビジネスニーズのない強力なロールが存在し、セキュリティエンジニアによってレビューされていない可能性がある問題が発生します。
このパターンの場合、問題の解決策としてロールベンディングマシン (RVM) があります。RVM は、一元化された安全なデプロイモデルを使用して、開発者の労力を最小限に抑えながら、個々の GitHub リポジトリのパイプラインに対して最小特権の IAM ロールをプロビジョニングする方法を示します。RVM は中央ソリューションであるため、セキュリティチームを変更の承認に必要なレビューアーとして設定できます。このアプローチにより、セキュリティチームは過剰な権限のパイプラインロールリクエストを拒否できます。
RVM は Terraform コードを入力として受け取り、パイプライン対応の IAM ロールを出力として生成します。必要な入力は、 AWS アカウント ID、GitHub リポジトリ名、およびアクセス許可ポリシーです。RVM はこれらの入力を使用して、ロールの信頼ポリシーとアクセス許可ポリシーを作成します。結果として得られる信頼ポリシーにより、指定された GitHub リポジトリがロールを引き受け、パイプラインオペレーションに使用できます。
RVM は IAM ロール (ブートストラップ中に設定) を使用します。このロールには、組織内の各アカウントで role-provisioning-role を引き受けるアクセス許可があります。ロールは、 AWS Control Tower Account Factory for Terraform (AFT) または AWS CloudFormation StackSets を介して設定されます。role-provisioning-roles は、開発者向けのパイプラインロールを実際に作成するロールです。
前提条件と制限事項
前提条件
アクティブ AWS アカウント。
GitHub Actions を通じて Infrastructure as Code (IaC) をデプロイするために使用される GitHub 組織。(GitHub Enterprise/Premium/Ultimate は必要ありません 。)
マルチアカウント AWS 環境。この環境の一部である必要はありません AWS Organizations。
all AWS アカウント (AFT や CloudFormation StackSets など) に IAM ロールをデプロイするメカニズム。
Terraform バージョン 1.3 以降がインストールされ、設定されている
。
制限事項
このパターンのコードは GitHub Actions と Terraform に固有のものです。ただし、パターンの一般的な概念は、他の継続的インテグレーションおよびデリバリー (CI/CD) フレームワークで再利用できます。
一部の AWS のサービス は では使用できません AWS リージョン。利用可能なリージョンについては、「AWS サービス (リージョン別)
」を参照してください。特定のエンドポイントについては、「サービスエンドポイントとクォータ」を参照して、サービスのリンクを選択してください。
アーキテクチャ
次の図は、このパターンのワークフローを図解したものです。

ロールベンディングマシンは、一般的に以下のステップで使用されます。
開発者は、新しくリクエストされた IAM ロールの Terraform コードを含むコードを RVM GitHub リポジトリにプッシュします。このアクションは、RVM GitHub Actions パイプラインをトリガーします。
パイプラインは、OpenID Connect (OIDC) 信頼ポリシーを使用して RVM ロール引き受けロールを引き受けます。
RVM パイプラインは実行されると、開発者の新しい IAM ロールをプロビジョニングするアカウントの RVM ワークフローロールを引き受けます。(RVM ワークフローロールは、AFT または CloudFormation StackSets を使用してプロビジョンされました。)
RVM は、適切なアクセス許可と信頼を持つ開発者の IAM ロールを作成し、そのロールを他のアプリケーションパイプラインが引き受けられるようにします。
アプリ開発者は、この RVM がプロビジョニングしたロールを引き受けるようにアプリパイプラインを設定できます。
作成されたロールには、開発者がリクエストしたアクセス許可とReadOnlyAccess ポリシーが含まれます。ロールを引き受けられるのは、開発者が指定したリポジトリの main ブランチに対して実行されるパイプラインだけです。このアプローチで、ロールを使用するためにブランチの保護とレビューを要求できます。
自動化とスケール
最小特権のアクセス許可では、プロビジョニングされる各ロールの詳細に注意する必要があります。このモデルにより、これらのロールの作成に必要となる複雑さが軽減され、開発者は追加の学習や多大な労力をかけることなく、必要なロールを作成できます。
ツール
AWS のサービス
AWS Identity and Access Management (IAM) は、誰を認証し、誰に使用する権限を付与するかを制御することで、 AWS リソースへのアクセスを安全に管理するのに役立ちます。
AWS Organizations は、作成して一元管理する AWS アカウント 組織に複数の を統合するのに役立つアカウント管理サービスです。
その他のツール
GitHub Actions
は、GitHub リポジトリと密接に統合された継続的インテグレーションおよび継続的デリバリー (CI/CD) プラットフォームです。GitHub Actions を使用して、ビルド、テスト、デプロイパイプラインを自動化できます。 「Terraform
」は、HashiCorp の infrastructure as code (IaC) ツールで、クラウドとオンプレミスのリソースの作成と管理を支援します。
コードリポジトリ
このパターンのコードは、GitHub 内の role-vending-machine
ベストプラクティス
正しい方法は簡単に、間違った方法は難しく – 正しい方法を簡単に行えるようにします。開発者が RVM プロビジョニングプロセスに苦戦しているときに、他の方法でロールを作成しようとする可能性があります。その場合、RVM の中心的な性質が損なわれます。セキュリティチームが RVM を安全かつ効果的に使用する方法について明確なガイダンスを提供していることを確認します。
また、開発者が間違った方法で作業するのが難しくなるようにする必要があります。サービスコントロールポリシー (SCPs) またはアクセス許可の境界を使用して、他のロールを作成できるロールを制限します。このアプローチによって、ロールの作成を RVM やその他の信頼できるソースのみに制限できます。
良い例を提供する – 一部の開発者は、必然的に非公式テンプレートとして RVM リポジトリ内の既存のロールを適応させ、新しいロールにアクセス許可を付与するようになります。コピー可能な最小限のアクセス許可の例がある場合は、それを提供して、開発者が広範でワイルドカードの多いアクセス許可をリクエストするリスクを軽減できるようにします。多数のワイルドカードを持つアクセス許可の多いロールから開始すると、時間の経過とともにその問題が増大する可能性があります。
命名規則と条件を使用する – 開発者がアプリケーションで作成されるすべてのリソース名を知らなくても、命名規則を使用してロールのアクセス許可を制限する必要があります。例えば、Amazon S3 バケットを作成する場合、リソースキーの値は
arn:aws:s3:::myorg-myapp-dev-*のようになります。これにより、ロールはその名前に一致するバケット以外のアクセス許可を持たなくなります。IAM ポリシーを使用して命名規則を適用すると、命名規則への準拠が向上するという別の利点があります。これは、一致しないリソースは作成できなくなるためです。プルリクエスト (PR) レビューを要求する – RVM ソリューションの価値は、新しいパイプラインロールをレビューできる一元的な場所を作成することにあります。ただし、この設計は、安全で質の高いコードが RVM にコミットされるよう保証するガードレールがある場合にのみ役立ちます。コード (
mainなど) をデプロイするために使用されるブランチを直接のプッシュから保護し、それらをターゲットとするマージリクエストの承認を要求します。読み取り専用ロールを設定する – デフォルトでは、RVM はリクエストされた各ロール
readonlyバージョンをプロビジョニングします。このロールは、terraform planパイプラインワークフローなど、データを書き込まない CI/CD パイプラインで使用できます。このアプローチは、読み取り専用ワークフローの動作が異常である場合に、不要な変更を防ぐのに役立ちます。デフォルトでは、 AWS 管理
ReadOnlyAccessポリシーは読み取り専用ロールと読み取り/書き込みロールの両方にアタッチされます。このポリシーによって、必要なアクセス許可を決定する際のイテレーションの必要性を軽減できますが、一部の組織では過度な許可となる場合があります。必要に応じて、Terraform コードからポリシーを削除できます。最小限の権限を付与する – 最小特権の原則に従い、タスクの実行に必要最小限の権限を付与します。詳細については、IAM ドキュメントの「最小限の特権を認める。」と「IAM でのセキュリティのベストプラクティス」を参照してください。
エピック
| タスク | 説明 | 必要なスキル |
|---|---|---|
サンプルリポジトリを GitHub 組織にコピーします。 | このパターンのリポジトリをクローン
| DevOps エンジニア |
RVM AWS アカウント の を決定します。 | RVM AWS アカウント に使用するインフラストラクチャのデプロイを決定します。管理アカウントまたはルートアカウントを使用しないでください。 | クラウドアーキテクト |
(オプション) 組織のパイプラインに PR の作成を許可します。 | 注記このステップは、 組織のパイプラインに PR の作成を許可するには、次の手順を実行します。
詳細については、GitHub ドキュメントの「リポジトリの GitHub Actions の設定を管理する | DevOps エンジニア |
RVM アカウントに読み取り専用アクセス許可を付与します。 | RVM アカウントに読み取り専用アクセス許可を付与する委任ポリシーを管理アカウントに作成します。これにより、RVM GitHub ワークフローは、 次のコードを使用して、 をステップ 2 で選択した AWS アカウント ID
| クラウド管理者 |
サンプルリポジトリのデフォルト値を更新します。 | 特定の環境で動作するように RVM を設定するには AWS リージョン、次の手順を実行します。
| DevOps エンジニア |
| タスク | 説明 | 必要なスキル |
|---|---|---|
RVM リポジトリをブートストラップします。 | このステップは、RVM パイプライン自体で使用される OIDC 信頼ロールと IAM ロールを作成するために必要です。これにより、他のロールの運用と販売を開始できるようになります。 RVM アカウントのコンテキストで、 | DevOps エンジニア |
| タスク | 説明 | 必要なスキル |
|---|---|---|
| AFT や StackSets など、組織のプラクティスに沿ったデプロイ方法を選択します。このメソッドを使用して、 これらの IAM ロールには、RVM アカウントのロール引き受けロール (または | AWS 管理者 |
| RVM を設定してパイプラインロールを作成する準備を整えるには、次の手順を実行します。
ワークフローが完了すると、RVM は次を行う準備が整います。
| DevOps エンジニア |
トラブルシューティング
| 問題 | ソリューション |
|---|---|
RVM を使用してロールを作成しましたが、GitHub がロールを引き受けることができません。 | GitHub リポジトリの名前が 同様に、GitHub パイプラインで使用されるブランチが、 |
特定のリソースを読み取るアクセス許可がないため、読み取り専用ロールはパイプラインの実行に失敗しています。 |
|
関連リソース
追加情報
GitHub 環境の使用
GitHub 環境は、ロールアクセスのブランチベースの制限に代わるアプローチです。GitHub 環境を使用する場合、IAM 信頼ポリシーの追加条件の構文の例は以下のようになります。この構文は、GitHub アクションが Production 環境で実行されている場合にのみロールを使用できることを指定します。
"StringLike": { "token.actions.githubusercontent.com:sub": "repo:octo-org/octo-repo:environment:Production" }
構文の例では、次のプレースホルダー値を使用します。
octo-orgは GitHub 組織名です。octo-repoはリポジトリの名前です。Productionは特定の GitHub 環境名です。