💡

SSMドキュメントのパブリック共有ブロック設定を全リージョンに対してサクッと設定した話

に公開

はじめに

AWS Security Hubを運用していると、様々なセキュリティコントロールに対応する必要があります。今回は、その中でも「SSM.7 - SSM documents should have the block public sharing setting enabled」というコントロールに対応した話です。

このコントロールは、Systems Manager (SSM) ドキュメントが誤ってパブリックに共有されることを防ぐための重要な設定です。しかし、この設定はリージョンごとに行う必要があり、手動で全リージョンに設定するのは非常に手間がかかります。

そこで、AWS CLIを使用したシンプルなBashスクリプトをClaude Codeで作成し、設定変更が必要だった17リージョンに対して一括で設定できるようにしました。

なぜこの設定が重要なのか

SSMドキュメントには、以下のような情報が含まれる可能性があります:

  • 自動化スクリプトのロジック
  • インフラストラクチャの設定手順
  • トラブルシューティング手順
  • 社内システムの構成情報

これらが意図せずパブリックに公開されると、セキュリティリスクとなる可能性があるため、対応が必要です。

設定変更方法

AWS CLIの update-service-setting コマンドを使用して、各リージョンで以下の設定を適用します:

aws ssm update-service-setting \
    --setting-id "/ssm/documents/console/public-sharing-permission" \
    --setting-value "Disable" \
    --region <region-name>

Claude Code でのスクリプト作成

次のような内容をClaude Codeに伝え、スクリプトを作成しました。

  • AWS Security Hubのコントロールで"SSM.7 - SSM documents should have the block public sharing setting enabled" という項目があり、失敗している
  • すべてのリージョンのSSMドキュメントのパブリック共有のブロック設定を行うスクリプト、および、作業手順書(マークダウン形式)を作成してほしい
  • 複数のアカウントがあるため、プロファイル名を引数に対象アカウントに対して実行できるようにしてほしい
  • 対象リージョンのリスト
  • bashスクリプトで記載、AWS CLIを利用する
  • レビューコストもあるので、シンプルであること

作成したスクリプト

1. 設定適用スクリプト

対象リージョンに対してパブリック共有のブロック設定を適用するスクリプトです。

enable_ssm_block_public_sharing.sh
#!/bin/bash

# SSMドキュメントのパブリック共有をブロックするスクリプト
# AWS Security Hub コントロール: SSM.7 対応

# 対象リージョン
REGIONS=(
    "ap-northeast-1"
    "ap-northeast-2"
    "ap-northeast-3"
    "ap-south-1"
    "ap-southeast-1"
    "ap-southeast-2"
    "ca-central-1"
    "eu-central-1"
    "eu-north-1"
    "eu-west-1"
    "eu-west-2"
    "eu-west-3"
    "sa-east-1"
    "us-east-1"
    "us-east-2"
    "us-west-1"
    "us-west-2"
)

