複数リージョンのAWS Security Hubと、Amazon GuardDutyを一括で有効化するAWS CloudFormationテンプレート

AWS

2025.1.22

Topics

はじめに

こんにちは。YUJIです。

今回は、各リージョンにおいて、一括でAmazon GuardDutyとAWS Security Hubを有効化できる
AWS CloudFormationテンプレートを紹介します。

制約上、AWS Organizationsを使えない状況でも
本記事のコードを参照してCloudFormationのスタックを一つ立てるだけで、一括で有効化が可能です。

この記事で扱うこと

  • 一括で複数リージョンのAmazon GuardDutyとAWS Security Hubを有効化するAWS CloudFormation テンプレート
    • スタックが展開される仕組み
    • 実際の作業手順

この記事で扱わないこと

  • AWS Security Hubの有効化の前置きとしてのAWS Config有効化
  • 各リソースの設定チューニング
  • 有効化した後のAWS Security Hubにおける通知設定

背景

読み飛ばしても問題ありません。

  • セキュリティ面での背景
    • Amazon GuardDutyとAWS Security Hubを有効化しておきたい。
    • 不正なアクティビティの通知が目的
    • 全リージョンで有効化したい
      • 普段使ってないリージョンに不正に建てられたリソースを見つけるため、デフォルトで有効なリージョン全てが対象。
  • 作業面での背景
    • AWS Organizationsでマルチアカウント・マルチリージョンに一括有効化を行い、一元管理するのがベスト
    • ただし、作業対象のアカウントは制約上、AWS Organizationsを自由に扱うことが出来ない。
    • 手動でリージョンを切り替え→有効化 のポチポチ作業は避けたい。
    • ミスの温床になる上、切り戻しが手間。

実際の作業

下記の仕組みで、各リージョンでの一括有効化を行います。

事前作業(IAMロールの作成)

CloudFormation StackSets という機能を使って各リージョンにスタックを配布するため
IAMロールが2つ必要になります。

  • AWSCloudFormationStackSetExecutionRole
  • AWSCloudFormationStackSetAdministrationRole

AWSがこのロールを作るためのCloudFormationテンプレートを用意してくれているので
本記事内では、CloudShellを経由してAWS CLIでロールを作成します。
(※既にStackSets機能を使用したことがあり、該当のIAMロールが存在する方は飛ばしていただいて構いません。)

■対象のアカウントでCloudShellを開き、下記コマンドを実行する

①ログイン中のアカウントIDを変数に設定

MASTER_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)

②AWSCloudFormationStackSetExecutionRoleを展開

aws cloudformation create-stack \
  --stack-name AWSCloudFormationStackSetExecutionRole \
  --template-url https://s3.amazonaws.com/cloudformation-stackset-templates-us-east-1/managed_account_role.template \
  --parameters ParameterKey=MasterAccountId,ParameterValue=$MASTER_ACCOUNT_ID \
  --capabilities CAPABILITY_NAMED_IAM

③AWSCloudFormationStackSetAdministrationRoleを展開

aws cloudformation create-stack \
  --stack-name AWSCloudFormationStackSetAdministrationRole \
  --template-url https://s3.amazonaws.com/cloudformation-stackset-templates-us-east-1/master_account_role.template \
  --capabilities CAPABILITY_NAMED_IAM

これでCloudFormationを経由して各IAMロールが作成されました。
事前準備は完了です。

本編

Amazon GuardDutyとAWS Security Hubが有効されていない状態からスタートします。

まずは、中身が下記のようになっているCloudFormationスタック用yamlファイルを作成します。
コピーするなどして、予め手元にご用意ください。

AWSTemplateFormatVersion: "2010-09-09"
Description: Enable AWS Security Hub and GuardDuty across multiple regions using StackSet.

Parameters:
  TargetAccountID:
    Type: String
    Description: Target AWS Account ID where StackSet will be deployed.
    AllowedPattern: "^[0-9]{12}$"  # 12桁のアカウントIDのみ許可
    ConstraintDescription: "The Account ID must be a 12-digit number."

