Amazon Web Services ブログ

AWS Cost and Usage Reports データを使用したセキュリティリスクの特定

AWS の請求書からわかるのは、支出パターンだけではありません。セキュリティ上の問題を特定することもできます。AWS Cost and Usage Reports (CUR) には、AWS Organizations 全体にわたる詳細な使用状況データが含まれており、コスト最適化の機会の発見、コストの配分、そして潜在的なセキュリティリスクの検出に活用できます。この記事では、AWS CUR を使用して環境内の潜在的なセキュリティ上の問題を特定する方法について説明します。潜在的なリスクの例と、それらがアカウント内に存在するかどうかを判断するために使用できる CUR データ内のマーカーを紹介します。

この記事の手順に沿って進めるには、AWS Organizations のプライマリ請求アカウント (※注) (または委任管理者アカウント) へのアクセス権があること、Data Exports が設定された Cost and Usage Reports 2.0 が利用可能であること、そしてデータをクエリするための Amazon Athena へのアクセス権があることが必要です。

※注:通常は管理アカウントですが、AWS Billing Transfer 利用時は異なる場合があります。

各セキュリティリスクについて、それが問題となる理由、検出方法、そして AWS 環境内の潜在的な問題を特定するためにコンソールの Athena で CUR データに対して実行できる SQL クエリなどの詳細を提供します。CUR テーブル名と日付フィルターにはプレースホルダーとして ${table} と ${date-filter} を使用しています。これらの値の確認方法については、CUR Query Library を参照してください。また、質問や発見事項がある場合は、自社のアーキテクチャを踏まえて検討できるよう、貴社のセキュリティチームにも相談してください。

リスク 1:暗号化されていない Amazon CloudFront トラフィック

問題点: Amazon CloudFront は、暗号化されたトラフィック (HTTPS) と暗号化されていないトラフィック (HTTP) の両方をサポートしています。HTTP をサポートするように設定されている場合、ユーザーと CloudFront ディストリビューション間のデータは保護されない状態で送信されます。このトラフィックを傍受した第三者は、データを読み取ったり改ざんしたりすることが可能です。

多くのコンプライアンスフレームワーク (PCI DSS、HIPAA、GDPR) では、転送中のデータの暗号化が求められています。暗号化されていないトラフィックは、コンプライアンス違反、データ侵害、そして顧客からの信頼の喪失につながる可能性があります。

検出方法: CUR は、HTTP トラフィックと HTTPS トラフィックを区別する特定の使用タイプコードを通じて、CloudFront の使用パターンを記録しています。HTTP トラフィックでは、region-Out-Bytes-HTTP-Static や region-Out-Bytes-HTTP-Dynamic のような料金が発生し、セキュアなトラフィックでは region-Out-Bytes-HTTPS-Static や region-Out-Bytes-HTTPS-Dynamic として表示されます。これらの HTTP 料金が存在する場合、ポリシー違反の可能性があることを示しており、調査が必要です。

以下のクエリを使用して、CloudFront ディストリビューション上の暗号化されていないトラフィックを特定できます。

SELECT
    line_item_resource_id,
    line_item_usage_type,
    product['region']                    AS region,
    billing_period,
    SUM(line_item_usage_amount)          AS total_usage_amount,
    SUM(line_item_unblended_cost)        AS total_cost
FROM ${table}
WHERE product['product_name'] = 'Amazon CloudFront'
  AND (
        line_item_usage_type LIKE '%HTTP-Static%'
     OR line_item_usage_type LIKE '%HTTP-Dynamic%'
     OR line_item_usage_type LIKE '%HTTP-Proxy%'
      )
  AND line_item_usage_type    NOT LIKE '%HTTPS%'
  AND line_item_unblended_cost > 0
  AND billing_period           = ${date-filter}
GROUP BY
    1, 2, 3, 4
ORDER BY
    total_cost DESC;

