ROBOT PAYMENT Engineers Blog

株式会社ROBOT PAYMENTのテックブログです

Control Towerで管理しているAWSアカウントのGuardDutyを全リージョンで有効化する

はじめに

おはこんばんちは。SREチームの田中(@j_untanaka)です。

先日少しAWS Control Towerの検証をしてみました。
Control Towerを簡単に説明すると、AWSの考えるベストプラクティスに基づいて、AWS SSOを使用したIDの統合管理、CloudTrail/AWS Configの推奨設定およびログの一元管理、SCPやAWS Configなどによるガードレールの自動的な設定などなどいい感じでマルチアカウント環境をセットアップ、管理できる仕組みとなります。

aws.amazon.com

残念なことに現時点でControl Towerは東京リージョンに未対応です。そのためAWS Config等の一部サービス(Control Tower用語で言うところの発見的ガードレール)はControl Towerをサポートするリージョンでのみ有効となるなど、東京リージョン中心でサービスが稼働している現場で手を加えずに使うにはもうちょっとなところはあります。
しかし枠組みとしては十分参考になりますし、弊社のように決済代行サービスを提供しているとガバナンスが効く構成とすることは基盤設計の上で必須要件であり重要なポイントとなりますので、このような仕組みをAWS自身が提供してくれるのは大変ありがたいことです。

さて、ありがたくはありつつ、このノリでGuardDutyも各アカウントで有効化してくれるともっといいのになと感じました。
念のためGuardDutyについても簡単に説明すると、AWSアカウント内での良からぬアクティビティを継続的にチェックしていい感じで検知、通知してくれるサービスです(説明が雑でスミマセン)

aws.amazon.com

雰囲気的にControl Towerで統合管理してくれても良さそうな気がするものの、2020年7月現在GuardDutyはケアしてくれません。

前置きが長くなりましたが、この投稿は以上をふまえたやってみた系の話です。
小ネタですので気楽にお付き合いくださいませ。

やりたいこと

Account Factoryを使用して新しいアカウントをプロビジョニングする際、全リージョンでGuardDutyを有効化し、その管理を特定のアカウントに集約したい。

先日AWS Organizationsより配下のアカウントのGuardDuty設定ができるようになりましたが、各リージョンごとに設定が必要そうで少し大変、かつ新リージョン追加時は気づいてケアしなければならなそうなことが気になりました。

docs.aws.amazon.com

他にうまくやる方法がないか調べたところ、aws-samplesにこういうリポジトリを見つけました。

github.com

Control Towerで使う前提となっているし、定期的にGuardDutyが有効かチェックもしてくれるとのこと。
これなら新しいリージョンが追加された時も自動で設定してくれそうです。これを試してみます。

※注意

こちらのリポジトリは現時点でわりと動きが見られますので、今後ここで説明する作業や仕様は変更になる可能性が高いです。2020年7月現在のナマモノ情報としてご認識ください。

やってみた

基本的にREADMEに沿って作業します。
私はmacOSでやりましたが、bashが動く環境であればおそらく問題ないかと思います。

./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を有効にするか切り分けているようです。

aws-control-tower-guardduty-enabler/aws-control-tower-guardduty-enabler.template at 76dcc2879e7586920fc019ad1f54eb1be0066507 · aws-samples/aws-control-tower-guardduty-enabler · GitHub

   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が全アカウント全リージョンで有効な状態が保たれるかと思います。なかなか気がきいた仕組みではないでしょうか。

こちらからは以上です。
読んでいただきありがとうございました。