翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
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 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 Organizations と AWS Control Tower の AWS Organizations ランディングゾーンで組織として管理されているアクティブな AWS アカウント。手順については、「アカウント構造の作成
」 (AWS Well-Architected Labs) を参照してください。 インストールおよび設定済みの AWS コマンドラインインターフェイス (AWS CLI)。
AWS CDK 用にインストールおよび設定
済みのノードパッケージマネージャ (npm)。 AWS CDK の前提条件。
デプロイアカウントで既存の AWS Identity and Access Management (IAM) ロールを引き受けるアクセス権限。
AWS CDK の起動に使用できる IAM ロールを引き受けるアクセス権限。ロールには、 CloudFormation リソースを変更してデプロイするためのアクセス許可が必要です。詳細については、AWS CDK ドキュメントの「ブートストラップ」を参照してください。
組織の管理アカウントで IAM ロールとポリシーを作成するアクセス権限。詳細については、IAM ドキュメントの「IAM リソースにアクセスするために必要なアクセス権限」を参照してください。
CT.CLOUDFORMATION.PR.1 という識別子の付いたサービスコントロールポリシー (SCP) ベースのコントロールを適用します。プロアクティブなコントロールをデプロイするには、この SCP を有効にする必要があります。手順については、「AWS CloudFormation レジストリ 内のリソースタイプ、モジュール、フックの管理を禁止する」を参照してください。
制限
このパターンは、デプロイアカウントから組織の管理アカウントまで、AWS アカウント全体にこのソリューションをデプロイするための手順を示しています。テスト目的で、このソリューションを管理アカウントに直接デプロイすることもできますが、この設定の手順は明示されていません。
製品バージョン
Python バージョン 3.9 以降
npm バージョン 2.9.0 以降
アーキテクチャ
ターゲット アーキテクチャ
このセクションでは、このソリューションの概要と、サンプルコードによって確立されたアーキテクチャについて説明します。次の図は、OU 内のさまざまなアカウントに展開されているコントロールを示しています。
![組織単位のすべての AWS アカウントにデプロイされる統制のアーキテクチャ図](images/pattern-img/7d0d5e37-58ac-4621-b6b0-cb8c1c767ab0/images/787b7ca0-9d29-4294-a407-6019e38f08c7.png)
AWS Control Tower コントロールは、その動作とガイダンスに従って分類されています。
コントロールの動作には、主に 3 つのタイプがあります。
予防コントロールは、アクションの発生を防ぐように設計されています。これらは AWS Organizations のサービスコントロールポリシー (SCP) で実装されます。予防コントロールのステータスは、適用または無効です。予防コントロールは、すべての AWS リージョンでサポートされています。
検出コントロールは、特定のイベントが発生したときに検出し、 でアクションを記録するように設計されています CloudTrail。これらは、AWS Config ルールを使用して実装されます。検出コントロールのステータスは、クリア、違反、または無効です。検出コントロールは、AWS Control Tower がサポートする AWS リージョンでのみ適用されます。
プロアクティブコントロールは、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 つの組織に統合し、作成して一元管理するためのアカウント管理サービスです。
その他のツール
コードリポジトリ
このパターンのコードは、 GitHub AWS CDK リポジトリを使用した AWS Control Tower コントロールのデプロイ
ベストプラクティス
最小特権の原則 (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 ロールを作成します。 |
| DevOps エンジニア、AWS 全般 |
AWS CDK を起動します。 |
| DevOps エンジニア、AWS 全般、Python |
リポジトリをクローン作成します。 | bash シェルで、次のコマンドを入力します。これにより、 から AWS CDK リポジトリを使用して AWS Control Tower のデプロイ
| DevOps エンジニア、AWS 全般 |
AWS CDK 設定ファイルを編集します。 |
|
タスク | 説明 | 必要なスキル |
---|---|---|
デプロイアカウントで IAM ロールを引き受けます。 | デプロイアカウントで、管理アカウントに AWS CDK スタックをデプロイする権限を持つ IAM ロールを引き受けます。AWS CLI で IAM ロールを引き受ける方法の詳細については、「AWS CLI で IAM ロールを使用する」を参照してください。 | DevOps エンジニア、AWS 全般 |
環境をアクティブ化します。 | Linux または macOS を使用している場合:
Windows を使用している場合:
| DevOps エンジニア、AWS 全般 |
依存関係をインストールします。 | 仮想環境がアクティブになったら、次のコマンドを入力して install_deps.sh スクリプトを実行します。このスクリプトは、必要な依存ファイルをインストールします。
| DevOps エンジニア、AWS 全般、Python |
スタックをデプロイします。 | CloudFormation スタックを合成してデプロイするには、次のコマンドを入力します。
| DevOps エンジニア、AWS 全般、Python |
関連リソース
AWS ドキュメント
「コントロールについて」 (AWS Control Tower ドキュメント)
AWS Control Tower コントロールライブラリ (AWS Control Tower ドキュメント)
ツールキットコマンド (AWS CDK ドキュメント)
Deploy and manage AWS Control Tower controls by using Terraform (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”: {} } ] }