このクエリの結果は、暗号化されていないトラフィックを実際に配信している CloudFront ディストリビューションを示します。line_item_resource_id を使用して CloudFront コンソールで該当するディストリビューションを見つけ、Viewer Protocol Policy を「Redirect HTTP to HTTPS」または「HTTPS Only」に更新してください。

リスク 2:承認されていないリージョンの使用

問題点: 組織は通常、データ所在地の要件、コンプライアンス規制、またはビジネスポリシーに基づいて、特定の承認されたリージョンで AWS リソースを運用しています。承認されていないリージョンにリソースが存在する場合、認証情報の漏洩や、従業員が確立されたポリシーを回避している可能性を示唆しており、調査が必要です。

検出方法: CUR は、各明細項目の product[‘region’] フィールドを通じてリージョン情報を記録しており、送信元-送信先-使用状況のパターン (例:USE1-TimedStorage-ByteHrs) に従うデータ転送コードを識別します。承認済みリスト外のリージョンでフィルタリングすることで、想定外のリソース使用を特定できます。なお、AWS CloudTrail など一部の AWS サービスは、設計上グローバルまたは複数リージョンにまたがって動作するため、この分析からは除外する必要があります。

以下のクエリを使用して、承認済みリスト外のリージョンで発生している料金を特定できます。クエリを実行する前に、NOT IN 句を更新して、組織で承認されているすべてのリージョン (例:’us-east-1’、’us-west-2’、’eu-west-1’、’global’) を含めてください。

SELECT
    CASE
        WHEN (bill_billing_entity = 'AWS Marketplace'
              AND line_item_line_item_type NOT LIKE '%Discount%')
            THEN product['product_name']
        WHEN (product['product_name'] = '')
            THEN line_item_product_code
        ELSE product['product_name']
    END AS product_name,
    CASE product['region']
        WHEN NULL     THEN 'Global'
        WHEN ''       THEN 'Global'
        WHEN 'global' THEN 'Global'
        ELSE product['region']
    END AS product_region,
    line_item_availability_zone,
    SUM(line_item_unblended_cost) AS sum_line_item_unblended_cost
FROM ${table}
WHERE billing_period = ${date-filter}
  AND line_item_line_item_type IN ('DiscountedUsage', 'Usage', 'SavingsPlanCoveredUsage')
  AND product['region'] NOT IN ('us-east-1', 'global')  -- update with approved region list
GROUP BY
    1,
    line_item_product_code,
    line_item_availability_zone,
    product['region']
HAVING
    SUM(line_item_unblended_cost) > 0
ORDER BY
    product_region,
    sum_line_item_unblended_cost DESC;

このクエリの結果は、承認されていないリージョンで稼働しているリソースを示しています。product_name と product_region の列を確認して、どのサービスがどこで実行されているかを特定してください。コストの高い項目は、暗号通貨のマイニングやその他の悪意のあるアクティビティを示している可能性があるため、優先的に調査してください。CloudTrail のログと照合して、これらのリソースを誰が作成したのか、そのアクティビティが承認されたものであったかどうかを確認してください。

リスク 3:Amazon CloudFront と Route 53 における保護されていない DDoS 攻撃対象領域

問題点: Amazon CloudFront と Amazon Route 53 は、DNS 解決とコンテンツ配信を大規模に処理する、ワークロードへの入り口となることが多いサービスです。その露出度の高さゆえに、ボリューム型 DDoS 攻撃の標的となります。AWS Shield Advanced などのプロアクティブな DDoS 保護がない場合、組織は専用の DDoS 保護レイヤー、リアルタイムの攻撃通知、および AWS DDoS Response Team (DRT) へのアクセスを欠くことになります。この保護のギャップは、サービス停止、攻撃中のパフォーマンス低下、そしてダウンタイムによる潜在的な経済的損失につながる可能性があります。