Resources:
  # StackSetの作成
  SecurityHubGuardDutyStackSet:
    Type: AWS::CloudFormation::StackSet
    Properties:
      StackSetName: SecurityHubGuardDutyStackSet
      PermissionModel: SELF_MANAGED
      AdministrationRoleARN: 
        Fn::Sub: arn:aws:iam::${TargetAccountID}:role/AWSCloudFormationStackSetAdministrationRole
      ExecutionRoleName: AWSCloudFormationStackSetExecutionRole
      TemplateBody: |
        AWSTemplateFormatVersion: "2010-09-09"
        Description: Enable AWS Security Hub and GuardDuty in all supported regions.

        Resources:
          SecurityHub:
            Type: AWS::SecurityHub::Hub

          GuardDutyDetector:
            Type: AWS::GuardDuty::Detector
            Properties:
              Enable: true
              FindingPublishingFrequency: "FIFTEEN_MINUTES"
            DependsOn: SecurityHub
      # StackSetインスタンスをデフォルトリージョンに展開
      StackInstancesGroup:
        - DeploymentTargets:
            Accounts:
              - !Ref TargetAccountID
          Regions:
            - us-east-1
            - us-east-2
            - us-west-1
            - us-west-2
            - ap-south-1
            - ap-northeast-1
            - ap-northeast-2
            - ap-northeast-3
            - ap-southeast-1
            - ap-southeast-2
            - ca-central-1
            - eu-central-1
            - eu-west-1
            - eu-west-2
            - eu-west-3
            - eu-north-1
            - sa-east-1

CloudFormationのサービスページから、[スタックの作成]→[新しいリソースを使用]を選択します。

テンプレートファイルのアップロードを選択し、上述のyamlファイルを貼り付けます。

TargetAccountIDに、作業対象のアカウントID(ログイン中のID)を貼り付けます。

その他はデフォルトのまま送信します。

これで、画像の①の処理は完了です。
あとは、自動で②(StackSetsの作成)→③(各リージョンへのスタック配布、リソースの展開)が行われます。

各サービスも、有効化されていることを確認できました。

これで作業は完了です。
ただし、AWS Configを有効化するまではAWS Security Hubのセキュリティスコア評価は行えなかったり
通知基盤として機能させるにはAmazon EventBridgeを追加で設定する必要がある など
チューニングが必要なので、適宜実施していただければと思います。
(AWS Configを有効化する際は、料金にはお気をつけて!)

ここまでの手順で
「各リージョンに切り替えて手動でポチポチしたりする事なく、Amazon GuardDutyとAWS Security Hubを有効化する。」という目的を達成できました。
手順をなぞった方、お疲れ様でした。

スタックの展開に失敗する場合

どこかのリージョンで、既にAmazon GuardDuty or AWS Security Hubが有効化されている場合、エラーになります。
この場合のアプローチとして

  • yaml上で該当のリージョンを外すことで回避する
  • yaml内のStackSetsリソース内で、展開に失敗したリージョンは無視(その他リソースは保持するポリシーにする)という記述に編集する。
    • スタック展開時の保持ポリシー設定ではStackSetsに干渉できないため。

のどちらを取るか という事になりますが
後者は現状やや無理があると感じたので、前者の対応をおすすめします。

切り戻ししたい場合

元となるスタックを消すだけで、そこから伸びたStackSetsも消えるため
このCloudFormationで有効化したAmazon GuardDutyおよびAWS Security Hubは全て無効の状態に戻ります。

まとめ

この記事では、AWS Organizationsが使えない環境下でも
一括でAmazon GuardDutyとAWS Security Hubを有効化するためのAWS CloudFormationテンプレートを紹介いたしました。

今回のテンプレートはあくまで一例なので、yamlの記述を自分好みに変更したり、要件応じてにカスタマイズしていただければと思います。

ポチポチ作業に苦しみたくないが、AWS Organizationsは使えないという、同じ悩みを抱えてそうな方に届けば幸いです。
最後まで読んでいただき、ありがとうございました。

テックブログ新着情報のほか、AWSやGoogle Cloudに関するお役立ち情報を配信中!

YUJI

2023年9月に入社 邦ロックとVtuber好き

Recommends

こちらもおすすめ

Special Topics

注目記事はこちら