【Organizations】組織内すべてのアカウント・すべてのリージョンへの GuardDuty設定を簡単に行う

2020.05.11

AWS Organizations はマルチアカウントの管理、統制に役立つサービスです。

それぞれの AWSアカウントを 組織単位(Organizational Unit: OU)に所属させ、 グループ化することができます。 組織単位で AWSのリソース設定や セキュリティの統制 が可能になります。

一方、 Amazon GuardDuty はマネージドな 脅威検出サービス です。

VPCフローログ、AWS CloudTrail イベントログ、DNSログを分析し、 悪意のあるアクティビティを検出します。 早急なセキュリティ対応に役立ちます。

この GuardDutyはリージョン単位のサービスです。 サポートされている全てのリージョンで有効化することが強く推奨 されています。

GuardDuty は、サポートされているすべての AWS リージョンで有効にすることを強くお勧めします。 このように設定することで、お客様が能動的に使用していないリージョンでも、 許可されていないアクティビティや異常なアクティビティに関する検索結果を GuardDuty で生成できます

– 引用: GuardDuty のセットアップ | AWSドキュメント

もちろん マルチアカウント環境でも、それぞれ 全てのアカウント・全てのリージョン で有効化が推奨されます。 一見作業量がとても多いように見えます。

ですが Organizations環境下においては、 組織内すべてのアカウント・すべてのリージョンへの GuardDuty設定を簡単に行う ことができます。

実際にやってみました。

Organizations と GuardDuty

GuardDutyでは マスターアカウントとメンバーアカウント の関係を築くことができます。 (注意: Organizations のマスターアカウント・メンバーアカウントとは別もの)

GuardDutyマスターアカウント上で メンバーアカウントの情報も まとめて管理 が可能となります。

通常、Organizationsを利用しない場合は 招待によるメンバーアカウントの関連付け が必要となります。 (参考: 招待による GuardDuty アカウントの管理 | AWSドキュメント)

Organizationsでは 招待不要で 以下のプロセスで まとめて管理ができます。

  1. Organizationsマスターアカウントから GuardDuty 委任管理者(GuardDutyマスターアカウント)を選択
  2. GuardDuty 委任管理者は 組織内アカウントの GuardDuty設定を 簡単に一括設定

以下のようなイメージです。

やってみる(東京リージョン有効化)

まずは すべてのアカウントの 東京リージョン の GuardDuty有効化を試してみます。

GuardDuty 委任管理者の選択

(Organizationsの)マスターアカウントにログインして、 GuardDutyコンソール画面に向かいます。 「設定」を開くと Organization 用の GuardDuty 管理者アカウント 欄があります。

こちらに GuardDuty委任管理者とするAWSアカウントIDを入力して「マスターの委任」を選択します。

GuardDuty委任管理者=Organizationsマスターアカウント とできますがこれは "非推奨" です

組織のマスターアカウントは委任管理者になることができますが、 これは最小限の特権の原則に従う AWS Security のベストプラクティスに基づいてお勧めしません。

– 引用: AWS Organizations による GuardDuty アカウントの管理 | AWSドキュメント

委任後の画面がこちらになります。

GuardDuty 一括設定

GuardDuty 委任管理者となった AWSアカウントへログインします。

委任管理者になった時点で、自動的にこのアカウント・このリージョンで GuardDutyが有効化されます。

「設定 → アカウント」を開きましょう。 組織内全てのアカウントの情報が見れるはずです。

上の青色のバー Enable GuardDuty for your organization in this region: Enable を選択しましょう。

以下のようなウィンドウがでるので Enable を選択します。

選択すると以下の画面のようになります。

  • 全てのアカウントのGuardDutyが有効化されました
  • 自動有効化がONになりました … 組織内にアカウントが追加されたときに自動的に GuardDutyが有効化されます

数クリックで一括 GuardDuty設定ができました。

やってみる(全リージョン有効化)

次に すべてのアカウントの すべてのリージョン の GuardDuty有効化を試してみます。

CloudFormation StackSets を使った有効化など考えられますが、

  • GuardDuty 委任管理者の選択 は CFnで出来ない
  • GuardDuty 一括設定 のマネジメントコンソールでの実行が便利