検出方法: CUR は、このセキュリティギャップを、データの存在ではなく不在によって明らかにします。CloudFront と Route 53 の支出を算出し、同じ請求期間内に Shield Advanced の料金が存在するかどうかを確認することで、保護されていないインフラストラクチャを特定できます。CloudFront または Route 53 のコストが発生しているにもかかわらず、対応する Shield Advanced の支出がない場合、それらのディストリビューションには専用の DDoS 保護が欠けていることを意味します。

以下のクエリを使用して、Shield Advanced のカバレッジがないままの CloudFront/Route 53 の支出を検出できます。

WITH cloudfront_route53_spend AS (
    SELECT
        billing_period,
        SUM(line_item_unblended_cost) AS exposed_spend
    FROM ${table}
    WHERE product['product_name'] IN ('Amazon CloudFront', 'Amazon Route 53')
      AND line_item_unblended_cost > 0
      AND billing_period = ${date-filter}
    GROUP BY 1
),
shield_spend AS (
    SELECT
        billing_period,
        SUM(line_item_unblended_cost) AS shield_cost
    FROM ${table}
    WHERE product['product_name']   = 'AWS Shield'
      AND line_item_unblended_cost > 0
      AND billing_period            = ${date-filter}
    GROUP BY 1
)
SELECT
    c.billing_period,
    c.exposed_spend                  AS cloudfront_route53_spend,
    COALESCE(s.shield_cost, 0)       AS shield_advanced_spend,
    CASE
        WHEN COALESCE(s.shield_cost, 0) = 0
            THEN 'No Shield Advanced - DDoS Protection Gap'
        ELSE 'Shield Advanced Active'
    END AS ddos_risk_status
FROM cloudfront_route53_spend c
LEFT JOIN shield_spend        s
       ON c.billing_period = s.billing_period
ORDER BY c.exposed_spend DESC;

結果に「No Shield Advanced – DDoS Protection Gap」と表示された場合、DDoS 保護なしで稼働している CloudFront または Route 53 のディストリビューションがあることを示しています。exposed_spend を確認して、AWS 環境全体で保護されていないインフラストラクチャとリソースを特定してください。リスク許容度と、DDoS 攻撃がオペレーションに与える潜在的な影響に基づいて、費用対効果を評価してください。特に機密データやビジネスクリティカルなアプリケーションを扱う重要なディストリビューションについては、AWS Shield Advanced の有効化を検討してください。

リスク 4:延長サポートが適用された古いソフトウェア

問題点: 延長サポートの料金が発生しているということは、既知のセキュリティ上の脆弱性を含む古いバージョンのソフトウェアでシステムが稼働していることを示しています。標準サポートのライフサイクルを超えたレガシーソフトウェアバージョンの運用を続けている場合、割増料金 (100〜600% のコスト増加) を支払っているだけでなく、それらの古いバージョンには攻撃者が悪用可能なパッチ未適用の脆弱性が含まれている可能性もあります。3 年目以降の延長サポートは、延長サポート対象のリソースの重要度に応じて、即時の修復が必要となる可能性のある深刻なリスクがあることを示しています。延長サポートによる財務的な影響は、アップグレードの優先度を上げるべき明確なシグナルとしても捉えるべきです。

検出方法: CUR は、line_item_usage_type フィールドに「ExtendedSupport」パターンを含む延長サポート料金を記録します。これらの料金は請求データ内で個別の明細項目として表示されるため、容易に特定できます。使用タイプに ExtendedSupport を含む Usage 明細項目でフィルタリングすることで、脆弱性のある古いバージョンで稼働しているワークロードやリソースを正確に特定できます。コストの大きさもまた深刻度を示す指標となります。延長サポートのコストが高いほど、一般的にはより古いバージョンで稼働していることを意味し、より緊急な対応が求められます。以下のクエリを使用して、延長サポート料金が発生しているシステムを特定できます。

