AWS CDK と AWS を使用して AWS Control Tower コントロールをデプロイして管理する CloudFormation - AWS 規範ガイダンス

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

AWS CDK と AWS を使用して AWS Control Tower コントロールをデプロイして管理する CloudFormation

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

コードリポジトリ: aws-control-tower-controls-cdk

環境:本稼働

テクノロジー: セキュリティ、アイデンティティ、コンプライアンス CloudNative、インフラストラクチャ、管理とガバナンス

AWS サービス: AWS CloudFormation、AWS Control Tower、AWS OrganizationsAWS CDK

[概要]

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

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

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

AWS Control Tower コントロールを実装することで、AWS landing zone の強固なセキュリティ基盤を確立できます。このパターンを使用して、 CloudFormation および AWS CDK を介してコントロールを IaC としてデプロイすることで、ランディングゾーンのコントロールを標準化し、より効率的にデプロイおよび管理できます。このソリューションでは、デプロイ中に cdk_nag を使用して AWS CDK アプリケーションをスキャンします。このツールは、アプリケーションが AWS のベストプラクティスに準拠しているかどうかをチェックします。

AWS Control Tower コントロールを IaC としてデプロイするには、AWS CDK の代わりに HashiCorp Terraform を使用することもできます。詳細については、「Deploy and manage AWS Control Tower controls by using Terraform」を参照してください。

ターゲットオーディエンス

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

前提条件と制限

前提条件

制限

  • このパターンは、デプロイアカウントから組織の管理アカウントまで、AWS アカウント全体にこのソリューションをデプロイするための手順を示しています。テスト目的で、このソリューションを管理アカウントに直接デプロイすることもできますが、この設定の手順は明示されていません。

製品バージョン

  • Python バージョン 3.9 以降

  • npm バージョン 2.9.0 以降

アーキテクチャ

ターゲット アーキテクチャ

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

組織単位のすべての AWS アカウントにデプロイされる統制のアーキテクチャ図

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

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

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

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

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

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

ツール

AWS サービス

  • AWS Cloud Development Kit (AWS CDK) は、AWS クラウドインフラストラクチャをコードで定義してプロビジョニングするのに役立つソフトウェア開発フレームワークです。AWS CDK ツールキットは、AWS CDK アプリケーションを操作するための主要なツールです。

  • AWS CloudFormation は、AWS リソースをセットアップし、迅速かつ一貫したプロビジョニングを行い、AWS アカウントとリージョン全体のライフサイクルを通じてリソースを管理するのに役立ちます。

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

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

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

その他のツール

  • cdk_nag は、ルールパックを組み合わせて AWS Cloud Development Kit (AWS CDK) アプリケーションがベストプラクティスに準拠しているかどうかを確認するオープンソースのツールです。

  • npm は Node.js 環境で動作するソフトウェアレジストリで、パッケージの共有や借用、プライベートパッケージのデプロイの管理に使用されます。

  • Python」は汎用のコンピュータープログラミング言語です。

コードリポジトリ

このパターンのコードは、 GitHub AWS CDK リポジトリを使用した AWS Control Tower コントロールのデプロイ で入手できます。cdk.json ファイルを使用して AWS CDK アプリケーションを操作し、package.json ファイルを使用して npm パッケージをインストールします。

ベストプラクティス

  • 最小特権の原則 (IAM ドキュメント) に従ってください。このパターンで提供されるサンプル IAM ポリシーと信頼ポリシーには最低限必要なアクセス権限が含まれており、管理アカウントで作成される AWS CDK スタックはこれらの権限によって制限されます。

  • AWS コントロールタワー管理者向けのベストプラクティス (AWS Control Tower ドキュメント) に従ってください。

  • AWS CDK でクラウドインフラストラクチャを開発およびデプロイするためのベストプラクティス (AWS CDK ドキュメント) に従ってください。

  • AWS CDK を起動するときは、起動テンプレートをカスタマイズして、管理アカウント内の任意のリソースを読み書きできるポリシーと信頼できるアカウントを定義します。詳細については、「起動のカスタマイズ」を参照してください。

  • cfn_nag などのコード分析ツールを使用して、生成された CloudFormation テンプレートをスキャンします。cfn-nag ツールは、インフラストラクチャが安全でないことを示す CloudFormation テンプレート内のパターンを探します。cdk-nag を使用して、cloudformation-include モジュールを使用して CloudFormation テンプレートを確認することもできます。

