一部メンバーアカウントに対してInspectorを有効化してみた

2024.06.25

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

Amazon InspectorはOrganizationsと連携してメンバーアカウントに対してInspectorを有効化することができます。

全アカウント、全リージョンへの有効化については、以下の記事を参照してください。

ただ、メンバーアカウントによっては予算管理や既存利用の脆弱性管理ツールの観点からInspectorを有効化したくない場合もあるかと思います。

上記のブログで紹介されているinspector2-enablement-with-cliでも単一アカウントを指定することはできます。

ただinspector2-enablement-with-cliのスクリプトを利用する場合、前述のブログでも紹介されている通り、リージョン間でのlambdaCodeスキャンの対応有無を考慮して個別に-sのコマンドを実行する必要があります。

# 複数アカウントIDを配列に設定
ACCOUNT_IDS=("XXXXXXXXXXXX" "XXXXXXXXXXXX" "XXXXXXXXXXXX")

# ループで各アカウントIDに対してスクリプトを実行
for ACCOUNT_ID in "${ACCOUNT_IDS[@]}"; do
  echo "Processing account ID: $ACCOUNT_ID"
  ./inspector2_enablement_with_awscli.sh -a activate -t "$ACCOUNT_ID" -s ec2
  ./inspector2_enablement_with_awscli.sh -a activate -t "$ACCOUNT_ID" -s ecr
  ./inspector2_enablement_with_awscli.sh -a activate -t "$ACCOUNT_ID" -s lambda
  ./inspector2_enablement_with_awscli.sh -a activate -t "$ACCOUNT_ID" -s lambdaCode
done

この処理を実行すると、アカウント数×スキャンタイプ数分の処理が必要になりかなりの時間がかかってしまいます。

そこで、今回はリージョン間のlambdaCode対応有無を考慮した一部メンバーアカウントへInspectorを有効にするスクリプトを紹介したいと思います。
(+α メンバーアカウントの関連付け処理)

やってみる

事前準備

管理アカウントでのアカウント委任の処理は終えているものとします。

一部メンバーアカウントの委任アカウンへの関連付け

# 関連付けたいアカウントIDのリストを members 変数に格納
members=("XXXXXXXXXXXX" "XXXXXXXXXXXX")
# 処理を実行するリージョンのリストを regions 変数に格納
regions=$(aws ec2 describe-regions --query "Regions[].[RegionName]" --output text)

# 各アカウントで処理を実行
for member in "${members[@]}"; do
    echo -e "[Processing account: $member]"
    for region in $regions; do
        echo "# Associating member $member in region $region"
        aws inspector2 associate-member --region "$region" --account-id "$member"
    done
    echo -e "[Completed for account $member]\n"
done

一部メンバーアカウントのInspector有効化

# 関連付けたいアカウントIDのリストを members 変数に格納
members=("XXXXXXXXXXXX" "XXXXXXXXXXXX")
# 有効にしたいリソースタイプを resource_types 変数に格納
resource_types=("EC2" "ECR" "LAMBDA" "LAMBDA_CODE")
# 処理を実行するリージョンのリストを regions 変数に格納
regions=$(aws ec2 describe-regions --query "Regions[].[RegionName]" --output text)

# 各アカウントで処理を実行
for member in "${members[@]}"; do
    echo -e "[Processing account: $member]"
    for region in $regions; do
        echo -e "# Enabling Inspector2 for member $member in region $region"
        # コマンド実行
        aws inspector2 enable --region "$region" --account-ids "$member" --resource-types "${resource_types[@]}"
        
        # コマンドが失敗した場合
        if [ $? -ne 0 ]; then
            echo -e "# Failed. Retrying without LAMBDA_CODE."
            # LAMBDA_CODEを除いたリソースタイプを作成
            filtered_resource_types=()
            for resource in "${resource_types[@]}"; do
                [ "$resource" != "LAMBDA_CODE" ] && filtered_resource_types+=("$resource")
            done
            # 再実行
            aws inspector2 enable --region "$region" --account-ids "$member" --resource-types "${filtered_resource_types[@]}"
        fi
    done
    echo -e "[Completed for account $member]\n"
done

一部メンバーアカウントのInspector無効化

# 関連付けたいアカウントIDのリストを members 変数に格納
members=("XXXXXXXXXXXX" "XXXXXXXXXXXX")
# 無効にしたいリソースタイプを resource_types 変数に格納
resource_types=("EC2" "ECR" "LAMBDA" "LAMBDA_CODE")
# 処理を実行するリージョンのリストを regions 変数に格納
regions=$(aws ec2 describe-regions --query "Regions[].[RegionName]" --output text)

# 各アカウントで処理を実行
for member in "${members[@]}"; do
    echo -e "[Processing account: $member]"
    for region in $regions; do
        echo -e "# Disabling Inspector2 for member $member in region $region"
        # コマンド実行
        aws inspector2 disable --region "$region" --account-ids "$member" --resource-types "${resource_types[@]}"
        
        # コマンドが失敗した場合
        if [ $? -ne 0 ]; then
            echo -e "# Failed. Retrying without LAMBDA_CODE."
            # LAMBDA_CODEを除いたリソースタイプを作成
            filtered_resource_types=()
            for resource in "${resource_types[@]}"; do
                [ "$resource" != "LAMBDA_CODE" ] && filtered_resource_types+=("$resource")
            done
            # 再実行
            aws inspector2 disable --region "$region" --account-ids "$member" --resource-types "${filtered_resource_types[@]}"
        fi
    done
    echo -e "[Completed for account $member]\n"
done

一部メンバーアカウントの関連付け解除

# 関連付けたいアカウントIDのリストを members 変数に格納
members=("XXXXXXXXXXXX" "XXXXXXXXXXXX")
# 処理を実行するリージョンのリストを regions 変数に格納
regions=$(aws ec2 describe-regions --query "Regions[].[RegionName]" --output text)

# 各アカウントで処理を実行
for member in "${members[@]}"; do
    echo -e "[Processing account: $member]"
    for region in $regions; do
        echo -e "# Disassociating member $member in region $region"
        aws inspector2 disassociate-member --account-id "$member" --region "$region"
    done
    echo -e "[Completed for account $member]\n"
done

最後に

一部アカウントを対象にした処理 + リージョン毎のLambdaCodeスキャンのサポート対応有無に合わせた処理を実行するスクリプトを紹介しました。

基本的に全アカウントへの処理を実行する場合はinspector2-enablement-with-cliを使ってもらえればと思いますが、アカウント数が多くなると実行時間が長くなります。

こちらのスクリプトであればリージョン毎のLambdaCodeスキャンのサポート対応有無を考慮して、まとめて--resource-typesを指定できるので実行時間を短くしたい場合にも利用いただけるかと思います!

こちらの内容がどなたかのお役に立てれば幸いです。

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