SELECT
    line_item_line_item_type,
    line_item_resource_id,
    line_item_usage_account_id,
    product['product_code']          AS product_code,
    line_item_operation,
    line_item_line_item_description,
    line_item_usage_type,
    billing_period,
    SUM(line_item_usage_amount)      AS sum_line_item_usage_amount,
    SUM(line_item_unblended_cost)    AS sum_line_item_unblended_cost
FROM ${table}
WHERE billing_period           = ${date-filter}
  AND line_item_line_item_type = 'Usage'
  AND line_item_usage_type LIKE '%ExtendedSupport%'
GROUP BY
    1, 2, 3, 4, 5, 6, 7, 8
ORDER BY
    sum_line_item_unblended_cost DESC
LIMIT 100;

延長サポート料金が表示された結果は、古く脆弱性のあるソフトウェアが存在しており、早急な対応が必要であることを示しています。line_item_line_item_description を確認して、具体的なリソースやワークロードを特定してください。コストへの影響とサポートティアに基づいてアップグレードの優先順位を決定してください。たとえば、長期 (3 年以上) の延長サポートは重大なリスクを伴う可能性があり、移行計画の推進に役立てることができます。

リスク 5:異常なデータ転送コスト

問題点: データ転送料金の急増は、セキュリティ上の問題を示している可能性があります。攻撃者が AWS 環境を侵害した場合、大量のデータを窃取 (持ち出し) しようとしたり、外部のコマンド&コントロール (C&C) サーバーと通信するためにリソースを悪用したりすることがよくあります。これらのアクティビティは、請求データ上でコストの異常として現れる、通常とは異なるデータ転送パターンを生み出します。

検出方法: CUR は、lineItem/UsageType フィールドを通じて詳細なデータ転送情報を記録しています。このフィールドにより、アウトバウンドインターネットトラフィック (DataTransfer-Out-Bytes)、リージョン間転送 (AWS-Out-Bytes)、アベイラビリティゾーン間トラフィック (DataTransfer-Regional-Bytes) など、さまざまな種類のデータ移動を識別できます。これらのパターンを時系列で分析し、ベースラインの使用状況と比較することで、調査が必要な不審な急増を特定できます。

以下のクエリを使用して、セキュリティ上の問題を示す可能性のあるデータ転送コストとパターンを特定できます。

SELECT
    line_item_usage_account_id,
    line_item_resource_id,
    product['region'] as region,
    line_item_usage_type,
    product_product_family,
    line_item_operation,
    product_from_location,
    product_to_location,
    pricing_unit,
    DATE_FORMAT(line_item_usage_start_date, '%Y-%m-%d') AS usage_date,
    ROUND(SUM(line_item_usage_amount), 2)              AS total_gb,
    ROUND(SUM(line_item_unblended_cost), 2)            AS total_cost
FROM ${table}
WHERE product_product_family   = 'Data Transfer'
  AND line_item_line_item_type = 'Usage'
  AND (
        line_item_usage_type LIKE '%DataTransfer-Out-Bytes%'
     OR line_item_usage_type LIKE '%DataTransfer-Regional-Bytes%'
     OR line_item_usage_type LIKE '%AWS-Out-Bytes%'
      )
  AND billing_period = ${date-filter}
GROUP BY
    1, 2, 3, 4, 5, 6, 7, 8, 9, 10
ORDER BY
    total_cost DESC,
    total_gb   DESC;

この結果で大幅なコスト増加や通常とは異なる転送パターンが示された場合は調査が必要です。他のリスクほど単純に潜在的なリスクを判断できるものではないため、このデータについては必ず開発チームと連携して確認してください。確認すべき主なフィールドは以下のとおりです。

  • line_item_resource_id: データ転送を発生させている特定の AWS リソース (EC2 インスタンス、S3 バケットなど) を識別します
  • total_gb: 転送されたデータ量 — 急激な増加は調査が必要です
  • total_cost: 転送アクティビティによる財務的な影響
  • product_from_locationとproduct_to_location: 転送元と転送先のリージョン

