AWS Security Hubで、アカウント集約の設定を簡単に行うスクリプトを作った

AWS Security Hubのアカウント集約を簡単に設定するスクリプトを作りました。
2022.05.02

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

AWS Security Hubの管理機能として、アカウント集約とリージョン集約があります。

これらを組み合わせて使う場合には、リージョン毎にアカウント集約の設定を行う必要があるようです。 AWSアカウントが複数ある場合には、それぞれのアカウント・それぞれのリージョンで招待&承認の操作が必要になり、とても手間です。 というわけで、招待&承認を行うスクリプトを作ってみました。

なお、定期チェックされるタイミングで集約先のリージョンや管理アカウントに反映されるようなので、設定結果の反映確認は、しばらく待つ必要があります。

おすすめの方

  • AWS Security Hubでアカウント集約をしたい方

それぞれのリージョンで招待&承認する操作の例

手作業でポチポチするのは大変です……。

招待する側の操作

  1. 管理アカウントAのリージョン1で、メンバーアカウントXを招待する
  2. 管理アカウントAのリージョン1で、メンバーアカウントYを招待する
  3. 管理アカウントAのリージョン1で、メンバーアカウントZを招待する
  4. 管理アカウントAのリージョン2で、メンバーアカウントXを招待する
  5. 管理アカウントAのリージョン2で、メンバーアカウントYを招待する
  6. 管理アカウントAのリージョン2で、メンバーアカウントZを招待する
  7. 以下略

承認する側の操作

  1. メンバーアカウントXのリージョン1で、招待を承認する
  2. メンバーアカウントXのリージョン2で、招待を承認する
  3. メンバーアカウントYのリージョン1で、招待を承認する
  4. メンバーアカウントYのリージョン2で、招待を承認する
  5. メンバーアカウントZのリージョン1で、招待を承認する
  6. メンバーアカウントZのリージョン2で、招待を承認する
  7. 以下略

招待&承認を行うスクリプト

招待する側

招待する側のAWSアカウントで、下記を実行します。 AWS_MEMBER_ACOUNT_IDSには、招待したいAWSアカウントIDを記載します。

invite.py

import boto3

AWS_MEMBER_ACOUNT_IDS = [
    '999999999999',
    '888888888888',
    '777777777777',
]

def main():
    ec2 = boto3.client('ec2')
    regions = ec2.describe_regions()['Regions']

    for region in regions:
        region_name = region['RegionName']
        print(region_name)

        securityhub = boto3.client('securityhub', region_name=region_name)

        # メンバーアカウントを追加する
        for account_id in AWS_MEMBER_ACOUNT_IDS:
            securityhub.create_members(
                AccountDetails=[{'AccountId': account_id}]
            )

        # メンバーアカウントを招待する
        securityhub.invite_members(
            AccountIds=AWS_MEMBER_ACOUNT_IDS
        )


if __name__=='__main__':
    main()
python invite.py

承認する側

承認する側のAWSアカウントそれぞれで、下記を実行します。 AWS_ADMIN_ACOUNT_IDは、さきほど招待した側のAWSアカウントIDを記載します。

accept.py

import boto3

AWS_ADMIN_ACOUNT_ID = '111111111111'

def main():
    ec2 = boto3.client('ec2')
    regions = ec2.describe_regions()['Regions']

    for region in regions:
        region_name = region['RegionName']
        print(region_name)

        securityhub = boto3.client('securityhub', region_name=region_name)

        # メンバーアカウントの招待を確認する
        resp = securityhub.list_invitations()

        # メンバーアカウントの招待を承認する
        securityhub.accept_administrator_invitation(
            AdministratorId=AWS_ADMIN_ACOUNT_ID,
            InvitationId=resp['Invitations'][0]['InvitationId']
        )


if __name__=='__main__':
    main()
python accept.py

さいごに

AWSアカウントの各リージョンで招待&承認をするスクリプトを作って、自動化してみました。時間短縮の助けになれば幸いです。

参考