Amazon ECSタスク定義で特権モードを指定している場合の設定修正手順

このブログシリーズ 「クラウドセキュリティ 実践集」 では、一般的なセキュリティ課題を取り上げ、「なぜ危険なのか?」 というリスクの解説から、「どうやって直すのか?」 という具体的な修復手順(コンソール、AWS CLI、Terraformなど)まで、分かりやすく解説します。

この記事では、特権モードを指定しているコンテナ定義を1つでも含むAmazon ECSタスク定義について、そのリスクと対策を解説します。

画像に alt 属性が指定されていません。ファイル名: 13e11608c3ab504725ce4500088eb55e-1024x341.webp

ポリシーの説明

まず、AWS Security Hubによるポリシーの説明は以下の通りです。

[ECS.4] ECS コンテナは、非特権として実行する必要があります

Amazon ECS の Security Hub コントロール – AWS Security Hub

このコントロールは、Amazon ECS のタスク定義の、コンテナ定義の privileged パラメータが true に設定されているかどうかをチェックします。このパラメータの値が true である場合、このコントロールは失敗します。このコントロールは、Amazon ECS タスク定義の最新のアクティブなリビジョンのみを評価します。

リスクとしては、ホストシステムのリソースや操作に意図しないアクセスが可能となり、セキュリティ上のリスクが増大する可能性があります。

そのため、ECS のタスク定義において、コンテナ定義の privileged パラメータを false に設定し、昇格された特権を削除することが望ましいです。これにより、コンテナがホストシステム上で不要な特権を持たず、セキュリティリスクを低減できます。

修復方法

AWS CLIでの修復手順

Amazon ECSタスク定義の特権モード設定をチェックするスクリプトを作成します。

#!/bin/bash

# 色の定義
RED='\\\\033[0;31m'
GREEN='\\\\033[0;32m'
YELLOW='\\\\033[1;33m'
NC='\\\\033[0m' # No Color

echo "ECSタスク定義の特権モードチェックを開始します..."
echo "=============================================="

# リージョン一覧を取得
regions=$(aws ec2 describe-regions --query 'Regions[*].RegionName' --output text)

check_task_definition() {
    local task_def_arn=$1
    local region=$2
    local has_privileged=false

    # タスク定義の詳細を取得
    task_def=$(aws ecs describe-task-definition \\\\
        --task-definition "$task_def_arn" \\\\
        --region "$region" 2>/dev/null)

    if [ $? -ne 0 ]; then
        echo -e "${YELLOW}警告: タスク定義の取得に失敗しました: $task_def_arn${NC}"
        return
    }

    # タスク定義の基本情報を表示
    family=$(echo "$task_def" | jq -r '.taskDefinition.family')
    revision=$(echo "$task_def" | jq -r '.taskDefinition.revision')

    echo "タスク定義ファミリー: $family"
    echo "リビジョン: $revision"

    # コンテナ定義をチェック
    containers=$(echo "$task_def" | jq -r '.taskDefinition.containerDefinitions[]')

    echo "$containers" | while read -r container; do
        container_name=$(echo "$container" | jq -r '.name')
        privileged=$(echo "$container" | jq -r '.privileged // false')

        echo "コンテナ名: $container_name"

        if [ "$privileged" = "true" ]; then
            echo -e "${RED}警告: 特権モードが有効になっています${NC}"
            has_privileged=true

            # 修正のための推奨事項を表示
            echo -e "${YELLOW}推奨される修正方法:${NC}"
            echo "1. タスク定義を更新し、特権モードを無効化してください"
            echo "以下は修正後のタスク定義の例です:"
            cat << EOF
{
    "family": "$family",
    "containerDefinitions": [
        {
            "name": "$container_name",
            "privileged": false,
            // その他の必要な設定
        }
    ]
}
EOF
        else
            echo -e "${GREEN}✓ 特権モードは無効です(推奨設定)${NC}"
        fi
    done

    if [ "$has_privileged" = true ]; then
        echo -e "\\\\n${YELLOW}セキュリティリスク:${NC}"
        echo "- 特権モードが有効な場合、コンテナはホストインスタンス上で root 権限を持ちます"
        echo "- これにより、コンテナがホストシステムのリソースに無制限にアクセスできる可能性があります"
        echo "- 必要な場合を除き、特権モードは無効にすることを強く推奨します"
    fi

    echo "----------------------------------------"
}

# メイン処理
for region in $regions; do
    echo "リージョン: $region のチェックを開始..."

    # タスク定義の一覧を取得
    task_families=$(aws ecs list-task-definition-families \\\\
        --status ACTIVE \\\\
        --region "$region" \\\\
        --query 'families[]' \\\\
        --output text)

    if [ -n "$task_families" ]; then
        for family in $task_families; do
            # 最新のアクティブなタスク定義を取得
            task_def=$(aws ecs describe-task-definition \\\\
                --task-definition "$family" \\\\
                --region "$region" \\\\
                --query 'taskDefinition.taskDefinitionArn' \\\\
                --output text)

            if [ -n "$task_def" ]; then
                check_task_definition "$task_def" "$region"
            fi
        done
    else
        echo "アクティブなタスク定義ファミリーは見つかりませんでした"
    fi

    echo "================================================"
done

echo "チェック完了"

このスクリプトの主な機能と使用方法を説明します:

主な機能:

  1. 全リージョンのECSタスク定義をチェック
  2. 各タスク定義の特権モード設定を確認
  3. セキュリティリスクの評価
  4. 修正のための推奨事項を提供

使用方法:

  1. スクリプトを実行可能にします:
chmod +x ecs-privileged-check.sh

2. スクリプトを実行:

    ./ecs-privileged-check.sh
    
    

    チェック項目:

    1. 特権モード設定:
      • privilegedパラメータの値
      • コンテナごとの設定状態
    2. タスク定義の詳細:
      • ファミリー名
      • リビジョン番号
      • コンテナ設定

    出力の見方:

    • 🟢 緑色:安全な設定(特権モード無効)
    • 🔴 赤色:危険な設定(特権モード有効)
    • 🟡 黄色:警告と推奨事項

    修正例:

    {
        "family": "my-task-definition",
        "containerDefinitions": [
            {
                "name": "my-container",
                "privileged": false,
                "image": "my-image",
                // その他の必要な設定
            }
        ]
    }
    
    

    セキュリティリスク:

    1. ホストシステムへの無制限アクセス
    2. コンテナのエスケープリスク
    3. システムリソースの乱用

    このスクリプトを使用することで、環境内のECSタスク定義の特権モード設定を簡単にチェックし、必要な修正作業を特定できます。

    最後に

    今回は、Amazon ECS のタスク定義において privileged モードが有効になっている場合のリスクとその対策についてご紹介しました。 コンテナに不要な特権を付与すると、ホストシステムのリソースに意図しないアクセスが可能となり、セキュリティリスクが高まる可能性があります。 設定を確認し、privileged が有効になっていた場合は、本記事を参考に修正してみてください。

    この問題の検出は弊社が提供するSecurifyのCSPM機能で簡単に検出及び管理する事が可能です。

    運用が非常に楽に出来る製品になっていますので、ぜひ興味がある方はお問い合わせお待ちしております。

    最後までお読みいただきありがとうございました。この記事が皆さんの役に立てば幸いです

    この記事をシェアする

    クラウドセキュリティ対策実践集一覧へ戻る

    貴社の利用状況に合わせた見積もりを作成します。

    料金プランを詳しく見る