はじめに
AWSアカウントを新規作成すると、AWSアカウントごとに
- 請求
- オペレーション
- セキュリティ
の代替連絡先を登録することができます。(任意)
このうち、セキュリティの代替連絡先については登録しておかないとSecurity Hubの
[Account.1] Security contact information should be provided for an AWS account.
のコントロールに非準拠となってしまいます。
このコントロールをパスさせるためには、マネジメントコンソールなどからAWSアカウントごとにセキュリティ代替連絡先を登録する必要があります。
- 参考手順:
- AWSアカウント毎に登録する場合:
- AWS Organizations管理アカウントで、子アカウントの代替連絡先を登録する場合:
しかし、上記の方法でも十分対応可能ですが、AWS Organizations / Control Tower 環境で
数十・数百のAWSアカウントを管理する場合、手作業では対応が大変です。
そこで、組織のメンバーアカウントの代替連絡先を自動登録できるソリューションが
AWS公式ブログで紹介されていたため、本記事では以下の2つのアプローチに分けてまとめます。
- 既存メンバーアカウントへの一括設定
- 新規メンバーアカウント作成時に自動設定
方法①:既存メンバーアカウントへ一括設定する
この方法では、提供されたスクリプトを利用して一括で Organizations のメンバーアカウントに
セキュリティ代替連絡先を登録します。
前提条件
- メンバーアカウントに登録する代替連絡先は全て同一であること
- 代替連絡先を管理するIAMユーザーまたはロールに次の権限があること
-
account: GetAlternateContact
– allows the user to view the current alternate contact -
account: PutAlternateContact
– allows the user to set a new alternate contact -
account: DeleteAlternateContact
– allows the user to delete an alternate contact
-
- AWS CLI のバージョンが
2.2.34
以降であること - 管理アカウント(マネジメントアカウント)の代替連絡先は、組織コンテキストでは変更不可
(管理アカウントに直接サインインして個別に設定する)
手順1:組織の「AWS Account Management」を有効化
まず、OrganizationsのAWS Account Management
サービスを有効にします。管理アカウントで以下のコマンドを実行してください。
aws organizations enable-aws-service-access --service-principal account.amazonaws.com
手順2:シェルスクリプトを作成
以下のコマンドをコピペして実行し、2つのシェルスクリプトを作成します。
1つ目のスクリプト(loop-through-accounts.sh
)を作成
cat << EOF > loop-through-accounts.sh
#! /bin/bash
managementaccount=\`aws organizations describe-organization --query Organization.MasterAccountId --output text\`
for account in \$(aws organizations list-accounts --query 'Accounts[].Id' --output text); do
# 管理アカウントはスキップ
# NOTE: 管理アカウントの代替連絡先の登録に、aws account put-alternate-contactコマンドを使用するとエラーが発生するため、管理アカウントでログインしマネジメントコンソールから登録する等他の方法を使用する
if [ "\$managementaccount" -eq "\$account" ]
then
echo 'Skipping management account.'
continue
fi
./put-security-contact.sh -a \$account
sleep 0.2
done
EOF
chmod 755 loop-through-accounts.sh
2つ目のスクリプト(put-security-contact.sh
)を作成
cat << EOF > put-security-contact.sh
#! /bin/bash
while getopts a: flag
do
case "\${flag}" in
a) account_id=\${OPTARG};;
esac
done
echo 'Put security contact for account '\$account_id'...'
aws account put-alternate-contact \
--account-id \$account_id \
--alternate-contact-type=SECURITY \
--email-address=security-contact@example.com \
--phone-number="+1(555)555-5555" \
--title="Security Contact" \
--name="Mary Major"
echo 'Done putting security contact for account '\$account_id'.'
EOF
chmod 755 put-security-contact.sh
手順3:セキュリティ代替連絡先の情報を編集
作成されたput-security-contact.shの、
aws account put-alternate-contact
の--email-address、--phone-number、--title, --nameにはダミーの値が入っているので、設定したい値に上書きしてください。
#! /bin/bash
while getopts a: flag
do
case "${flag}" in
a) account_id=${OPTARG};;
esac
done
echo 'Put security contact for account '$account_id'...'
### セキュリティ代替連絡先としての、メールアドレスや電話番号などを設定する ###
aws account put-alternate-contact \
--account-id "$account_id" \
--alternate-contact-type SECURITY \
--email-address security@example.com \
--phone-number "+1(555)555-5555" \
--title "Security Contact" \
--name "Security Team"
echo 'Done putting security contact for account '$account_id'.'
手順4:スクリプトを実行し、全メンバーアカウントに代替連絡先を登録
最後に、管理アカウントのprofileで以下のスクリプトを実行すると全てのメンバーアカウントに一括でセキュリティ代替連絡先の登録が行われます。
./loop-through-accounts.sh
登録結果は、アカウントIDを指定して次のコマンドで確認できます。
aws account get-alternate-contact --account-id XXXXXXXXXXXX --alternate-contact-type=SECURITY
方法②:新規メンバーアカウント作成時に自動設定する
この方法では、Organizations または Control Tower での新規AWSアカウント作成を EventBridge が検知し、
そのイベントをトリガーに Lambda を起動して代替連絡先を自動登録するためのテンプレートを展開します。
テンプレートをデプロイするだけなので簡単に実現できます。
出典: AWS Cloud Operations Blog, "Automatically update alternate contacts for newly created AWS Accounts" (2022-03-15), by Sudhanshu Malhotra / Siva Rajamani
https://aws.amazon.com/jp/blogs/mt/automatically-update-alternate-contacts-for-newly-created-aws-accounts/
注意事項
-
AWS Organizations
経由で新規アカウントを作成する場合は、ソリューションをus-east-1
にデプロイ -
AWS Control Tower Account Factory
経由で作成する場合は、Control Towerのアクティベーションリージョンにデプロイ - 組織の機能は「すべての機能(All features)」が有効であること
- 組織で AWS Account Management サービスアクセスを有効化していること(管理アカウントで実行)
aws organizations enable-aws-service-access --service-principal account.amazonaws.com
- 対象は新規に作成されるメンバーアカウント。管理アカウント自身の代替連絡先は本ソリューションの対象外
デプロイ手順
デプロイは次の2つのいずれかかの方法で実施できます(詳細は公式を参照)。
方法①:マネコン(Quick Create)でデプロイ
- 次のリンクを開く(Organizationsはus-east-1、Control TowerはCT有効化リージョン)
- Stack name を入力(例:
alt-contact-update-stack
) - Billing / Operations / Security の各代替連絡先(Name/Title/Email/Phone)を入力
- TypeOfDeployment を選択(
ORGANIZATIONS
またはCONTROL_TOWER
) - Create stack を実行
方法②:SAM CLIでデプロイ
- リポジトリからソースコードを取得
git clone https://github.com/aws-samples/aws-account-alternate-contacts-bootstrap
cd aws-account-alternate-contacts-bootstrap
- デプロイ用S3バケットを作成(リージョンは注意事項に従う)
-
./create-bucket.sh us-east-1
(Organizations 経由の場合の例)
-
-
profile.txt
に利用するAWSプロファイル名を設定 - 代替連絡先の値(Name/Title/Email/Phone)をテンプレート/環境変数に反映
- デプロイ
-
./deploy.sh us-east-1
(Organizations 経由の場合の例)
-
デプロイが完了すると、新しいメンバーアカウントが作成されるたびに、自動的に代替連絡先が登録されるようになります。
まとめ
- 既存アカウントへの一括設定は、スクリプトで
account:PutAlternateContact
を回すのが手っ取り早い - 新規アカウントは、EventBridge → Lambda → Account Management API で自動登録がシンプル
- 管理アカウントの代替連絡先は、組織コンテキスト外で個別に設定する
- Control Tower 環境でも本ソリューションは有効(ガードレールやSCPでブロックしていないかは要確認)