上記理由から、主に AWS CLI + マネジメントコンソールでやってみます。

GuardDuty 委任管理者の選択

(Organizationsの)マスターアカウントにログインして、 GuardDutyコンソール画面に向かいます。

AWS CLIで実施します。

guardduty enable-organization-admin-account コマンドで実行できます。 --admin-account-id に委任管理者のAWSアカウントIDを指定します。

以下にシェルで実行した場合の例を載せます。 aws ec2 describe-regions で出てきたリージョン(2020-05-11時点) 全てに対してコマンド実行しています。

ACCOUNT_ID=(委任管理者のAWSアカウントID 12桁)

aws guardduty enable-organization-admin-account --admin-account-id $ACCOUNT_ID --region "ap-northeast-1"
aws guardduty enable-organization-admin-account --admin-account-id $ACCOUNT_ID --region "ap-northeast-2"
aws guardduty enable-organization-admin-account --admin-account-id $ACCOUNT_ID --region "ap-south-1"
aws guardduty enable-organization-admin-account --admin-account-id $ACCOUNT_ID --region "ap-southeast-1"
aws guardduty enable-organization-admin-account --admin-account-id $ACCOUNT_ID --region "ap-southeast-2"
aws guardduty enable-organization-admin-account --admin-account-id $ACCOUNT_ID --region "ca-central-1"
aws guardduty enable-organization-admin-account --admin-account-id $ACCOUNT_ID --region "eu-central-1"
aws guardduty enable-organization-admin-account --admin-account-id $ACCOUNT_ID --region "eu-north-1"
aws guardduty enable-organization-admin-account --admin-account-id $ACCOUNT_ID --region "eu-west-1"
aws guardduty enable-organization-admin-account --admin-account-id $ACCOUNT_ID --region "eu-west-2"
aws guardduty enable-organization-admin-account --admin-account-id $ACCOUNT_ID --region "eu-west-3"
aws guardduty enable-organization-admin-account --admin-account-id $ACCOUNT_ID --region "sa-east-1"
aws guardduty enable-organization-admin-account --admin-account-id $ACCOUNT_ID --region "us-east-1"
aws guardduty enable-organization-admin-account --admin-account-id $ACCOUNT_ID --region "us-east-2"
aws guardduty enable-organization-admin-account --admin-account-id $ACCOUNT_ID --region "us-west-1"
aws guardduty enable-organization-admin-account --admin-account-id $ACCOUNT_ID --region "us-west-2"

GuardDuty 一括設定

GuardDuty 委任管理者となった AWSアカウントへログインします。

この作業を AWS CLIで実施するには

上記対応が必要で、特に create-members がアカウント分必要なので面倒です。

ここはマネジメントコンソールで行ったほうが (個人的には)楽だと思います。

以下のようにリージョンを切り替えて、青色バナーの Enable をポチポチ押していきましょう。

(・・・以下同様)

全てのアカウント・全てのリージョンで有効化されているかを確認する シェルスクリプトの例を以下に載せます。

regions=(\
"ap-northeast-1" \
"ap-northeast-2" \
"ap-south-1" \
"ap-southeast-1" \
"ap-southeast-2" \
"ca-central-1" \
"eu-central-1" \
"eu-north-1" \
"eu-west-1" \
"eu-west-2" \
"eu-west-3" \
"sa-east-1" \
"us-east-1" \
"us-east-2" \
"us-west-1" \
"us-west-2"\
)

for r in $regions
do
  dtid=`aws guardduty list-detectors --query 'DetectorIds' --region $r --output text`
  echo "running... aws guardduty list-members --detector-id $dtid --region $r"
  aws guardduty list-members --detector-id $dtid --region $r | jq -r ".Members[]|[.AccountId, .RelationshipStatus]|@csv"
done

それぞれ RelationshipStatus が すべて Enabled になっていれば OKです。

おわりに

GuardDuty設定を 組織内すべてのアカウント・すべてのリージョンに 簡単に展開できました。

通常の招待のプロセスが不要であることも便利ですが、 自動有効化によって新規アカウントの GuardDuty設定が省けるのはとても良いですね。

マルチアカウントのセキュリティ統制にはぜひ活用したいところです。

少しでもどなたかのお役に立てば幸いです。

参考