エピック

タスク説明必要なスキル

管理アカウントで IAM ロールを作成します。

  1. 追加情報」セクションの IAM ポリシーで定義されている権限を使用して、管理アカウントに IAM ポリシーを作成します。詳細については、IAM ドキュメントの「IAM ポリシーの作成」を参照してください。ポリシーの Amazon リソースネーム (ARN) をメモします。以下は ARN の例です。

    arn:aws:iam::<MANAGEMENT-ACCOUNT-ID>:policy/<POLICY-NAME>
  2. 管理アカウントに IAM ロールを作成し、前のステップで作成した IAM アクセス権限ポリシーをアタッチし、「追加情報」セクションの「信頼ポリシー」にカスタム信頼ポリシーをアタッチします。詳細については、IAM ユーザーガイドの「カスタム信頼ポリシーを使用したロールの作成 (コンソール)」を参照してください。以下は、新しいロールの ARN の例です。

    arn:aws:iam:: <MANAGEMENT-ACCOUNT-ID>:role/<ROLE-NAME>
DevOps エンジニア、AWS 全般

AWS CDK を起動します。

  1. 管理アカウントで、AWS CDK を起動する権限を持つロールを引き受けます。

  2. 次のコマンドを入力して、以下を置き換えます。

    • <MANAGEMENT-ACCOUNT-ID> は組織の管理アカウントの ID です。

    • <AWS-CONTROL-TOWER-REGION> は、Control Tower がデプロイされている AWS リージョンです。リージョンコードの完全なリストについては、「AWS 全般のリファレンス」の「リージョンエンドポイント」を参照してください。

    • <DEPLOYMENT-ACCOUNT-ID> は、デプロイアカウントの ID です。

    • <DEPLOYMENT-ROLE-NAME> は、デプロイアカウントの IAM ロールの名前です。

    • <POLICY-NAME> は、管理アカウントで作成したポリシーの名前です。

    $ npx cdk bootstrap aws://<MANAGEMENT-ACCOUNT-ID>/<AWS-CONTROL-TOWER-REGION> \ --trust arn:aws:iam::<DEPLOYMENT-ACCOUNT-ID>:role/<DEPLOYMENT-ROLE-NAME> \ --cloudformation-execution-policies arn:aws:iam::<MANAGEMENT-ACCOUNT-ID>:policy/<POLICY-NAME>
DevOps エンジニア、AWS 全般、Python

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

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

git clone https://github.com/aws-samples/aws-control-tower-controls-cdk.git
DevOps エンジニア、AWS 全般

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

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

  2. ACCOUNT_ID パラメータに、管理アカウントの ID を入力します。

  3. <AWS-CONTROL-TOWER-REGION> パラメータには、AWS Control Tower がデプロイされている AWS リージョンを入力します。

  4. ROLE_ARN パラメータには、管理アカウントで作成したロールの ARN を入力します。

  5. GUARDRAILS_CONFIGURATION セクションの Enable-Control パラメータに、コントロール API 識別子を入力します。識別子を二重引用符で囲んで入力し、複数の識別子はカンマで区切ります。各コントロールには、AWS Control Tower が利用可能なリージョンごとに一意の API 識別子があります。コントロール識別子を見つけるには、以下の手順に従います。

    1. コントロールメタデータのテーブルで、有効にするコントロールを探します。

    2. [Control API 識別子 (リージョン別)] 列で、arn:aws:controltower:us-east-1::control/AWS-GR_ENCRYPTED_VOLUMES など、API コールを行うリージョンの API オペレーションを見つけます。

    3. リージョン識別子 (AWS-GR_ENCRYPTED_VOLUMES など) からコントロール識別子を抽出します。

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

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

