招待によるメンバーアカウント管理を組織(Organizations)によるメンバーアカウントに変更した時の動作を確認してみた

2023.08.25

こんにちは。たかやまです。

Security HubやGuardDutyを複数のアカウントで管理する場合、「招待によるアカウント管理」か「Organizationsによるアカウント管理」でマルチアカウントでの管理を行うことができます。
※ここでは便宜上、セキュリティサービスを集約するアカウントを「Securityアカウント」と呼びます。

Organizationsの利用以前に、すでに「招待によるアカウント管理」を使いセキュリティサービスを集約させているパターンは多いと思います。

Organizationsへの移行を見据えて「招待によるアカウント管理」を行っているアカウントをOrganizationsに参加させ、「Organizationsによるアカウント管理」に変更した場合の動作を確認したのでこちらをまとめていきたいと思います。

検証環境

今回はSecurity Hubを対象に以下の検証環境で調査を実施しました。
※GuardDutyでも確認を行い同様の検証結果を得ています

各アカウントIDはマスクした形で以下のものになります。

  • Securityアカウント(76xx02)
  • Sub1(52xx60)
  • Sub2(32xx67)

さきにまとめ

  • 非OrganizationsアカウントはSecurityアカウントがOrganizations参加後も引き続き By Invitation として管理される
  • OrganizationsアカウントはSecurityアカウントがOrganizations参加後、Via OrganizationsとしてOrganizations配下のアカウントして管理される
  • SecurityアカウントをOrganizationsから外す場合は、委任を解除する時点でアカウント集約は解除される

やってみる

前提条件

  • 今回検証するアカウントSecurity/Sub1/Sub2アカウントではすでにSecurity Hubが有効化状態

招待によるメンバーアカウント管理

では、SecurityアカウントOrganizationsに参加させる前に、メンバーアカウントを招待によるアカウント管理を行っていきます。

Securityアカウントで以下のコマンドを実行し、メンバーアカウント(Sub1/Sub2)を招待します。

accounts=(xxxxxxxxxxxx xxxxxxxxxxxx)
aws ec2 describe-regions --query "Regions[].[RegionName]" --output text \
| while read region; do
  echo "### Create and invite a Member in ${region}"
  for account in ${accounts[@]}; do
    echo "# Create Member"
    aws securityhub create-members \
    --account-details '[{"AccountId": "'${account}'"}]' \
    --region ${region}
    echo "# Invite member"
    aws securityhub invite-members \
    --account-ids ${account} \
    --region ${region}
  done
done
実行結果
[cloudshell-user@ip-10-6-80-162 ~]$ accounts=(32xx67 52xx60)
[cloudshell-user@ip-10-6-80-162 ~]$ aws ec2 describe-regions --query "Regions[].[RegionName]" --output text \
> | while read region; do
>   echo "### Create and invite a Member in ${region}"
>   for account in ${accounts[@]}; do
>     echo "# Create Member"
>     aws securityhub create-members \
>     --account-details '[{"AccountId": "'${account}'"}]' \
>     --region ${region}
>     echo "# Invite member"
>     aws securityhub invite-members \
>     --account-ids ${account} \
>     --region ${region}
>   done
> done
### Create and invite a Member in ap-south-1
# Create Member
{
    "UnprocessedAccounts": []
}
# Invite member
{
    "UnprocessedAccounts": []
}
# Create Member
{
    "UnprocessedAccounts": []
}
# Invite member
{
    "UnprocessedAccounts": []
}
### Create and invite a Member in eu-north-1
# Create Member
{
    "UnprocessedAccounts": []
}
# Invite member
{
    "UnprocessedAccounts": []
}
# Create Member
{
    "UnprocessedAccounts": []
}
# Invite member
{
    "UnprocessedAccounts": []
}
### Create and invite a Member in eu-west-3
・
・
・

Securityアカウントで招待実施後、各メンバーアカウントで招待の承認を以下のコマンドで行います。

administrator_id=xxxxxxxxxxxx
aws ec2 describe-regions --query "Regions[].[RegionName]" --output text \
| while read region; do
  invitation_id=$(aws securityhub list-invitations --query "Invitations[].[InvitationId]" --output text --region ${region})
  echo "### Accept invitation in ${region}"
  if [ -n "${invitation_id}" ]; then
    aws securityhub accept-administrator-invitation \
    --administrator-id ${administrator_id} \
    --invitation-id ${invitation_id} \
    --region ${region}
    echo "OK"
  else
    echo "InvitationId Not Found"
  fi
