Terraform を使用した AWS Control Tower コントロールのデプロイと管理 - AWS 規範ガイダンス

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

Terraform を使用した AWS Control Tower コントロールのデプロイと管理

作成者: Iker Reina Fuente (AWS) と Ivan Girardi (AWS)

概要

このパターンでは、 AWS Control Tower コントロール、 HashiCorp Terraform、Infrastructure as Code (IaC) を使用して、予防、検出、プロアクティブセキュリティコントロールを実装および管理する方法を説明します。コントロール (ガードレールとも呼ばれます) は、 AWS Control Tower 環境全体に継続的なガバナンスを提供する高レベルのルールです。例えば、コントロールを使用して のログ記録を要求し AWS アカウント 、特定のセキュリティ関連のイベントが発生した場合に自動通知を設定できます。

AWS Control Tower は、 AWS リソースを管理し、複数の にわたるコンプライアンスをモニタリングする予防、検出、プロアクティブコントロールを実装するのに役立ちます AWS アカウント。各コントロールは、1 つのルールを適用します。このパターンでは、提供された IaC テンプレートを使用して、環境にデプロイするコントロールを指定します。

AWS Control Tower コントロールは組織単位 (OU) 全体に適用され、コントロールは OU AWS アカウント 内のすべての に影響します。したがって、ユーザーがランディングゾーン内の任意のアカウントで作業を実行する場合、アクションは OU に適用されるコントロールに従います。

AWS Control Tower コントロールを実装することで、 AWS ランディングゾーンの強力なセキュリティ基盤を確立できます。このパターンを使用してコントロールを Terraform IaC としてデプロイすることで、ランディングゾーンでのコントロールを標準化し、より効率的にデプロイして管理できます。

AWS Control Tower コントロールを IaC としてデプロイするには、Terraform AWS Cloud Development Kit (AWS CDK) の代わりに を使用することもできます。詳細については、「 AWS CDK と を使用して AWS Control Tower コントロールをデプロイおよび管理する AWS CloudFormation」を参照してください。

対象者

このパターンは AWS Control Tower、、Terraform、および の使用経験があるユーザーに推奨されます AWS Organizations。

前提条件と制限

前提条件

  • AWS Organizations の組織および AWS Control Tower ランディングゾーンとして AWS アカウント 管理されているアクティブ。手順については、 AWS Control Tower ドキュメントの「開始方法」を参照してください。

  • AWS Command Line Interface (AWS CLI) をインストールして設定します。

  • このパターンをデプロイするアクセス許可を持つ管理アカウントの AWS Identity and Access Management (IAM) ロール。必要なアクセス許可とサンプルポリシーの詳細については、このパターンの「追加情報」セクションのIAM「ロールの最小特権のアクセス許可」を参照してください。

  • 管理アカウントでIAMロールを引き受けるアクセス許可。

  • 識別子 CT を使用して、サービスコントロールポリシー (SCP) ベースのコントロールを適用します。 CLOUDFORMATIONPR.1。これは、プロアクティブコントロールをデプロイするためにアクティブ化SCPする必要があります。手順については、AWS CloudFormation 「レジストリ内のリソースタイプ、モジュール、フックの管理を禁止する」を参照してください。

  • Terraform CLIがインストールされました (Terraform ドキュメント)。

  • Terraform AWS Provider、設定済み (Terraform ドキュメント)。

  • Terraform バックエンドを設定済み (Terraform のドキュメント)

制約事項

  • AWS Control Tower コントロールの場合、このパターンでは、次の形式のグローバル識別子を使用する必要があります。

    arn:<PARTITION>:controlcatalog:::control/<CONTROL_CATALOG_OPAQUE_ID>

    このパターンの以前のバージョンでは、サポートされなくなったリージョン識別子が使用されていました。リージョン識別子からグローバル識別子に移行することをお勧めします。グローバル識別子は、コントロールを管理し、使用できるコントロールの数を増やすのに役立ちます。

    注記

    ほとんどの場合、 の値は <PARTITION>ですaws

製品バージョン

  • AWS Control Tower バージョン 3.2 以降

  • Terraform バージョン 1.5 以降

  • Terraform AWS Provider バージョン 4.67 以降

アーキテクチャ

このセクションでは、このソリューションの概要と、サンプルコードによって確立されたアーキテクチャについて説明します。次の図は、OU 内のさまざまなアカウントに展開されるコントロールを示しています。

組織単位内のすべてのAWSアカウントにデプロイされたコントロールのアーキテクチャ図。

AWS Control Tower コントロールは、その動作ガイダンスに従って分類されます。

