はじめに
おはこんばんちは。SREチームの田中(@j_untanaka)です。
先日少しAWS Control Towerの検証をしてみました。
Control Towerを簡単に説明すると、AWSの考えるベストプラクティスに基づいて、AWS SSOを使用したIDの統合管理、CloudTrail/AWS Configの推奨設定およびログの一元管理、SCPやAWS Configなどによるガードレールの自動的な設定などなどいい感じでマルチアカウント環境をセットアップ、管理できる仕組みとなります。
残念なことに現時点でControl Towerは東京リージョンに未対応です。そのためAWS Config等の一部サービス(Control Tower用語で言うところの発見的ガードレール)はControl Towerをサポートするリージョンでのみ有効となるなど、東京リージョン中心でサービスが稼働している現場で手を加えずに使うにはもうちょっとなところはあります。
しかし枠組みとしては十分参考になりますし、弊社のように決済代行サービスを提供しているとガバナンスが効く構成とすることは基盤設計の上で必須要件であり重要なポイントとなりますので、このような仕組みをAWS自身が提供してくれるのは大変ありがたいことです。
さて、ありがたくはありつつ、このノリでGuardDutyも各アカウントで有効化してくれるともっといいのになと感じました。
念のためGuardDutyについても簡単に説明すると、AWSアカウント内での良からぬアクティビティを継続的にチェックしていい感じで検知、通知してくれるサービスです(説明が雑でスミマセン)
雰囲気的にControl Towerで統合管理してくれても良さそうな気がするものの、2020年7月現在GuardDutyはケアしてくれません。
前置きが長くなりましたが、この投稿は以上をふまえたやってみた系の話です。
小ネタですので気楽にお付き合いくださいませ。
やりたいこと
Account Factoryを使用して新しいアカウントをプロビジョニングする際、全リージョンでGuardDutyを有効化し、その管理を特定のアカウントに集約したい。
先日AWS Organizationsより配下のアカウントのGuardDuty設定ができるようになりましたが、各リージョンごとに設定が必要そうで少し大変、かつ新リージョン追加時は気づいてケアしなければならなそうなことが気になりました。
他にうまくやる方法がないか調べたところ、aws-samplesにこういうリポジトリを見つけました。
Control Towerで使う前提となっているし、定期的にGuardDutyが有効かチェックもしてくれるとのこと。
これなら新しいリージョンが追加された時も自動で設定してくれそうです。これを試してみます。
※注意
こちらのリポジトリは現時点でわりと動きが見られますので、今後ここで説明する作業や仕様は変更になる可能性が高いです。2020年7月現在のナマモノ情報としてご認識ください。
やってみた
基本的にREADMEに沿って作業します。
私はmacOSでやりましたが、bashが動く環境であればおそらく問題ないかと思います。
- aws-control-tower-guardduty-enablerを作業端末にクローンする
- src/package.sh を実行する
./src/package.sh
→ src/guardduty_enabler.zip が生成されます
- Control Towerのマスターアカウントにて管理者権限で以下の作業を実施する
- 任意のs3バケットを作成する
- 作成したバケットのルート直下に
src/guardduty_enabler.zip
をアップロードする - AWS Organizationの組織IDおよび監査アカウント(Audit)のアカウントIDを確認する
aws-control-tower-guardduty-enabler.template
を使用してCFnスタックを起動する- 以下の通りパラメータに値を設定する
OrganizationId
: AWS Organizationの組織ID(o-xxxxxxxxxx)S3SourceBucket
: 作成したs3バケット名SecurityAccountId
: 監査アカウントのアカウントID(数字12ケタ)
- 以下の通りパラメータに値を設定する
ここまでで、監査アカウントをマスターアカウントとしてControl Tower配下のアカウントのGuardDutyが有効化されています。
しかし何故かus-east-1等いくつかのリージョンでしか有効になっていませんでした。
Lambda関数(src/guardduty_enabler.py)の実装を確認したところ、CFnテンプレートの RegionFilter
というパラメータにより、どのリージョンでGuardDutyを有効にするか切り分けているようです。
19 RegionFilter: 20 Type: String 21 Description: Should GuardDuty be enabled for all GuardDuty supported regions, or only Control Tower supported regions? 22 Default: ControlTower 23 AllowedValues: 24 GuardDuty 25 ControlTower
Descriptionにちゃんと書いてありました。Control Tower
を指定した場合、Control TowerをサポートするリージョンでのみGuardDutyを有効にするとのこと。
ここでは全リージョンで有効にしたいので GuardDuty
に変更してスタックを更新したところ、無事全リージョンで有効化されました。
仕組み
上記のスタックを追加すると、監査アカウントをマスターアカウントとしてControl Tower配下のアカウントでGuardDutyを有効化するLambda関数が作成されます。その関数は以下のタイミングでトリガーされます。
- CFnスタック起動時
- Control Towerで管理アカウントを追加した時
- 60分に1度
そのため一度組み込んでしまえばその後は基本的にノーケアでGuardDutyが全アカウント全リージョンで有効な状態が保たれるかと思います。なかなか気がきいた仕組みではないでしょうか。
こちらからは以上です。
読んでいただきありがとうございました。