AWS Security Hubの管理機能として、アカウント集約とリージョン集約があります。
- 管理者アカウントおよびメンバーアカウントの管理 - AWS Security Hub
- 【アップデート】AWS Security Hub が検出結果のリージョン集約に対応しました | DevelopersIO
これらを組み合わせて使う場合には、リージョン毎にアカウント集約の設定を行う必要があるようです。 AWSアカウントが複数ある場合には、それぞれのアカウント・それぞれのリージョンで招待&承認の操作が必要になり、とても手間です。 というわけで、招待&承認を行うスクリプトを作ってみました。
なお、定期チェックされるタイミングで集約先のリージョンや管理アカウントに反映されるようなので、設定結果の反映確認は、しばらく待つ必要があります。
おすすめの方
- AWS Security Hubでアカウント集約をしたい方
それぞれのリージョンで招待&承認する操作の例
手作業でポチポチするのは大変です……。
招待する側の操作
- 管理アカウントAのリージョン1で、メンバーアカウントXを招待する
- 管理アカウントAのリージョン1で、メンバーアカウントYを招待する
- 管理アカウントAのリージョン1で、メンバーアカウントZを招待する
- 管理アカウントAのリージョン2で、メンバーアカウントXを招待する
- 管理アカウントAのリージョン2で、メンバーアカウントYを招待する
- 管理アカウントAのリージョン2で、メンバーアカウントZを招待する
- 以下略
承認する側の操作
- メンバーアカウントXのリージョン1で、招待を承認する
- メンバーアカウントXのリージョン2で、招待を承認する
- メンバーアカウントYのリージョン1で、招待を承認する
- メンバーアカウントYのリージョン2で、招待を承認する
- メンバーアカウントZのリージョン1で、招待を承認する
- メンバーアカウントZのリージョン2で、招待を承認する
- 以下略
招待&承認を行うスクリプト
招待する側
招待する側の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アカウントの各リージョンで招待&承認をするスクリプトを作って、自動化してみました。時間短縮の助けになれば幸いです。