コントロールの動作には、主に 3 つのタイプがあります。

  1. 予防コントロールは、アクションの発生を防ぐように設計されています。これらは、 のサービスコントロールポリシー (SCPs) またはリソースコントロールポリシー (RCPs) で実装されます AWS Organizations。予防コントロールのステータスは、適用または無効です。予防コントロールはすべての でサポートされています AWS リージョン。

  2. 検出コントロールは、特定のイベントが発生したときに検出し、アクションをログに記録するように設計されています AWS CloudTrail。これらは AWS Config ルールで実装されます。検出コントロールのステータスは、クリア違反、または無効です。検出コントロールは、 で AWS リージョン サポートされているコントロールにのみ適用されます AWS Control Tower。

  3. プロアクティブコントロールは、 によってプロビジョニングされるリソースをスキャンし AWS CloudFormation 、会社のポリシーと目標に準拠しているかどうかを確認します。準拠していないリソースはプロビジョニングされません。これらはフックでAWS CloudFormation 実装されます。プロアクティブコントロールのステータスは、PASSFAIL、または ですSKIP

コントロールガイダンスは、各コントロールを に適用する方法の推奨プラクティスですOUs。 AWS Control Tower は、必須強く推奨選択的の 3 つのカテゴリのガイダンスを提供します。コントロールのガイダンスは、コントロールの動作とは無関係です。詳細については、「コントロールの動作とガイダンス」を参照してください。

ツール

AWS のサービス

  • AWS CloudFormation は、 AWS リソースの設定、迅速かつ一貫したプロビジョニング、および AWS アカウント リージョン間のライフサイクル全体の管理に役立ちます。

  • AWS Config は、 内のリソース AWS アカウント の詳細と、それらの設定方法を提供します。リソースがどのように相互に関連しているか、またそれらの構成が時間の経過とともにどのように変化したかを特定するのに役立ちます。

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

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

その他のツール

  • HashiCorp Terraform はオープンソースのInfrastructure as Code (IaC) ツールで、コードを使用してクラウドインフラストラクチャとリソースをプロビジョニングおよび管理できます。

コードリポジトリ

このパターンのコードは、 GitHub Terraform リポジトリを使用して AWS Control Tower コントロールをデプロイおよび管理できます

ベストプラクティス

エピック

タスク説明必要なスキル

リポジトリをクローン作成します。

bash シェルで、次のコマンドを入力します。これにより、Terraform リポジトリを使用して、デプロイおよび管理 AWS Control Tower コントロールのクローンが作成されます GitHub。

git clone https://github.com/aws-samples/aws-control-tower-controls-terraform.git
DevOps エンジニア

Terraform バックエンド設定ファイルを編集します。

  1. クローンしたリポジトリで backend.tf ファイルを開きます。

  2. このファイルを編集して、Terraform バックエンドを設定します。このファイルに定義する設定は、環境によって異なります。詳細については、「バックエンドの設定」 (Terraform ドキュメント) を参照してください。 

  3. backend.tf ファイルを保存して閉じます。

DevOps エンジニア、Terraform

Terraform プロバイダー設定ファイルを編集します。

  1. クローンしたリポジトリで provider.tf ファイルを開きます。

  2. このファイルを編集して、Terraform プロバイダーを設定します。詳細については、「プロバイダーの設定」 (Terraform ドキュメント) を参照してください。を が利用可能なリージョン AWS リージョン として設定します AWS Control Tower API。

  3. provider.tf ファイルを保存して閉じます。

DevOps エンジニア、Terraform

設定ファイルを編集します。

  1. クローンしたリポジトリで variables.tfvars ファイルを開きます。

  2. AWS Control Tower ドキュメントですべてのグローバル識別子を開きます。

  3. JSON形式のリストで、実装するコントロールを見つけ、そのグローバル識別子 ({CONTROL_CATALOG_ID} 値とも呼ばれます) OPAQUEをコピーします。たとえば、AWS-GR_AUDIT_BUCKETENCRYPTION_ENABLED コントロールのグローバル識別子は ですk4izcjxhukijhajp6ks5mjxk

  4. controls セクションの control_namesパラメータに、コピーしたグローバル識別子を入力します。

  5. controls セクションの organizational_unit_ids パラメータに、コントロール (ou-1111-11111111 など) を有効にする組織単位の ID を入力します。ID を二重引用符で囲んで入力し、複数をカンマIDsで区切ります。OU を取得する方法の詳細についてはIDs、「OU の詳細の表示」を参照してください。

  6. variables.tfvars ファイルを保存して閉じます。最新の variables.tfvars ファイルの例については、このパターンの「追加情報」セクションを参照してください。

DevOps engineer、GeneralAWS、Terraform

管理アカウントのIAMロールを引き受けます。

管理アカウントで、Terraform 設定ファイルをデプロイする権限を持つIAMロールを引き受けます。必要なアクセス許可とサンプルポリシーの詳細については、「追加情報」セクションのIAM「ロールの最小特権のアクセス許可」を参照してください。での IAMロールの引き受けの詳細については AWS CLI、「」の「 IAMロールを使用する AWS CLI」を参照してください。