done
実行結果
[cloudshell-user@ip-10-2-91-90 ~]$ administrator_id=76xx02
[cloudshell-user@ip-10-2-91-90 ~]$ aws ec2 describe-regions --query "Regions[].[RegionName]" --output text \
> | while read region; do
>   invitation_id=$(aws securityhub list-invitations --query "Invitations[].[InvitationId]" --output text --region ${region})
>   echo "### Accept invitation in ${region}"
>   if [ -n "${invitation_id}" ]; then
>     aws securityhub accept-administrator-invitation \
>     --administrator-id ${administrator_id} \
>     --invitation-id ${invitation_id} \
>     --region ${region}
>     echo "OK"
>   else
>     echo "InvitationId Not Found"
>   fi
> done
### Accept invitation in ap-south-1
OK
### Accept invitation in eu-north-1
OK
### Accept invitation in eu-west-3
OK
### Accept invitation in eu-west-2
OK
### Accept invitation in eu-west-1
OK
### Accept invitation in ap-northeast-3
OK
### Accept invitation in ap-northeast-2
OK
### Accept invitation in ap-northeast-1
OK
### Accept invitation in ca-central-1
OK
### Accept invitation in sa-east-1
OK
### Accept invitation in ap-southeast-1
OK
### Accept invitation in ap-southeast-2
OK
### Accept invitation in eu-central-1
OK
### Accept invitation in us-east-1
OK
### Accept invitation in us-east-2
OK
### Accept invitation in us-west-1
OK
### Accept invitation in us-west-2
OK

SecurityアカウントのSecurity Hubのコンソールを確認すると、招待したメンバーアカウントのTypeBy Invitationで表示されていることが確認できます。

Organizationsへの追加対応

次にSecuirytアカウントをOrganizaitonsに参加させていきます。
招待は管理アカウントから実施していきます。

管理アカウントから招待を送信後、Securityアカウントで招待を承認します。

ダッシュボードが表示されれば招待完了です。

招待後、再び管理アカウントに戻り、SecurityアカウントにSecurity Hubを委任させます。

adminAccount=xxxxxxxxxxxx
aws ec2 describe-regions --query "Regions[].[RegionName]" --output text \
| while read region; do
  echo "##### Enable organization admin account in ${region}"
  aws --region ${region} securityhub enable-organization-admin-account \
  --admin-account-id ${adminAccount}
done
実行結果
[cloudshell-user@ip-10-6-27-110 ~]$ adminAccount=76xxxx02
[cloudshell-user@ip-10-6-27-110 ~]$ aws ec2 describe-regions --query "Regions[].[RegionName]" --output text \
> | while read region; do
>   echo "##### Enable organization admin account in ${region}"
>   aws --region ${region} securityhub enable-organization-admin-account \
>   --admin-account-id ${adminAccount}
> done
##### Enable organization admin account in ap-south-1
##### Enable organization admin account in eu-north-1
##### Enable organization admin account in eu-west-3
##### Enable organization admin account in eu-west-2
##### Enable organization admin account in eu-west-1
##### Enable organization admin account in ap-northeast-3
##### Enable organization admin account in ap-northeast-2
##### Enable organization admin account in ap-northeast-1
##### Enable organization admin account in ca-central-1
##### Enable organization admin account in sa-east-1
##### Enable organization admin account in ap-southeast-1
##### Enable organization admin account in ap-southeast-2
##### Enable organization admin account in eu-central-1
##### Enable organization admin account in us-east-1
##### Enable organization admin account in us-east-2
##### Enable organization admin account in us-west-1
##### Enable organization admin account in us-west-2

Organizations参加後の動作確認

委任後、Securityアカウントに戻りSecuirty Hubを確認します。
Organizationsによるアカウント管理に変更されたことで、Organizations配下のアカウントはTypeVia AWS Organizationsとして表示されることが確認できます。

元々招待していたSub2(32xx67)アカウントも自動でVia AWS Organizationsになることが確認できます。
またOrganizations配下ではないSub1(52xx60)アカウントは引き続きBy Invitationとして継続して管理されます。

ちなみに、Organizaitonsにより管理されているメンバーアカウントのSecurity Hubは通常こちらのように離脱できないようなコンソールになっています。

今回のようにもともとBy InvitaitonのものがVia AWS Organizationsに変更された場合はBy Invitation時のコンソールにある離脱用のトグルが表示されています。

試しに離脱操作をしてみると...
実態はOrganizaitonsで管理されており離脱はできないようになっているので安心いただければと思います。

Appendix : SecurityアカウントをOrganizationsから外す

SecuirtyアカウントのOrganziations追加を試したので、今度は逆にSecuirtyアカウントをOrganziationsから外したときの動作を確認しておきたいと思います。

直接OrganizationsからSecurityアカウントを外そうとすると、委任関係を解除する必要があるとエラーが表示されます。

なので、以下のコマンドを実行しSecurityアカウントの委任を解除します。

aws organizations deregister-delegated-administrator \
--account-id xxxxxxxxxxxx \
--service-principal securityhub.amazonaws.com

委任解除後、SecuirytアカウントでSecurity Hubを確認すると、もともと招待で管理していたアカウント(disaasociated)のみが残ることが確認できます。

委任を解除することでSecurity Hubの集約管理は維持できないことがわかります。

あとは、問題なく管理アカウント側からOrganizationsから除外することが可能です。

最後に

今回は、「招待によるアカウント管理」を行っているアカウントをOrganizationsに参加させ、「Organizationsによるアカウント管理」に変更した場合の動作を確認しました。

集約が解除されることなくシームレスに変更できるので、安心してOrganizationsへ移行できることが確認できました。

こちらの記事が同様にOrganizationsへの移行を検討している方への助けになれば幸いです。

以上、たかやま(@nyan_kotaroo)でした。