# 引数チェック
if [ $# -eq 0 ]; then
    echo "使用方法: $0 <profile-name>"
    echo "例: $0 my-aws-profile"
    exit 1
fi

PROFILE=$1
ACCOUNT_ID=$(aws sts get-caller-identity --profile "$PROFILE" --query Account --output text 2>/dev/null)

if [ $? -ne 0 ]; then
    echo "エラー: プロファイル '$PROFILE' でAWS認証に失敗しました"
    exit 1
fi

echo "======================================================================"
echo "SSMドキュメントのパブリック共有ブロック設定"
echo "アカウントID: $ACCOUNT_ID"
echo "プロファイル: $PROFILE"
echo "対象リージョン数: ${#REGIONS[@]}"
echo "======================================================================"

SUCCESS_COUNT=0
ALREADY_SET_COUNT=0
FAILED_COUNT=0

# 各リージョンで設定を適用
for REGION in "${REGIONS[@]}"; do
    echo -n "[$REGION] 処理中... "
    
    # SSMサービス設定を更新(パブリック共有を無効化)
    OUTPUT=$(aws ssm update-service-setting \
        --setting-id "/ssm/documents/console/public-sharing-permission" \
        --setting-value "Disable" \
        --region "$REGION" \
        --profile "$PROFILE" 2>&1)
    
    if [ $? -eq 0 ]; then
        echo "✓ 設定完了"
        ((SUCCESS_COUNT++))
    else
        # エラー内容を確認
        if echo "$OUTPUT" | grep -q "ServiceSettingAlreadySet"; then
            echo "✓ 既に設定済み"
            ((ALREADY_SET_COUNT++))
        else
            echo "✗ 失敗: $OUTPUT"
            ((FAILED_COUNT++))
        fi
    fi
done

# サマリー表示
echo ""
echo "======================================================================"
echo "実行結果サマリー"
echo "----------------------------------------------------------------------"
echo "  設定変更: $SUCCESS_COUNT リージョン"
echo "  既に設定済み: $ALREADY_SET_COUNT リージョン"
echo "  失敗: $FAILED_COUNT リージョン"
echo "  合計: ${#REGIONS[@]} リージョン"
echo "======================================================================"

if [ $FAILED_COUNT -gt 0 ]; then
    echo ""
    echo "⚠️  一部のリージョンで設定に失敗しました"
    exit 1
fi

echo ""
echo "✅ すべてのリージョンで設定が完了しました"
exit 0

2. 設定確認スクリプト

現在の設定状態を確認するスクリプトです。設定前後の状態確認に使用します。

check_ssm_block_public_sharing.sh
#!/bin/bash

# SSMドキュメントのパブリック共有ブロック設定状態を確認するスクリプト

# 対象リージョン
REGIONS=(
    "ap-northeast-1"
    "ap-northeast-2"
    "ap-northeast-3"
    "ap-south-1"
    "ap-southeast-1"
    "ap-southeast-2"
    "ca-central-1"
    "eu-central-1"
    "eu-north-1"
    "eu-west-1"
    "eu-west-2"
    "eu-west-3"
    "sa-east-1"
    "us-east-1"
    "us-east-2"
    "us-west-1"
    "us-west-2"
)

# 引数チェック
if [ $# -eq 0 ]; then
    echo "使用方法: $0 <profile-name>"
    echo "例: $0 my-aws-profile"
    exit 1
fi

PROFILE=$1
ACCOUNT_ID=$(aws sts get-caller-identity --profile "$PROFILE" --query Account --output text 2>/dev/null)

if [ $? -ne 0 ]; then
    echo "エラー: プロファイル '$PROFILE' でAWS認証に失敗しました"
    exit 1
fi

echo "======================================================================"
echo "SSMドキュメントのパブリック共有ブロック設定 - 現在の状態確認"
echo "アカウントID: $ACCOUNT_ID"
echo "プロファイル: $PROFILE"
echo "対象リージョン数: ${#REGIONS[@]}"
echo "======================================================================"
echo ""

BLOCKED_COUNT=0
NOT_BLOCKED_COUNT=0
ERROR_COUNT=0

# 各リージョンの設定を確認
for REGION in "${REGIONS[@]}"; do
    # SSMサービス設定を取得
    SETTING_VALUE=$(aws ssm get-service-setting \
        --setting-id "/ssm/documents/console/public-sharing-permission" \
        --region "$REGION" \
        --profile "$PROFILE" \
        --query "ServiceSetting.SettingValue" \
        --output text 2>/dev/null)
    
    if [ $? -eq 0 ]; then
        if [ "$SETTING_VALUE" == "Disable" ]; then
            echo "✓ [$REGION] ブロック済み"
            ((BLOCKED_COUNT++))
        else
            echo "✗ [$REGION] ブロックされていません (現在の値: $SETTING_VALUE)"
            ((NOT_BLOCKED_COUNT++))
        fi
    else
        echo "⚠ [$REGION] 設定の取得に失敗しました"
        ((ERROR_COUNT++))
    fi
done

# サマリー表示
echo ""
echo "======================================================================"
echo "確認結果サマリー"
echo "----------------------------------------------------------------------"
echo "  ブロック済み: $BLOCKED_COUNT リージョン"
echo "  未ブロック: $NOT_BLOCKED_COUNT リージョン"
echo "  エラー: $ERROR_COUNT リージョン"
echo "  合計: ${#REGIONS[@]} リージョン"
echo "======================================================================"

if [ $NOT_BLOCKED_COUNT -gt 0 ] || [ $ERROR_COUNT -gt 0 ]; then
    echo ""
    echo "⚠️  対応が必要なリージョンがあります"
    echo "   enable_ssm_block_public_sharing.sh を実行してください"
    exit 1
fi

if [ $BLOCKED_COUNT -eq ${#REGIONS[@]} ]; then
    echo ""
    echo "✅ すべてのリージョンでパブリック共有がブロックされています"
fi

exit 0

実行結果

実際に本番環境で実行した結果がこちらです:

1. 作業前のチェック (check_ssm_block_public_sharing.sh)

======================================================================
SSMドキュメントのパブリック共有ブロック設定 - 現在の状態確認
アカウントID: 123456789012
プロファイル: sandbox
対象リージョン数: 17
======================================================================

✗ [ap-northeast-1] ブロックされていません (現在の値: Enable)
✗ [ap-northeast-2] ブロックされていません (現在の値: Enable)
✗ [ap-northeast-3] ブロックされていません (現在の値: Enable)
✗ [ap-south-1] ブロックされていません (現在の値: Enable)
✗ [ap-southeast-1] ブロックされていません (現在の値: Enable)
✗ [ap-southeast-2] ブロックされていません (現在の値: Enable)
✗ [ca-central-1] ブロックされていません (現在の値: Enable)
✗ [eu-central-1] ブロックされていません (現在の値: Enable)
✗ [eu-north-1] ブロックされていません (現在の値: Enable)
✗ [eu-west-1] ブロックされていません (現在の値: Enable)
✗ [eu-west-2] ブロックされていません (現在の値: Enable)
✗ [eu-west-3] ブロックされていません (現在の値: Enable)
✗ [sa-east-1] ブロックされていません (現在の値: Enable)
✗ [us-east-1] ブロックされていません (現在の値: Enable)
✗ [us-east-2] ブロックされていません (現在の値: Enable)
✗ [us-west-1] ブロックされていません (現在の値: Enable)
✗ [us-west-2] ブロックされていません (現在の値: Enable)

======================================================================
確認結果サマリー
----------------------------------------------------------------------
  ブロック済み: 0 リージョン
  未ブロック: 17 リージョン
  エラー: 0 リージョン
  合計: 17 リージョン
======================================================================

⚠️  対応が必要なリージョンがあります
   enable_ssm_block_public_sharing.sh を実行してください

2. 変更 (enable_ssm_block_public_sharing.sh)

======================================================================
SSMドキュメントのパブリック共有ブロック設定
アカウントID: 123456789012
プロファイル: sandbox
対象リージョン数: 17
======================================================================
[ap-northeast-1] 処理中... ✓ 設定完了
[ap-northeast-2] 処理中... ✓ 設定完了
[ap-northeast-3] 処理中... ✓ 設定完了
[ap-south-1] 処理中... ✓ 設定完了
[ap-southeast-1] 処理中... ✓ 設定完了
[ap-southeast-2] 処理中... ✓ 設定完了
[ca-central-1] 処理中... ✓ 設定完了
[eu-central-1] 処理中... ✓ 設定完了
[eu-north-1] 処理中... ✓ 設定完了
[eu-west-1] 処理中... ✓ 設定完了
[eu-west-2] 処理中... ✓ 設定完了
[eu-west-3] 処理中... ✓ 設定完了
[sa-east-1] 処理中... ✓ 設定完了
[us-east-1] 処理中... ✓ 設定完了
[us-east-2] 処理中... ✓ 設定完了
[us-west-1] 処理中... ✓ 設定完了
[us-west-2] 処理中... ✓ 設定完了

======================================================================
実行結果サマリー
----------------------------------------------------------------------
  設定変更: 17 リージョン
  既に設定済み: 0 リージョン
  失敗: 0 リージョン
  合計: 17 リージョン
======================================================================

✅ すべてのリージョンで設定が完了しました

3. 作業後のチェック (check_ssm_block_public_sharing.sh)

======================================================================
SSMドキュメントのパブリック共有ブロック設定 - 現在の状態確認
アカウントID: 123456789012
プロファイル: sandbox
対象リージョン数: 17
======================================================================

✓ [ap-northeast-1] ブロック済み
✓ [ap-northeast-2] ブロック済み
✓ [ap-northeast-3] ブロック済み
✓ [ap-south-1] ブロック済み
✓ [ap-southeast-1] ブロック済み
✓ [ap-southeast-2] ブロック済み
✓ [ca-central-1] ブロック済み
✓ [eu-central-1] ブロック済み
✓ [eu-north-1] ブロック済み
✓ [eu-west-1] ブロック済み
✓ [eu-west-2] ブロック済み
✓ [eu-west-3] ブロック済み
✓ [sa-east-1] ブロック済み
✓ [us-east-1] ブロック済み
✓ [us-east-2] ブロック済み
✓ [us-west-1] ブロック済み
✓ [us-west-2] ブロック済み

======================================================================
確認結果サマリー
----------------------------------------------------------------------
  ブロック済み: 17 リージョン
  未ブロック: 0 リージョン
  エラー: 0 リージョン
  合計: 17 リージョン
======================================================================

✅ すべてのリージョンでパブリック共有がブロックされています

まとめ

SSMドキュメントのパブリック共有ブロック設定は、Security Hubのスコアを改善するだけでなく、実際のセキュリティリスクを低減する重要な設定です。
ただ、全リージョンで複数アカウントに適用するとなるとひと手間なのですが、Claude Codeでスクリプトを作成、レビュー、設定変更作業、という流れをとることで、運用コストを低く抑えつつ、作業品質も向上できたかなと思います。

同様の課題を抱えている方の参考になれば幸いです。

参考資料

あしたのチーム Tech Blog

Discussion