Terraform を使用して AWS アクセス許可セットを動的に管理する - AWS 規範ガイダンス

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Terraform を使用して AWS アクセス許可セットを動的に管理する

Amazon Web Services、Vinicius Elias および Marcos Vinicius Pinto Jordao

概要

AWS IAM アイデンティティセンター は、 AWS アカウント およびクラウドアプリケーションへのシングルサインオンアクセスを管理するための一元化されたハブを提供することで AWS Identity and Access Management (IAM) を強化します。ただし、組織の拡大に伴って、IAM アイデンティティセンターの許可セットを手動で管理することはますます複雑になり、エラーが発生しやすくなる可能性があります。この複雑さにより、潜在的なセキュリティギャップや管理オーバーヘッドにつながる可能性があります。

このソリューションを使用すると、ネイティブ AWS のサービスで構築された継続的インテグレーションおよび継続的デリバリー (CI/CD) パイプラインを使用して、Infrastructure as Code (IaC) を通じて許可セットを管理できます。これにより、アクセス許可セットの割り当てメカニズムを AWS Control Tower ライフサイクルイベントまたは Account Factory for Terraform (AFT) 環境とシームレスに統合できます。このアプローチでは、新規と既存の ID の両方に動的な ID 設定を提供します AWS アカウント。

Amazon EventBridge ルールは AWS アカウント 作成と更新をモニタリングし、ID 設定を組織構造と同期させるのに役立ちます。 AWS Control Tower または AFT でアカウントを作成または更新すると、パイプラインがトリガーされます。許可セットの定義と割り当てルールを含む一連の JSON ファイルを評価します。次に、パイプラインはすべてのアカウントに設定を適用し、同期します。

このアプローチには以下の利点があります。

  • 整合性 — AWS 組織全体の手動設定ドリフトを排除

  • 監査性 – すべての ID 管理の変更の完全な履歴を維持します

  • スケーラビリティ – AWS 環境の拡大に応じて設定を自動的に適用する

  • セキュリティ – アクセス許可の割り当てにおける人為的ミスを削減します

  • コンプライアンス – 文書化された変更と割り当てルールを通じて、規制要件の遵守を促進します

前提条件と制限事項

  • AWS Control Tower と AWS Organizations がセットアップされたマルチアカウント環境。必要に応じて、 で AFT を使用できます AWS Control Tower。

  • ソリューションを受け取る AWS アカウント IAM アイデンティティセンターの委任管理者。詳細については、IAM アイデンティティセンタードキュメントの「委任管理」を参照してください。

  • メインコードを処理するバージョン管理システム (VCS) リポジトリ。サンプルについては、ソリューションの GitHub リポジトリを参照してください。

  • Amazon Simple Storage Service (Amazon S3) バケットや Amazon DynamoDB テーブルなど、Terraform バックエンド管理に必要な AWS リソース。

制限事項

  • パイプラインは AWS ネイティブリソースとオープンソースの Terraform を使用します。パイプラインは、サードパーティーのエコシステムへの呼び出しを行う準備ができていません。

  • 一部の AWS のサービス は では使用できません AWS リージョン。利用可能なリージョンについては、「AWS サービス (リージョン別)」を参照してください。特定のエンドポイントについては、「サービスエンドポイントとクォータ」を参照して、サービスのリンクを選択してください。

アーキテクチャ

次の図は、このパターンのコンポーネントとワークフローを示しています。

Terraform を使用して AWS 許可セットを管理するためのコンポーネントとワークフロー。

AWS Control Tower イベントフロー

このソリューションは、 AWS Control Tower または AFT からのイベントの統合から始まります。どのサービスを選択するかは、変数定義を通じて実装時に決まります。使用される方法に関係なく、アカウントが作成または更新されるたびにパイプラインがトリガーされます。パイプラインは、許可セット管理リポジトリに保存されているポリシーを調整します。

AWS Control Tower ライフサイクルイベントは次のとおりです。

  • CreateManagedAccount – 新しいアカウントが作成された場合

  • UpdateManagedAccount – 既存のアカウントが更新された場合

イベントルーティング