DevOps エンジニア、一般 AWS

設定ファイルをデプロイします。

  1. 以下のコマンドを入力して、Terraform を初期化します。

    $ terraform init -upgrade
  2. 次のコマンドを入力して、現在の状態と比較した変更内容をプレビューします。

    $ terraform plan -var-file="variables.tfvars"
  3. Terraform プランの設定変更を見直し、組織に変更を実装することを確認します。

  4. リソースをデプロイするには、次のコマンドを実行します。

    $ terraform apply -var-file="variables.tfvars"
DevOps engineer、GeneralAWS、Terraform
タスク説明必要なスキル

destroy コマンドを実行します。

以下のコマンドを入力して、このパターンでデプロイされたリソースを削除します。

$ terraform destroy -var-file="variables.tfvars"
DevOps engineer、GeneralAWS、Terraform

トラブルシューティング

問題ソリューション

Error: creating ControlTower Control ValidationException: Guardrail <control ID> is already enabled on organizational unit <OU ID> エラー

有効化しようとするコントロールは、ターゲット OU で有効になっています。このエラーは、ユーザーが 、 AWS Management Console、 AWS Control Tower または を介してコントロールを手動で有効にした場合に発生する可能性があります AWS Organizations。Terraform 設定ファイルをデプロイするには、次のいずれかのオプションを使用できます。

オプション 1: Terraform の現在の状態ファイルを更新する

Terraform の現在の状態ファイルにリソースをインポートできます。apply コマンドを再実行すると、Terraform はこのリソースをスキップします。次の手順に従い、現在の Terraform 状態にリソースをインポートします。

  1. AWS Control Tower 管理アカウントで、次のコマンドを入力して、 の Amazon リソースネーム (ARNs) のリストを取得します。ここでOUs、 <root-ID>は組織ルートです。この ID 取得の詳細については、「ルートの詳細を表示する」を参照してください。

    aws organizations list-organizational-units-for-parent --parent-id <root-ID>
  2. 前のステップで返された OU ごとに、次のコマンドを入力します。ここで、 <OU-ARN>は OU ARNの です。

    aws controltower list-enabled-controls --target-identifier <OU-ARN>
  3. をコピーARNsし、必要なモジュールで Terraform インポートを実行して、Terraform 状態に含まれるようにします。手順については、「インポート」 (Terraform ドキュメント) を参照してください。

  4. エピック」セクションにある「設定のデプロイ」の手順を繰り返します。

オプション 2: コントロールを無効にする

実稼働以外の環境で作業している場合は、コンソールでコントロールを無効にできます。エピックセクションの設定をデプロイするのステップを繰り返して、再度有効にします。コントロールが無効になる期間があるため、このアプローチは実稼働環境にはお勧めしません。本番稼働環境でこのオプションを使用する場合は、 を一時的に適用するなどの一時的なコントロールを実装できますSCP AWS Organizations。

関連リソース

AWS ドキュメント

その他のリソース

追加情報

variables.tfvars ファイルの例

以下に、更新された variables.tfvars ファイルの例を示します。このサンプルでは、AWS-GR_ENCRYPTED_VOLUMES コントロール (グローバル ID: 503uicglhjkokaajywfpt6ros) と AWS-GR_SUBNET_AUTO_ASSIGNPUBLIC_IP_DISABLED コントロール (グローバル ID: ) を有効にします50z1ot237wl8u1lv5ufau6qqo。グローバル のリストについてはIDs、 AWS Control Tower ドキュメントの「すべてのグローバル識別子」を参照してください。

controls = [ { control_names = [ "503uicglhjkokaajywfpt6ros", ... ], organizational_unit_ids = ["ou-1111-11111111", "ou-2222-22222222"...], }, { control_names = [ "50z1ot237wl8u1lv5ufau6qqo", ... ], organizational_unit_ids = ["ou-1111-11111111"...], }, ]

IAMロールの最小特権のアクセス許可

このパターンでは、管理アカウントで IAMロールを引き受ける必要があります。一時的な権限を持つロールを割り当て、最小特権の原則に従って権限を制限するのがベストプラクティスです。次のサンプルポリシーでは、 AWS Control Tower コントロールを有効または無効にするために必要な最小限のアクションを許可します。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "controltower:EnableControl", "controltower:DisableControl", "controltower:GetControlOperation", "controltower:ListEnabledControls", "organizations:AttachPolicy", "organizations:CreatePolicy", "organizations:DeletePolicy", "organizations:DescribeOrganization", "organizations:DetachPolicy", "organizations:ListAccounts", "organizations:ListAWSServiceAccessForOrganization", "organizations:ListChildren", "organizations:ListOrganizationalUnitsForParent", "organizations:ListParents", "organizations:ListPoliciesForTarget", "organizations:ListRoots", "organizations:UpdatePolicy" ], "Resource": "*" } ] }