line_item_resource_id を既知のリソースと照合して、承認されていないインスタンスや侵害されたインスタンスがないかを確認してください。さらに詳しく調査するには、これらの結果を VPC Flow Logs や CloudTrail と関連付けて、データ転送の急増に関連する具体的なネットワーク接続や API アクティビティを特定してください。

追加のプロアクティブなセキュリティ対策

ここまで、CUR を分析するために使用できるクエリの例をいくつか紹介してきましたが、セキュリティ上の問題を検出するために活用できる AWS サービスを使ったプロアクティブな対策もあります。

  • AWS Budgets は、突然の支出の急増を検出し、承認されていないリソースのプロビジョニングを示唆します。悪意のあるアクティビティの標的になりやすいコンピューティング集約型のサービスには、個別の予算を設定してください。
  • AWS Cost Anomaly Detection は、機械学習を使用して異常な支出パターンを自動的に検出します。1 日 3 回、24 時間の検出ウィンドウで実行されます。
  • Amazon GuardDuty は、行動分析とコストパターンを関連付けます。特に、不審なシステムコールとコンピューティングコストの急増を組み合わせることで、暗号通貨マイニングやその他の種類の分析を検出します。
  • AWS Security Hub は、コストベースの検出結果と従来のセキュリティアラートを一元化し、統合的に確認できるようにすることで調査時間を短縮します。予算アラートを GuardDuty の検出結果や Amazon Inspector の脆弱性評価と関連付けることで、包括的な脅威検出が可能になります。

今すぐ行動を開始しましょう

以下のステップから始めてください。

  1. 時間単位の粒度とリソースレベルのデータを含む AWS Cost and Usage Reports (CUR) を有効にする
  2. 前述の SQL クエリを使用して CUR データをクエリできるように Amazon Athena を設定する
  3. 厳しめのしきい値で Budgets と Anomaly Detection を設定する
  4. この記事で紹介したリスクを検出するためのクエリを実行する
  5. 検出結果を AWS Security Hub に統合し、セキュリティ管理を一元化する

コストベースのセキュリティモニタリングは、財務的な痕跡を通じて脅威を検出することで、従来のセキュリティツールを補完します。経済的なインセンティブとセキュリティ要件が交わることで、より良いアーキテクチャへの改善を促す自然な力が生まれます。セキュリティ上の問題が目に見えるコストとして現れることで、組織はそれを修正する動機を得ると同時に、測定可能なセキュリティ指標も手に入れることができます。
セキュリティと FinOps のリーダーは協力して、コストベースのモニタリングを標準的なプラクティスとして確立すべきです。この記事で紹介したクエリは、すぐに実装できる手段を提供します。また、AWS のセキュリティサービスとの統合により、既存のオペレーションとの互換性も確保されます。AWS の請求データを、単なる財務レポートツールからセキュリティインテリジェンスプラットフォームへと変革しましょう。今こそ行動する時です。

Steph Gooch

Steph Gooch

Steph は、シニア最適化ソリューションアーキテクトアドボケイトです。お客様が現在および将来の AWS 支出を最適化する方法をガイドする分野のエキスパートです。お客様が請求データと使用状況データを整理・分析し、そのデータから実行可能なインサイトを見出し、コスト意識を組織文化に根付かせるための持続可能な戦略を策定できるよう支援しています。前職では、Big Four の 1 社で FinOps チームを率いていました。

Mark Keating

Mark Keating

Markは、英国を拠点とするプリンシパルセキュリティソリューションアーキテクトで、グローバルのヘルスケア・ライフサイエンスおよび自動車業界のお客様と連携し、セキュリティとコンプライアンスの課題解決およびリスク低減を支援しています。オペレーション、ソリューション、エンタープライズアーキテクチャの各分野にわたり、20年以上のテクノロジー業界での経験を持っています。

翻訳はテクニカルアカウントマネージャーの堀沢が担当しました。原文はこちらです。