EventBridge は中央イベント処理サービスとして機能し、 AWS Control Tower アカウントで生成されたイベントをキャプチャします。イベントが発生すると、EventBridge はそれらをソリューションアカウントの一元化されたイベントバスにインテリジェントにルーティングします。 AWS Control Tower ライフサイクルイベントは、個別のルーティングパターンに従います。AFT がイベントソースとして定義されている場合、AFT 管理アカウントは AWS Control Tower アカウントではなくイベントを処理します。このイベント駆動型アーキテクチャにより、手動による介入なしに組織の変更に自動的に対応できるようになります。

AFT 統合プロセス

AWS Control Tower ライフサイクルイベントが AFT 管理アカウントに到達すると、AFT に組み込まれている複数のダウンストリームプロセスが自動的にトリガーされます。AFT アカウントカスタマイズワークフローが完了すると、専用の aft-notifications Amazon Simple Notification Service (Amazon SNS) トピックにメッセージが発行されます。このトピックでは、このソリューションで実装されている aft-new-account-forward-event AWS Lambda 関数をトリガーします。Lambda 関数は、パイプラインの開始に使用される、ソリューションアカウントイベントバスにイベントを送信します。

Infrastructure as Code パイプライン

ソリューションパイプラインは、完全に自動化されたデプロイメカニズムとして動作します。 AWS CodePipeline サービスはリポジトリの変更を継続的にモニタリングします。新しいコミットを検出すると、デプロイワークフローが自動的に開始され、検証フェーズと実行フェーズを含むシーケンシャル処理が開始されます。システムは Terraform planオペレーションを実行して提案された変更を特定し、次に Terraform apply コマンドを実行してそれらの変更を AWS 環境に実装します。注目すべきは、パイプラインが手動承認ゲートなしで実行実行されることです。このアプローチにより、パイプラインログと Terraform 状態ファイルを通じて監査性を維持しながら、インフラストラクチャの変更を迅速にデプロイできるようになります。

パイプラインは を活用して AWS CodeBuild 、適切なアクセス許可を持つ制御された環境で Terraform オペレーションを実行します。この IaC アプローチにより、パイプラインは次のような包括的なアクセス許可管理オペレーションを実行できます。

  • 新しい許可セットを作成します。

  • 既存の許可セットを更新します。

  • 不要な許可セットを削除します。

  • AWS 組織内のアカウントとグループ間でこれらのアクセス許可の割り当てを管理します。

インフラストラクチャの一貫性を維持し、競合する変更を防ぐために、このソリューションでは、Amazon S3 バケットと専用の Amazon DynamoDB テーブルを使用して Terraform バックエンド状態管理システムを実装します。このアプローチは、Terraform 状態ファイルの永続的なストレージの場所と状態のロックメカニズムを提供し、同じリソースに同時に変更を加えるのを防ぎます。

メインの Terraform コードは、公式 AWS permission-setsの Terraform モジュールを使用します。このモジュールでは、許可セットテンプレートに基づいて、IAM アイデンティティセンター内の許可セットを動的に管理できます。

ソースコントロール管理

許可セットテンプレート (JSON ファイル) は、ID 管理設定の一元化されたリポジトリを提供する、GitHub などの外部バージョン管理システムにあります。このアプローチにより、許可セット定義の信頼できる唯一の情報源が確立され、標準的なコードレビュー手法を通じて共同開発が可能になります。認可されたユーザーは、組織の変更管理プロセスに従って、これらのテンプレートに変更をコミットできます。これらのコミットは、自動デプロイパイプラインの主要なトリガーとして機能し、インフラストラクチャ更新プロセスを開始します。

リポジトリ内の JSON ファイルを使用して許可セットを設定する方法の例については、「追加情報」を参照してください。

ツール

