AWS Control Towerの「コントロール」とは

Control Towerにはリスクのある操作を予防・発見するための「コントロール」という機能があります。この機能は危険な操作の禁止や、危険な設定の検出時の通知を行います。

コントロールのカテゴリ

コントロールは3つのカテゴリが存在します。

  • 必須
  • 強く推奨
  • 選択的

必須コントロール

必須コントロールは、Control Towerの正常な稼働に必須な禁止事項を定義しています。
2023年9月時点で23種類の必須コントロールが存在します。

公式ドキュメントによると

必須コントロールは AWS Control Tower によって所有され、ランディングゾーンのすべての OU に適用されます。これらのコントロールはランディングゾーンのセットアップ時にデフォルトで適用され、無効にすることはできません。

参考:必須コントロール

この文章から、必須コントロールはデフォルトで有効化されており、無効化はできない(常に「有効化」されている)ことがわかります。ただ、デフォルトで設定されているOU以外にも新たに有効化範囲を広げることができるかどうかは、試してみないとわからなかったので、実際に試してみました。

必須コントロールはユーザー側で有効/無効ができない

Security OUで既に有効化されている必須コントロールを他のOUで有効化しようとした際、「コントロールを有効にする」ボタンが表示されないことを確認しました。

例)コントロール名:[AWS-GR_AUDIT_BUCKET_PUBLIC_READ_PROHIBITED] ログアーカイブのパブリック読み取りアクセス設定を検出する

このコントロールは、ログアーカイブアカウントのS3バケットへのパブリック読み取りアクセスが有効かどうかを検出する必須コントロールとして、Security OUで既に有効化されています。

参考:Detect Public Read Access Setting for Log Archive (ログアーカイブのパブリック読み取りアクセス設定を検出する)

必須ではないコントロールは「コントロールを有効化する」ボタンが表示されています。

コントロールを適用する際の手順は以下の通りです。

  1. 適用したいコントロールを選択する
  2. 「コントロールを有効化する」ボタンをクリックする
  3. 適用先のOUを選択する

マネジメントコンソールから確認したこと

Administrator権限を持ってログインしても、必須コントロールの有効化は行えませんでした。このことから、ユーザー権限の問題ではないことが確認できます。

公式ドキュメントを見ると

以下のコントロールは、AWS Control Tower API を使用してアクティブ化または非アクティブ化することはできません。リージョン拒否コントロールを除き、これらのすべては必須コントロールです。

という記載がありました。

参考:AWS Control Tower API で変更できないコントロール

この情報から、AWSの仕様として必須コントロールは有効化できないので、「コントロールを有効化する」ボタンが表示されないようです。

AWS CLIコマンドから確認したこと

コンソールからはできないことを確認しましたが、AWS CLIコマンドを使用しても同様の結果が得られるか確認しました。

まず、必須ではないコントロールをAWS CLIコマンドで有効化してみました。

例)コントロール名:[AWS-GR_S3_ACCOUNT_LEVEL_PUBLIC_ACCESS_BLOCKS_PERIODIC] パブリックアクセスをブロックする Amazon S3 の設定がアカウントで true に設定されているかどうかを検出する

Sandbox OUでこのコントロールがまだ有効になっていないことを確認します。

Sandbox OUでコントロールを有効にします。
コントロールを有効にするためのコマンド「enable-control」を使用します。

aws controltower enable-control \
--control-identifier arn:aws:controltower:ap-northeast-1::control/AWS-GR_S3_ACCOUNT_LEVEL_PUBLIC_ACCESS_BLOCKS_PERIODIC \
--target-identifier arn:aws:organizations::123456789012:ou/o-xxxxxxxxxx/ou-xxxx-xxxxxxxx \
--region ap-northeast-1

以下の3つのパラメータを指定して実行します。

  • --control-identifier
    • 有効化したいコントロールのAPI コントロール識別子を指定します。
  • --target-identifier
    • コントロールを適用する組織単位 (OU) のARNを指定します。
  • --region
    • コントロールを有効化する対象のAWSリージョンを指定します。

成功するとコマンドの実行結果として以下の出力が返ってきます。

{
"operationIdentifier": "68exxxxx-5401-xxxx-bad0-xx57d1xxxxxx"
}

Sandbox OUでコントロールが有効になったことを確認します。

必須ではないコントロールはコマンドで有効化できました。

次に、必須コントロールを同じ手順で有効化できるか試してみました。

例)コントロール名:[AWS-GR_AUDIT_BUCKET_PUBLIC_READ_PROHIBITED] ログアーカイブのパブリック読み取りアクセス設定を検出する

--control-identifierパラメータで指定している「API コントロール識別子」だけ変えて実行します。

aws controltower enable-control \
--control-identifier arn:aws:controltower:ap-northeast-1::control/AWS-GR_AUDIT_BUCKET_PUBLIC_READ_PROHIBITED \
--target-identifier arn:aws:organizations::123456789012:ou/o-xxxxxxxxxx/ou-xxxx-xxxxxxxx \
--region ap-northeast-1

案の定、以下のエラーメッセージが出力されて有効化できませんでした。

An error occurred (ValidationException) when calling the EnableControl operation: Control with ARN arn:aws:controltower:ap-northeast-1::control/AWS-GR_AUDIT_BUCKET_PUBLIC_READ_PROHIBITED is enforced by default and cannot be enabled

このエラーメッセージから、「デフォルトで強制されており、有効にすることはできない」ということが分かります。

参考:コントロール API の例

まとめ

必須コントロールは他のOUで有効化できないことを検証しました。
必須コントロールを無効にすることはできないことは認識していましたが、他のOUで有効化することもできないことを確認できました。
必須コントロールは常に有効であり、有効/無効を変更することができないため、「コントロールを有効にする」ボタンが表示されないと考えられます。