Security Hubで個人的によく使うAWS CLIコマンドをまとめてみた

2023.10.31

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

セキュリティサービスの設定はみなさんどのようにされていますか?

コンソール、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

enable-security-hub — AWS CLI Command Reference

更新: 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

batch-enable-standards — AWS CLI Command Reference batch-disable-standards — AWS CLI Command Reference

更新: メンバーアカウント招待承諾

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

create-members — AWS CLI Command Reference invite-members — AWS CLI Command Reference

各メンバーアカウントで実行

  • メンバーアカウントでの承認
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

accept-administrator-invitation — AWS CLI Command Reference

更新: アカウント委任(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

enable-organization-admin-account — AWS CLI Command Reference

更新: 自動有効化の設定(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

update-organization-configuration — AWS CLI Command Reference

更新: メンバーアカウントを追加する(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

create-members — AWS CLI Command Reference

更新: 抑制する検出結果にノートを追加する

参照: 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

get-enabled-standards — AWS CLI Command Reference
list-members — AWS CLI Command Reference

参照: 管理者アカウント確認

各メンバーアカウントで実行

  • 管理者アカウントを確認
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

get-administrator-account — AWS CLI Command Reference

参照: 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

get-enabled-standards — AWS CLI Command Reference
describe-organization-configuration — AWS CLI Command Reference

参照: ワークフロー/コントロールステータスで無効にしているものの確認

削除: 全リージョン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

disable-security-hub — AWS CLI Command Reference

削除: 管理者アカウントとの関連付けを解除

招待で管理されている各メンバーアカウントで実行

  • メンバーアカウントの委任解除
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

disassociate-from-administrator-account — AWS CLI Command Reference

削除: メンバーアカウントの削除

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

delete-members — AWS CLI Command Reference

最後に

頻繁に使うコマンドがあれば、随時追加していきたいと思います。

この中から1つでも役に立つコマンドであれば幸いです。

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