AWS のサービス

  • AWS CodeBuild は完全マネージド型の構築サービスです。ソースコードのコンパイル、ユニットテストの実行、すぐにデプロイできるアーティファクトの生成を行います。

  • AWS CodeConnections では、CodePipeline などの AWS リソースとサービスが GitHub などの外部コードリポジトリに接続できます。

  • AWS CodePipeline は、ソフトウェアリリースのさまざまな段階を迅速にモデル化および設定し、ソフトウェアの変更を継続的にリリースするために必要なステップを自動化するのに役立ちます。

  • AWS Command Line Interface (AWS CLI) は、コマンドラインシェルのコマンド AWS のサービス を使用して を操作するのに役立つオープンソースツールです。

  • AWS Control Tower は、規範的なベストプラクティスに従って、 AWS マルチアカウント環境を設定および管理するのに役立ちます。

  • Amazon DynamoDB は、フルマネージド NoSQL データベースサービスです。高速かつ予測可能でスケーラブルなパフォーマンスを提供します。

  • Amazon EventBridge」 は、アプリケーションをさまざまなソースのデータに接続するために支援するサーバーレスイベントバスサービスです。例えば、 AWS Lambda 関数、API 送信先を使用する HTTP 呼び出しエンドポイント、その他のイベントバスなどです AWS アカウント。

  • AWS Identity and Access Management (IAM) は、誰を認証し、誰に使用する権限を付与するかを制御することで、 AWS リソースへのアクセスを安全に管理できます。

  • AWS IAM アイデンティティセンター を使用すると、すべての AWS アカウント およびクラウドアプリケーションへのシングルサインオン (SSO) アクセスを一元管理できます。

  • AWS Lambda は、サーバーのプロビジョニングや管理を行うことなくコードを実行できるコンピューティングサービスです。必要に応じてコードを実行し、自動的にスケーリングするため、課金は実際に使用したコンピューティング時間に対してのみ発生します。

  • AWS Organizations は、作成して一元管理する AWS アカウント 組織に複数の を統合するのに役立つアカウント管理サービスです。

  • Amazon Simple Notification Service (Amazon SNS) は、ウェブサーバーやメールアドレスなど、パブリッシャーとクライアント間のメッセージの交換を調整および管理するのに役立ちます。アカウント管理イベントのプッシュ通知を有効にし、システム内の重要な変更やアクションが関係者に確実に通知されるようにします。

  • Amazon Simple Storage Service (Amazon S3) は、あらゆる量のデータを保存、保護、取得できるクラウドベースのオブジェクトストレージサービスです。

その他のツール

  • Terraform は HashiCorp の infrastructure as code (IaC) ツールで、クラウドとオンプレミスのリソースの作成と管理を支援します。

コードリポジトリ

このパターンのコードは、 AWS sample-terraform-aws-permission-sets-pipeline リポジトリの GitHub の Samples 組織で入手できます。 sample-terraform-aws-permission-sets-pipeline

ベストプラクティス

  • 本番稼働でコードを実行するために使用される Terraform モジュールとプロバイダーのバージョンを常に固定します。

  • Checkov などの静的コード分析ツールを使用して、コードをスキャンし、セキュリティの問題を解決します。

  • 最小特権の原則に従い、タスク実行に必要最小限の権限を付与します。詳細については、IAM ドキュメントの「最小限の特権を認める。」と「IAM でのセキュリティのベストプラクティス」を参照してください。

エピック

タスク説明必要なスキル

Terraform バックエンドリソースを作成します。

Terraform バックエンド AWS リソースをまだ作成していない場合は、次の手順を使用して Amazon S3 バケット (s3-tf-backend-{ACCOUNT_ID}) と DynamoDB テーブル () を作成しますddb-tf-backend

  1. ソリューションをデプロイ AWS アカウント する にサインインし、 AWS Control Tower ホームAWS CloudShellで を開きます AWS リージョン。

  2. 次のコマンドを実行し、プレースホルダーを AWS アカウント ID {ACCOUNT_ID} に置き換えます。

aws s3api create-bucket --bucket s3-tf-backend-{ACCOUNT_ID} aws s3api put-bucket-versioning --bucket s3-tf-backend-{ACCOUNT_ID} --versioning-configuration Status=Enabled aws dynamodb create-table --table-name ddb-tf-backend --attribute-definitions AttributeName=LockID,AttributeType=S --key-schema AttributeName=LockID,KeyType=HASH --provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1
AWS 管理者

クロスアカウントロールを作成します。

Terraform AWS プロバイダー設定でクロスアカウント IAM event-source-account ロールを指定する必要があります。このロールをまだ作成していない場合は、次のステップを使用して作成します。

  1. イベントソース (AWS Control Tower 管理アカウントまたは AFT アカウント) AWS アカウント となる にサインインし、開きます AWS CloudShell。

  2. 次のコマンドを実行し、プレースホルダーを現在の {ACCOUNT_ID} AWS アカウント ID ではなく、このソリューションに使用している AWS アカウント ID に置き換えます。

aws iam create-role \ --role-name CrossAccountRole \ --assume-role-policy-document '{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::{ACCOUNT_ID}:root" }, "Action": "sts:AssumeRole" } ] }'
  1. コマンド出力をチェックし、ロールの Amazon リソースネーム (ARN) (例: arn:aws:iam::111122223333:role/CrossAccountRole) をコピーします。

  2. IAM ポリシーをロールにアタッチするには、次のコマンドを実行します。

