複数リージョンのAWS Security Hubと、Amazon GuardDutyを一括で有効化するAWS CloudFormationテンプレート
はじめに
こんにちは。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に関するお役立ち情報を配信中!
Follow @twitter2023年9月に入社 邦ロックとVtuber好き
Recommends
こちらもおすすめ
Special Topics
注目記事はこちら
データ分析入門
これから始めるBigQuery基礎知識
2024.02.28
AWSの料金が 10 %割引になる!
『AWSの請求代行リセールサービス』
2024.07.16