Control Towerを使ってプロビジョニング前に非準拠リソースをはじく仕組みを数クリックで組織内に一括展開する

この記事でやっていること

  • CDK / CloudFormationでリソースを構築」していることを前提とする
  • 事前定義されたルールに非準拠のリソースはプロビジョニング前にブロック」する(例:S3バケットでサーバサイド暗号化を有効化していない)
  • この仕組みを「Control Towerで複数のアカウントに一括で展開」する(OrganizationsのOU指定で展開)→本記事のキモ

なんでそんなことがしたいか

  • 発見的ガードレール(望ましくない設定を検出)が展開されている前提
  • 本記事の仕組みが「ないとき」
    • リソースプロビジョニング「」に発見的ガードレールに怒られる
    • 開発者は「先に言ってよ!」という気持ちになる。管理者に素行が悪い利用者として目をつけられる恐れ
    • 管理者は、発見的ガードレールからの「莫大な件数のアラート」に苦しむ
  • 本記事の仕組みが「あるとき」
    • リソースプロビジョニング「」に非準拠に気づけて、開発者も管理者もハッピー

概要

11/28にこんなアップデートが出ていました。

aws.amazon.com

Comprehensive controls management = 包括的な統制管理(?)

金融系の方が好きそうなワードですね。

このアップデートの主題は以下記事で解説いただいているようなので、そちらを参照いただけると良いかと思います。

dev.classmethod.jp

個人的には、アップデート文面の下の方にちょろっと「リソースがプロビジョニングされる前に非準拠リソースをブロックする仕組みをControl Towerで展開できるよー」と書いてある方が気になったのでそちらを解説します。

動作イメージ

数クリックだけで以下のような仕組みを「Control Towerが自動的に展開」してくれます。

ざっくり言うと、「CloudFormation Hook(*1)」でリソースデプロイ前に「CloudFormation Guard(*2)」による準拠/非準拠チェックを実行する仕組みが指定OU以下の全アカウントに展開されます。開発者がパイプライン等から、CDKやCloudFormationでスタックを作成しようとすると、CloudFormation Guardでチェックされて、「非準拠リソースはプロビジョニング前にブロック」されます。

(*1)CloudFormation Hook:CloudFormationによるリソースの作成・変更・削除前に処理を挟める機能
(*2)CloudFormation Guard:CloudFormationテンプレートのリソース設定が事前定義されたルールに則っているかチェックできるツール

この仕組みは、Control Tower上では「コントロール」として定義されます。コントロールには「予防」「検出」「プロアクティブ」の3つの動作種別があります。今回の仕組みは「動作種別がプロアクティブのコントロール」です。コントロールをOU(*3)に適用します。

(*3)OU:Organizational Unit。AWS Organizationsにおいて複数のアカウントをグルーピングして階層化する論理リソース

やってみましょう

Control Towerのコンソールで「コントロールライブラリ」を開きます。

前提条件として、以下のコントロールを対象のOUに適用しておく必要があります。アカウント側でCloudFormationのフックの管理を禁止するコントロールです。動作種別は「予防」(操作を禁止する)になっています。このコントロールを選択し、対象のOUに適用してください。

その後、適用したいプロアクティブなコントロールを選択します。今回は「Amazon S3バケットにサーバー側の暗号化の設定を必須にする」を適用してみます。コントロールを選択、対象のOUに適用してください。

以下のように、対象アカウントの「有効なコントロール」にて、対象のコントロールが適用されていることが確認できます。

では、CDKで以下の暗号化していないバケットをデプロイしてみましょう。

const bucket = new s3.Bucket(this, 'NonCompliantBucket', {
encryption: s3.BucketEncryption.UNENCRYPTED
});

 

デプロイされたスタックを見てみると、以下のようにデプロイがブロックされました。
「The following hook(s) faild: [Control Tower::Guard::Hook]」と表示されています。

以下のように修正してデプロイします。「SSE-S3」で暗号化しています。

const bucket = new s3.Bucket(this, 'CompliantBucket', {
encryption: s3.BucketEncryption.S3_MANAGED
});

 

ルールに準拠したリソースなので、正常にS3バケットが作成されました。

このように、リソースプロビジョニング前にルールへの準拠状況をチェックして、非準拠リソースをブロックすることができました。

この仕組みが「Control Towerによって対象OU配下の全アカウントに展開」されています。

まとめ

このような仕組みをControl Towerを使えば「数クリックでぱぱっと多数のアカウントに展開できる」のは管理者からするとうれしいのではないでしょうか。パイプラインのもっと早いステージでチェックする仕組みも作れるとは思いますが、「こんなに簡単に組織内のアカウント群に一括展開することは難しい」と思います。CDKを含むCloudFormation経由でプロビジョニングされるリソース限定という点はありますが、活用シーンは少なくないと思いました。

 

以上