aws iam attach-role-policy \ --role-name CrossAccountRole \ --policy-arn arn:aws:iam::aws:policy/AdministratorAccess

この例では、 AWS マネージド IAM ポリシー AdministratorAccess を使用します。必要に応じて、より具体的なポリシーを使用することもできます。

AWS 管理者
タスク説明必要なスキル

専用リポジトリを作成します。

このタスクでは、GitHub を使用していることを前提としています。メインの Terraform コードと許可セットテンプレート JSON ファイルを保存するための専用リポジトリを作成します。

DevOps エンジニア

許可セットコードを準備します。

次のファイルをどのように構造化できるかの詳細については、ソリューションリポジトリのサンプルコードを参照してください。

├── main.tf

├── outputs.tf

├── providers.jinja

└── templates

内容をコピーし、providers.jinja 値を保持して、他のファイルに必要な調整を加えます。例えば、許可セットテンプレートファイルを templates に追加したり、main.tf ファイル内の aws-ia/permission-sets/aws モジュールバージョンを固定したりします。

DevOps エンジニア

変更をコミットします。

先ほど作成したリポジトリに変更をコミットしてプッシュします。リポジトリ名とその GitHub 組織 (例: myorg/aws-ps-pipeline) を保存します。

DevOps エンジニア
タスク説明必要なスキル

コンテンツをダウンロードします。

ソリューションリポジトリからコンテンツをダウンロード (クローン) します。

DevOps エンジニア

変数を処理します。

terraform.tfvars ファイルを作成し、次の必要な変数を追加します。

  • repository_name – 先ほど作成した許可セットリポジトリの名前です

  • branch_name – 許可セットリポジトリブランチの名前です

  • vcs_provider – VCS プロバイダーです

  • account_lifecycle_events_source – パイプライン (AWS Control Tower または AFT) をトリガーするイベントのソース

repository_name = "myorg/aws-ps-pipeline" branch_name = "main" vcs_provider = "github" account_lifecycle_events_source = "CT"

追加の変数オプションの詳細については、このパターンの GitHub リポジトリにある variables.tf ファイルを参照してください。

DevOps エンジニア

Terraform バックエンド設定を調整します。

backend.tf ファイル内のプレースホルダーを独自の値に置き換えます。 AWS Control Tower ホームを使用し AWS リージョン、以前に作成した Amazon S3 バケットと DynamoDB テーブルの名前を指定します。

terraform { required_version = ">=1.6" backend "s3" { region = "{region}" bucket = "{bucket_name}" key = "terraform.tfstate" dynamodb_table = "{table_name}" encrypt = "true" } }

必要に応じて、独自の Terraform バックエンド設定を使用することもできます。

DevOps エンジニア

Terraform プロバイダー設定を調整します。

providers.tf ファイル内のプレースホルダーを独自の情報に置き換えます。 AWS Control Tower ホームリージョンを使用して、以前に作成したevent-source-accountプロバイダーのクロスアカウント IAM ロールの ARN を指定します。

provider "aws" { region = "{region}" } provider "aws" { alias = "event-source-account" region = "{region}" assume_role { role_arn = "{role_arn}" } }
DevOps エンジニア
タスク説明必要なスキル

を選択します AWS アカウント。

IAM アイデンティティセンターの委任管理者アカウントにソリューションをデプロイすることをお勧めします。ただし、 AWS Organizations 管理アカウントにデプロイすることもできます。

IAM アイデンティティセンターインスタンスと同じリージョンで、選択したアカウントにサインインするには、 AWS CLIを使用します。使用している IAM ロールに、前のステップで event-source-account プロバイダーに指定されたロールを引き受けるアクセス許可があることを確認します。また、このロールは Terraform バックエンド設定で使用される AWS リソースにアクセスできる必要があります。

AWS 管理者

Terraform を手動で実行します。

設定を初期化、計画、適用するには、次の Terraform コマンドを示されている順序で実行します。

  1. terraform init

  2. terraform plan

  3. terraform apply

DevOps エンジニア

デプロイの結果を確認します。

IAM アイデンティティセンターの委任管理者アカウントで、aws-ps-pipeline パイプラインが作成されていることをチェックします。また、保留中のステータス AWS CodeConnections の接続があることを確認します。

