こんにちは。たかやまです。
セキュリティサービスの設定はみなさんどのようにされていますか?
コンソール、AWS CLI、CloudFormation、Terraform等、様々な方法があると思います。
私自身セキュリティサービスの場合は、一度きりの設定だったりCloudFormationで設定できないOrganizations連携機能などもあるため、なんだかんだAWS CLIを使う機会が多いです。
ただその度に、コマンドを調べている気がします...
そこで、ほぼ自分用になりますが個人的によく使うSecurity HubのAWS CLIコマンドをまとめてみました。
注意事項
- 執筆当時のAWS CLIバージョンは
aws-cli/2.13.29
- 記載のコマンドは一部を除き有効リージョン全てに対して実行するように作成しています
- パラメータについてはお使いの環境に合わせて適宜変更してください
- 事前に動作確認はしていますが、実行は自己責任でお願いします
Security Hub
作成: Security Hubの有効化
- デフォルトのセキュリティ基準は無効
aws ec2 describe-regions --query "Regions[].[RegionName]" --output text \
| while read region; do
echo "### Enable Security Hub in ${region}"
aws securityhub enable-security-hub \
--no-enable-default-standards \
--region ${region}
done
更新: Security Hubのセキュリティ基準の有効化と無効化
- 有効
- FSBP
- CIS1.4
- NIST
- 無効
- CIS1.2
account_id=$(aws sts get-caller-identity --query 'Account' --output text)
aws ec2 describe-regions --query "Regions[].[RegionName]" --output text \
| while read region; do
echo "### Processing region: ${region}"
# enable FSBP
echo "# Enable FSBP, CIS 1.4, NIST, PCI DSS"
aws securityhub batch-enable-standards \
--standards-subscription-requests '[
{"StandardsArn":"arn:aws:securityhub:'${region}'::standards/aws-foundational-security-best-practices/v/1.0.0"},
{"StandardsArn":"arn:aws:securityhub:'${region}'::standards/cis-aws-foundations-benchmark/v/1.4.0"},
{"StandardsArn":"arn:aws:securityhub:'${region}'::standards/nist-800-53/v/5.0.0"},
{"StandardsArn":"arn:aws:securityhub:'${region}'::standards/pci-dss/v/3.2.1"}
]' \
--region ${region}
# disable CIS 1.2
echo "# Disable CIS 1.2"
aws securityhub batch-disable-standards \
--standards-subscription-arns '[
"arn:aws:securityhub:'${region}':'${account_id}':standards/cis-aws-foundations-benchmark/v/1.2.0"
]' \
--region ${region}
done
更新: メンバーアカウント招待承諾
Security Hub管理アカウントで実行
- 集約アカウントでの招待作成
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
各メンバーアカウントで実行
- メンバーアカウントでの承認
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
更新: アカウント委任(Organizations限定)
Organization管理アカウントで実行
xxxxxxxxxxxx(アカウントID)
に委任する
admin_account=xxxxxxxxxxxx
aws ec2 describe-regions --query "Regions[].[RegionName]" --output text \
| while read region; do
echo "### Enable organization admin account in ${region}"
aws securityhub enable-organization-admin-account \
--admin-account-id ${admin_account} \
--region ${region}
done
更新: 自動有効化の設定(Organizations限定)
Security Hub管理アカウントで実行
- Auto-enable accounts : オン
- Auto-enable default standards : オフ
aws ec2 describe-regions --query "Regions[].[RegionName]" --output text \
| while read region; do
echo "##### Enable auto-enable(Disable default standards) in ${region}"
aws securityhub update-organization-configuration \
--auto-enable \
--auto-enable-standards NONE \
--region ${region}
if [[ $? -eq 0 ]]; then
echo "OK"
fi
done
更新: メンバーアカウントを追加する(Organizations限定)
Security Hub管理アカウントで実行
- Organizations配下の
xxxxxxxxxxxx(アカウントID)
をメンバーアカウントとして追加する
accounts=(xxxxxxxxxxxx xxxxxxxxxxxx)
aws ec2 describe-regions --query "Regions[].[RegionName]" --output text \
| while read region; do
echo "### Create Member in ${region}"
for account in ${accounts[@]}; do
aws securityhub create-members \
--account-details AccountId=${account} \
--region ${region}
done
done
更新: 抑制する検出結果にノートを追加する
参照: Security Hub有効化確認
- Security Hubの有効化状態を確認
- 有効化されている場合は、有効なセキュリティ基準とメンバーアカウントを表示
aws ec2 describe-regions --query "Regions[].[RegionName]" --output text \
| while read region; do
if aws securityhub describe-hub --region ${region} >/dev/null 2>&1; then
echo "### Security Hub is enabled in ${region}"
aws securityhub get-enabled-standards \
--query StandardsSubscriptions[].[StandardsArn,StandardsStatus] \
--region ${region} \
--output table
aws securityhub list-members \
--query "Members[].[AccountId,MemberStatus]" \
--region ${region} \
--output table
else
echo "### Security Hub is disabled in ${region}"
fi
done
参照: 管理者アカウント確認
各メンバーアカウントで実行
- 管理者アカウントを確認
aws ec2 describe-regions --query "Regions[].[RegionName]" --output text \
| while read region; do
if aws securityhub describe-hub --region ${region} >/dev/null 2>&1; then
echo "### Security Hub is enabled in ${region}"
echo "# Checking Administrator Account"
admin_account=$(aws securityhub get-administrator-account --region ${region} --output text)
if [ $? -eq 0 ] && [ -n "${admin_account}" ]; then
aws securityhub get-administrator-account --region ${region} --output table
else
echo "No Administrator Account found for Security Hub"
fi
else
echo "### Security Hub is disabled in ${region}"
fi
done
参照: Auto-enable設定の確認(Organizations限定)
Security Hub管理アカウントで実行
- Security Hubの有効化状態を確認
- 有効化されている場合は、有効なセキュリティ基準とAuto-Enable設定を表示
aws ec2 describe-regions --query "Regions[].[RegionName]" --output text \
| while read region; do
if aws securityhub describe-hub --region ${region} >/dev/null 2>&1; then
echo "### Security Hub is enabled in ${region}"
aws securityhub get-enabled-standards \
--query StandardsSubscriptions[].[StandardsArn,StandardsStatus] \
--region ${region} \
--output table
aws securityhub describe-organization-configuration \
--query "{AutoEnable: AutoEnable, AutoEnableStandards: AutoEnableStandards}" \
--region ${region} \
--output table
else
echo "### Security Hub is disabled in ${region}"
fi
done
参照: ワークフロー/コントロールステータスで無効にしているものの確認
削除: 全リージョンSecurity Hubの無効化
- Security Hubの無効化
aws ec2 describe-regions --query "Regions[].[RegionName]" --output text \
| while read region; do
echo "### Disable Security Hub in ${region}"
aws securityhub disable-security-hub \
--region ${region}
done
削除: 管理者アカウントとの関連付けを解除
招待で管理されている各メンバーアカウントで実行
- メンバーアカウントの委任解除
aws ec2 describe-regions --query "Regions[].[RegionName]" --output text \
| while read region; do
echo "### Disassociate form administrator account in ${region}"
aws securityhub disassociate-from-administrator-account \
--region ${region}
done
削除: メンバーアカウントの削除
Security Hub管理アカウントで実行
- Security Hubに関連付けされていないメンバーアカウントの削除
aws ec2 describe-regions --query "Regions[].[RegionName]" --output text \
| while read region; do
# Check if Security Hub is enabled in the region
if aws securityhub describe-hub --region ${region} >/dev/null 2>&1; then
member_account_ids=$(aws securityhub list-members --no-only-associated --query 'Members[].AccountId' --output text --region ${region})
# Check if there are any member accounts to delete
if [ -n "${member_account_ids}" ]; then
echo "### Deleting member account in region ${region}"
# Delete the member account
aws securityhub delete-members --account-ids ${member_account_ids} --region ${region}
# Check if the deletion was successful
if [ $? -eq 0 ]; then
echo "Successfully deleted member account ${member_account_ids} from Security Hub in region ${region}"
else
echo "Failed to delete member account ${member_account_ids} from Security Hub in region ${region}"
fi
else
echo "### No member accounts to delete in region ${region}"
fi
else
echo "### Security Hub is not enabled in ${region}"
fi
done
最後に
頻繁に使うコマンドがあれば、随時追加していきたいと思います。
この中から1つでも役に立つコマンドであれば幸いです。
以上、たかやま()でした。