タスク説明必要なスキル

デプロイアカウントで IAM ロールを引き受けます。

デプロイアカウントで、管理アカウントに AWS CDK スタックをデプロイする権限を持つ IAM ロールを引き受けます。AWS CLI で IAM ロールを引き受ける方法の詳細については、「AWS CLI で IAM ロールを使用する」を参照してください。

DevOps エンジニア、AWS 全般

環境をアクティブ化します。

Linux または macOS を使用している場合:

  1. 以下のコマンドを入力して仮想環境を作成します。

    $ python3 -m venv .venv
  2. 仮想環境の作成後、次のコマンドを入力して仮想環境を有効化します。

    $ source .venv/bin/activate

Windows を使用している場合:

  1. 次のコマンドを入力して仮想環境をアクティブ化します。

    % .venv\Scripts\activate.bat
DevOps エンジニア、AWS 全般

依存関係をインストールします。

仮想環境がアクティブになったら、次のコマンドを入力して install_deps.sh スクリプトを実行します。このスクリプトは、必要な依存ファイルをインストールします。

$ ./scripts/install_deps.sh
DevOps エンジニア、AWS 全般、Python

スタックをデプロイします。

CloudFormation スタックを合成してデプロイするには、次のコマンドを入力します。

$ npx cdk synth $ npx cdk deploy
DevOps エンジニア、AWS 全般、Python

関連リソース

AWS ドキュメント

その他のリソース

追加情報

constants.py ファイルの例

以下は、更新された constants.py ファイルの例です。

ACCOUNT_ID = 111122223333 AWS_CONTROL_TOWER_REGION = us-east-2 ROLE_ARN = "arn:aws:iam::111122223333:role/CT-Controls-Role" GUARDRAILS_CONFIGURATION = [ { "Enable-Control": { "AWS-GR_ENCRYPTED_VOLUMES", ... }, "OrganizationalUnitIds": ["ou-1111-11111111", "ou-2222-22222222"...], }, { "Enable-Control": { "AWS-GR_SUBNET_AUTO_ASSIGN_PUBLIC_IP_DISABLED", ... }, "OrganizationalUnitIds": ["ou-2222-22222222"...], }, ]

IAM ポリシー

以下のサンプルポリシーでは、デプロイアカウントから管理アカウントに AWS CDK スタックをデプロイするときに 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:DescribeOrganizationalUnit", "organizations:DetachPolicy", "organizations:ListAccounts", "organizations:ListAWSServiceAccessForOrganization", "organizations:ListChildren", "organizations:ListOrganizationalUnitsForParent", "organizations:ListParents", "organizations:ListPoliciesForTarget", "organizations:ListRoots", "organizations:UpdatePolicy", "ssm:GetParameters" ], "Resource": "*" } ] }

信頼ポリシー

以下のカスタム信頼ポリシーでは、デプロイアカウントの特定の IAM ロールが管理アカウントの IAM ロールを引き継ぐことを許可しています。以下に置き換えます:

  • <DEPLOYMENT-ACCOUNT-ID> は、デプロイアカウントの ID です

  • <DEPLOYMENT-ROLE-NAME> は、管理アカウントでロールを引き受けることが許可されているデプロイアカウント内のロールの名前です。

{ “Version”: “2012-10-17”, “Statement”: [ { “Effect”: “Allow”, “Principal”: { “AWS”: “arn:aws:iam::<DEPLOYMENT-ACCOUNT-ID>:role/<DEPLOYMENT-ROLE-NAME>” }, “Action”: “sts:AssumeRole”, “Condition”: {} } ] }