AWS DevOps

CodeConnections 設定を完了します。

CodeConnections 設定を完了するには、次のステップを実行します。

  1. CodeConnections に移動し、作成された接続を選択して、[保留中の接続の更新] を選択します。

  2. GitHub の認証情報を入力し、新しい GitHub アプリをインストールするか、許可セットリポジトリにアクセスできる既存のアプリを選択して、[接続] を選択します。

これで、パイプラインは許可セットリポジトリにアクセスできるようになります。

詳細な手順については、デベロッパーツールコンソールのドキュメントの「保留中の接続の更新」を参照してください。

AWS DevOps
タスク説明必要なスキル

パイプラインを AWS Control Tower または AFT 更新で実行します。

AWS Control Tower または AFT を使用してアカウントを作成または変更すると (選択したライフサイクルイベントのタイプに応じて)、パイプラインが開始されます。

AWS 管理者

コードを変更してパイプラインを実行します。

コードを変更して main ブランチにコミットすると、パイプラインが開始されます。

AWS DevOps

パイプラインを手動で実行します。

パイプラインを手動で開始するには、 のリリース変更機能を使用します AWS CodePipeline。

AWS DevOps

トラブルシューティング

問題ソリューション

アクセスが拒否されました

ソリューションをデプロイするために必要なアクセス許可があることを確認します。

CodeConnections の問題

  • 接続ステータスが [保留中] ではなく [使用可能] であることをチェックします。

  • CodeConnections 設定が GitHub 認証情報を使用して適切に完了していることを確認します。詳細については、デベロッパーツールコンソールのドキュメントの「保留中の接続の更新」を参照してください。

  • GitHub アプリに、許可セットリポジトリへの適切なアクセス許可があることを確認します。

パイプライン実行の問題

  • Amazon CloudWatch logs でパイプライン実行エラーをチェックします。

  • IAM アイデンティティセンターの委任が正しくセットアップされていることを確認します。そうしないと、 AWS アカウント メタデータの読み取り時にパイプラインが失敗する可能性があります。

許可セットのデプロイの問題

  • 許可セットテンプレートファイルの JSON 構文が正しいことを確認します。

  • テンプレートで参照されている IAM マネージドポリシーが存在することを確認します。

  • 割り当て内の指定されたグループとユーザーが IAM アイデンティティセンターに存在するかどうかをチェックします。

関連リソース

AWS のサービス ドキュメント

その他のリソース

追加情報

サンプル許可セットを含む JSON ファイル

次の例は、リポジトリ内の JSON ファイルを使用して許可セットを設定する方法を示しています。

{ "Name": "ps-billing", // Permission set identifier "Comment": "Sample permission set for billing access", // Comment to document the purpose of the permission set "Description": "Billing access in AWS", // Detailed description "SessionDuration": "PT4H", // Session duration = 4 hours (ISO 8601 format) "ManagedPolicies": [ // List of AWS IAM managed policies "arn:aws:iam::aws:policy/job-function/Billing", "arn:aws:iam::aws:policy/job-function/SupportUser", "arn:aws:iam::aws:policy/AWSSupportAccess", "arn:aws:iam::aws:policy/job-function/ViewOnlyAccess" ], "CustomerPolicies": [], // References to IAM policies previously created "CustomPolicy": {}, // Inline IAM policy defined directly in the permission set "PermissionBoundary": { // AWS or customer managed IAM policy to be used as boundary "ManagedPolicy": "", "CustomerPolicy": "" }, "Assignments": [ // Define the assignment rules { "all_accounts": true, // Apply to ALL active AWS accounts in organization "principal": "G_BILLING_USERS", // Group/user name in Identity Center "type": "GROUP", // Can be "GROUP" or "USER" "account_id": [], // List of AWS account ID (empty since all_accounts=true) "account_ou": [], // List of AWS Organizational Unit IDs with target AWS accounts "account_tag": [] // List of tags (key:value) to match AWS Organization accounts tags } ] }

詳細については、Terraform ウェブサイトで「AWS Permission Sets module」ドキュメントの JSON スキーマを参照してください。

ヒント

  • Terraform インポートブロックを使用して、既存の許可セットをソリューションにインポートできます。

  • AFT を使用して、委任アカウントに AWS 権限セットパイプラインを実装できます。詳細については、「AFT Blueprints」を参照してください。