Defender for Cloudのsub-assessments API終了|個別レコメンデーションへの移行手順

Microsoft Defender for Cloudでsub-assessments APIからデータを取得できなくなった場合、サービス障害として復旧を待つのではなく、個別レコメンデーションへの移行が必要です。

Microsoftは2026年7月31日、旧グループ化レコメンデーションの廃止完了を案内しました。旧データはAPIからアクセスできなくなり、今後はMicrosoft.Security/assessmentsとして公開される個別レコメンデーションを利用します。Azure portalとAzure Resource Graphへの反映には数日かかる可能性があるため、画面に旧レコメンデーションが残っていても、APIが復旧したと判断してはいけません。(Microsoft Learn)

本記事では、旧APIへの依存箇所を見つける方法、Azure Resource Graphクエリの書き換え、レコメンデーションIDの移行、disable rulesからexemptionsへの変更、移行後の検証方法までを具体的に解説します。

目次

Defender for Cloudのsub-assessments API終了で何が変わったのか

旧モデルでは、複数の脆弱性や構成不備を1つの親レコメンデーションにまとめ、その配下にsub-assessmentsとして個別の検出結果を格納していました。

たとえば、仮想マシンに複数の脆弱なソフトウェアが存在していても、画面上は「Machines should have vulnerability findings resolved」という1つのグループ化レコメンデーションとして表示されていました。

新モデルでは、ソフトウェア更新、脆弱性、シークレット、SQL Vulnerability Assessmentのルールなどが、それぞれ独立したレコメンデーションとして扱われます。(Microsoft Learn)

比較項目旧グループ化レコメンデーション新しい個別レコメンデーション
データ構造親レコメンデーションの配下に複数の検出結果検出内容ごとに独立したレコメンデーション
ARGのリソースタイプmicrosoft.security/assessments/subassessmentsmicrosoft.security/assessments
主な絞り込み方法グループ化レコメンデーションIDrecommendationCategoryまたは新しい固定ID
優先順位付けグループ単位個別の検出結果単位
例外管理disable rulesexemptions
レポート件数集約されるため少ない個別化されるため増えやすい

廃止された旧REST API

旧構成では、次のようなREST APIが利用されていました。

GET https://management.azure.com/{scope}/providers/Microsoft.Security/assessments/{assessmentName}/subAssessments?api-version=2019-01-01-preview

サブスクリプション内のsub-assessmentsを一括取得するAPIもありました。

GET https://management.azure.com/{scope}/providers/Microsoft.Security/subAssessments?api-version=2019-01-01-preview

Microsoft Learnには旧REST APIのリファレンスが残っている場合があります。しかし、リファレンスページが閲覧できることと、実環境でAPIが引き続き提供されていることは別です。2026年7月31日付のリリースノートでは、旧データへAPIからアクセスできなくなったことが明記されています。(Microsoft Learn)

Azure portalやResource Graphに旧データが残る理由

今回の変更では、API、Azure portal、Azure Resource Graphの反映タイミングが完全には一致しません。

Microsoftは、APIから旧データへアクセスできなくなった後も、Azure portalとAzure Resource Graphへの反映に数日かかる可能性があると説明しています。(Microsoft Learn)

そのため、次のような状態が発生しても不思議ではありません。

確認された状態正しい判断
旧APIからデータを取得できない廃止による影響として移行を進める
Azure portalに旧グループ化レコメンデーションが表示される表示更新の遅延である可能性が高い
ARGで旧sub-assessmentsが一時的に検索できる残存データや反映遅延として扱う
新クエリの取得件数が旧クエリより増えた個別化による正常な増加か確認する
REST APIのリファレンスページが残っているAPIの継続提供を意味しない

旧データが画面に見えるかどうかではなく、新しい個別レコメンデーションを使った処理が正常に動くかどうかを移行完了の判断基準にします。

影響を受けるシステムと設定

sub-assessments APIを直接呼び出していなくても、関連するクエリやIDを利用している処理は影響を受けます。

Microsoftは、グループ化レコメンデーションに依存していた自動化、レポート、ガバナンス、ワークフロー、クエリを検証するよう案内しています。(Microsoft Learn)

特に確認すべき対象は次のとおりです。

対象確認ポイント
REST APIURLにsubAssessmentsが含まれていないか
Azure SDKsubAssessments.listやlistAllを使用していないか
Azure Resource Graphリソースタイプがassessments/subassessmentsになっていないか
Power BI・CSVレポート旧JSONフィールドを展開していないか
Logic Apps・Functions旧レコメンデーションIDを条件にしていないか
SIEM・データレイク旧スキーマを前提にパースしていないか
Governance rulesグループ化レコメンデーションキーを指定していないか
Continuous export旧IDや旧データ形式で出力対象を指定していないか
Disable rules脆弱性やCVEを抑制する旧ルールが残っていないか

Defender for Cloudのsub-assessments APIから移行する手順

旧APIへの依存箇所を検索する

最初に、アプリケーション、スクリプト、Infrastructure as Code、クエリ、レポート定義から旧APIへの依存を洗い出します。

最低限、次の文字列を検索してください。

subAssessments
subassessments
microsoft.security/assessments/subassessments
2019-01-01-preview
subAssessmentSettings

PowerShellでは、プロジェクトフォルダー内を次のように検索できます。

Get-ChildItem -Path . -Recurse -File -ErrorAction SilentlyContinue |
    Select-String -Pattern `
        'subAssessments',
        'assessments/subassessments',
        '2019-01-01-preview',
        'subAssessmentSettings'

Visual Studio CodeやGitリポジトリでrgを利用できる場合は、次のコマンドでも確認できます。

rg -n -i "subassessments|assessments/subassessments|2019-01-01-preview|subAssessmentSettings" .

検索対象には、ソースコードだけでなく次のファイルも含めます。

  • ARMテンプレート、Bicep、Terraform
  • Logic Appsのワークフロー定義
  • Azure FunctionsやAutomation Runbook
  • Power BIのPower Query
  • Azure Workbook
  • Kustoクエリ
  • Data FactoryやSynapseのパイプライン
  • GitHub ActionsやAzure Pipelines
  • 運用手順書に記載された手動クエリ

旧レコメンデーションIDの移行先を確認する

旧レコメンデーションIDを、機械的に1つの新IDへ置き換えてはいけません。

グループ化レコメンデーションの移行先には、主に次の2種類があります。(Microsoft Learn)

移行パターン新しい指定方法
複数の個別レコメンデーションへ分割されるproperties.metadata.recommendationCategoryで絞り込む
1つの新しいレコメンデーションへ置き換わる新しい固定レコメンデーションIDを指定する

たとえば、旧レコメンデーション「Machines should have vulnerability findings resolved」のIDは次の値でした。

1195afff-c881-495e-9bc5-1486211ae03f

このレコメンデーションは、単一の新IDへ置き換えるのではなく、SoftwareUpdateカテゴリーの個別レコメンデーションへ移行します。

主なカテゴリーには次のようなものがあります。

旧レコメンデーションの内容主な移行先カテゴリー
マシンやコンテナーの脆弱性SoftwareUpdate
Azure Update Managerによる更新SystemUpdate
Windows・Linuxの構成不備HostMisconfigurations
マシン内のシークレット検出ExposedSecrets
サービスのアップグレードServiceUpgrade
コードの脆弱性CodeVulnerabilities
Infrastructure as Codeの問題IacVulnerabilities
APIセキュリティ検出ApiVulnerabilities

一方、一部のID関連レコメンデーションなどは、新しい固定assessment keyへ置き換えられます。このタイプではカテゴリーがUnknownになる場合があるため、カテゴリーだけで検索せず、新しいIDを直接指定します。(Microsoft Learn)

Azure Resource Graphクエリを書き換える

旧クエリでは、次のリソースタイプが使用されていました。

securityresources
| where type =~ "microsoft.security/assessments/subassessments"

移行後は、microsoft.security/assessmentsを対象にします。

次の例は、Azure仮想マシンを対象にSoftwareUpdateカテゴリーの個別レコメンデーションを取得するクエリです。

securityresources
| where type =~ "microsoft.security/assessments"
| extend RecommendationCategory =
    tostring(properties.metadata.recommendationCategory)
| extend Severity =
    tostring(properties.metadata.severity)
| extend ResourceType =
    tostring(properties.resourceDetails.ResourceType)
| extend Source =
    tostring(properties.resourceDetails.Source)
| where RecommendationCategory == "SoftwareUpdate"
| where ResourceType =~ "microsoft.compute/virtualmachines"
| project
    id,
    name,
    RecommendationCategory,
    Severity,
    ResourceType,
    Source,
    properties

CVEや修正バージョンまで展開する場合は、必要なフィールドを追加します。

securityresources
| where type =~ "microsoft.security/assessments"
| extend RecommendationCategory =
    tostring(properties.metadata.recommendationCategory)
| extend ResourceType =
    tostring(properties.resourceDetails.ResourceType)
| where RecommendationCategory == "SoftwareUpdate"
| where ResourceType =~ "microsoft.compute/virtualmachines"
| extend Severity =
    tostring(properties.metadata.severity)
| extend DetectedVersions =
    tostring(properties.additionalData.DetectedSoftwareVersions)
| extend FixedVersion =
    tostring(properties.additionalData.FixedVersion)
| extend CvesDetails =
    parse_json(tostring(properties.additionalData.CvesDetails))
| mv-expand Cve = CvesDetails
| extend CveId = tostring(Cve.CveId)
| project
    id,
    Severity,
    DetectedVersions,
    FixedVersion,
    CveId

Microsoftが示している脆弱性管理の移行例では、主に次のフィールド変更があります。(Microsoft Learn)

旧フィールド新フィールド
properties.status.severityproperties.metadata.severity
properties.additionalData.cveproperties.additionalData.CvesDetails
properties.additionalData.softwareVersionproperties.additionalData.DetectedSoftwareVersions
properties.additionalData.recommendedVersionproperties.additionalData.FixedVersion

この対応表は脆弱性レコメンデーションの例です。シークレット、SQL、DevOps、構成不備などではadditionalDataの内容が異なる可能性があります。カテゴリーごとに実際のJSONを取得し、存在しないプロパティを安全に処理できるようにしてください。

SourceとResourceTypeを必ず絞り込む

個別レコメンデーションのカテゴリーは、複数のクラウドやワークロードを横断します。

たとえば、SoftwareUpdateだけを条件にすると、Azure VMだけでなく、EC2、GCP Compute Engine、AKSノード、コンテナーなどの結果まで含まれる可能性があります。Microsoftも、カテゴリーへの移行後は取得範囲が広くなるため、必要に応じてリソースタイプやクラウドソースを追加で絞り込むよう説明しています。(Microsoft Learn)

Azureだけに限定したい場合は、次の条件を追加します。

| where tostring(properties.resourceDetails.Source) == "Azure"

仮想マシンだけを対象にする場合は、ResourceTypeも指定します。

| where tostring(properties.resourceDetails.ResourceType)
    =~ "microsoft.compute/virtualmachines"

カテゴリーだけで集計すると、移行前より大幅に件数が増え、レポートや通知が意図せず拡大することがあります。

REST APIの取得先をassessmentsへ変更する

REST APIを利用している場合は、旧subAssessmentsエンドポイントではなく、Microsoft.Security/assessmentsを取得対象にします。

Microsoftが公開しているassessmentsの一覧APIは次の形式です。(Microsoft Learn)

GET https://management.azure.com/{scope}/providers/Microsoft.Security/assessments?api-version=2020-01-01

サブスクリプションを指定する例は次のとおりです。

GET https://management.azure.com/subscriptions/{subscriptionId}/providers/Microsoft.Security/assessments?api-version=2020-01-01
Authorization: Bearer {accessToken}

ただし、URLからsubAssessmentsを削除するだけでは移行できません。

レスポンスの階層、重要度の格納場所、CVE情報、修正バージョン、レコメンデーションIDの使い方が変わっています。旧レスポンス用のクラスやJSONパーサーをそのまま再利用せず、新しいレスポンスを保存してスキーマを確認してください。

Azure SDKを使っている場合も、旧SubAssessmentsクライアントから、利用しているSDKバージョンで提供されるAssessmentsの一覧取得処理へ変更します。SDKのメジャーバージョンによってクラス名やページング方法が異なるため、パッケージ更新とコード変更を同時に行うのではなく、段階的に検証するのが安全です。

レポートと自動化を新しい件数モデルに合わせる

個別レコメンデーションへの移行後は、取得件数が増えるのが通常です。

旧モデルで「1台のVMに10件の脆弱性」が1つのグループとして扱われていた場合、新モデルでは複数の個別レコメンデーションとして取得されます。これはセキュリティリスクが突然増えたことを意味するとは限らず、データの粒度が細かくなった結果です。(Microsoft Learn)

そのため、移行前後の総行数だけを比較してはいけません。

レポートでは、次の指標を分けて集計すると実態を把握しやすくなります。

  • 影響を受ける一意のリソース数
  • CriticalまたはHighの個別レコメンデーション数
  • レコメンデーションカテゴリー別の件数
  • CVE別の影響リソース数
  • 修正可能な脆弱性と修正不能な脆弱性の件数
  • Azure、AWS、GCP別の件数
  • 新規発生、継続、解消済みの件数

通知やチケット作成では、同じリソースと同じCVEから大量の重複チケットが作られないよう、重複排除キーも見直します。

たとえば、次の項目を組み合わせて一意性を判定します。

assessment ID
対象リソースID
CVE IDまたは検出項目ID
カテゴリー

Governance rulesとContinuous exportを更新する

個別レコメンデーションでは、管理操作の対象も変わります。

複数の個別レコメンデーションへ分割されるタイプでは、グループ化レコメンデーションの固定IDではなく、レコメンデーションカテゴリーを対象にします。カテゴリーを指定することで、現在存在する個別レコメンデーションだけでなく、今後同じカテゴリーに追加されるレコメンデーションも対象にできます。(Microsoft Learn)

確認すべき設定は次のとおりです。

  • Governance rulesの所有者割り当て
  • 修正期限やSLA
  • Logic Appsを呼び出すワークフロー自動化
  • Continuous exportの対象条件
  • Azure Policyや標準割り当て
  • Exemption rules
  • レポートやダッシュボードのフィルター

ただし、固定の新assessment keyへ置き換わるタイプは、カテゴリーではなく新しいIDを直接指定します。移行リファレンスで対象レコメンデーションの移行先を確認してから設定してください。

残っているdisable rulesをexemptionsへ移行する

旧グループ化レコメンデーションで使用していたdisable rulesは、新しい個別レコメンデーションではサポートされません。

Microsoftはexemptionsへの自動移行を提供していないため、既存ルールを確認して手動で再作成する必要があります。(Microsoft Learn)

既存のdisable rulesをAzure Resource Graphで確認する

Microsoftが案内している次のARGクエリで、旧sub-assessment用フィルターを持つポリシー割り当てを抽出できます。

policyresources
| where type =~ "microsoft.authorization/policyassignments"
| extend filters =
    todynamic(properties).metadata.subAssessmentSettings.filters
| where filters != ""

結果が返った場合は、ポリシー名、対象スコープ、CVE、重要度、CVSS、除外理由などを一覧化してください。

disable rulesの条件をexemptionsへ置き換える

主な対応関係は次のとおりです。(Microsoft Learn)

Disable ruleで使用していた条件Exemptionでの指定方法
レコメンデーションIDSelected recommendations
カテゴリーRecommendation category
セキュリティチェックSelected recommendations
CVEVulnerabilities条件のCVE
CVSSVulnerabilities条件のCVSS
最低重要度Minimum severity
パッチ提供なしNon-patchable

exemptionsでは有効期限を設定できます。恒久的な除外にするのではなく、例外の期限と再確認日を設定することで、過去の判断がそのまま残り続けることを防げます。

REST APIでexemptionを作成する場合は、Standard Assignments APIを利用します。

PUT https://management.azure.com/subscriptions/{subscriptionId}/providers/Microsoft.Security/standardAssignments/{standardAssignmentName}?api-version=2024-08-01

実際のリクエストでは、effectにExemptを指定し、対象assessment keyやCVE、重要度、CVSSなどの条件を設定します。旧ルールをそのまま広範囲へ適用すると、本来確認すべき新しいレコメンデーションまで除外する可能性があるため、移行時にスコープと条件を再評価してください。(Microsoft Learn)

移行後に実施する検証

APIやクエリを書き換えただけでは、移行完了とはいえません。

自動化、レポート、ガバナンス、例外処理を含め、次の観点で検証します。

検証項目合格基準
旧API依存コードや設定にsubAssessmentsが残っていない
データ取得Microsoft.Security/assessmentsから結果を取得できる
ページング全ページを取得し、途中で欠落しない
スキーマnullや存在しないプロパティで処理が停止しない
対象範囲SourceとResourceTypeが想定どおり絞り込まれている
重要度properties.metadata.severityを参照している
件数個別化による増加を考慮して比較している
自動化通知やチケットが重複作成されない
レポート旧列に依存せず、新しいカテゴリーで集計できる
Governanceカテゴリーまたは新IDへ更新されている
例外設定disable rulesがexemptionsとして再作成されている
監査exemptionの理由、承認者、有効期限を確認できる

本番環境へ反映する前に、少なくとも次の3種類のデータでテストしてください。

  1. 結果が0件になる環境
  2. 少数の個別レコメンデーションがある環境
  3. 複数クラウドや大量の脆弱性を含む環境

特に0件時の処理は重要です。旧APIから結果が返らない状態を「脆弱性なし」と判定する実装が残っていると、廃止されたAPIを正常なセキュリティ状態と誤認する可能性があります。

移行時によくある失敗

旧APIの復旧を待ってしまう

今回の変更は一時的な障害ではなく廃止です。再試行回数やタイムアウトを増やしても、根本的な解決にはなりません。

旧IDを1つの新IDへ置き換える

グループ化レコメンデーションの多くは、カテゴリー配下の複数レコメンデーションへ分割されます。必ず公式の移行リファレンスで、カテゴリー移行なのか固定ID移行なのかを確認します。(Microsoft Learn)

recommendationCategoryだけで全件取得する

SoftwareUpdateなどのカテゴリーは複数のクラウドやリソースを含みます。SourceとResourceTypeを追加しないと、通知数や集計値が想定以上に増えることがあります。

移行前後の行数を直接比較する

旧モデルと新モデルではデータの粒度が異なります。総行数ではなく、一意の対象リソース数や重要度別件数で比較してください。

Azure portalに旧表示があるため移行を戻す

Azure portalとAzure Resource Graphには反映遅延があり得ます。旧表示の残存をAPI復旧の根拠にしてはいけません。(Microsoft Learn)

Disable rulesを放置する

旧ルールは新モデルに自動移行されません。ARGで残存設定を抽出し、必要なものをexemptionsとして再作成します。(Microsoft Learn)

まず実施すべき対応

Defender for Cloudのsub-assessments APIが使えなくなった環境では、次の順番で対応すると混乱を抑えられます。

  1. コードと設定からsubAssessmentsへの依存を検索する
  2. 使用中の旧レコメンデーションIDを一覧化する
  3. 移行リファレンスでカテゴリーまたは新IDへ対応付ける
  4. ARGの対象をmicrosoft.security/assessmentsへ変更する
  5. REST APIとSDKの取得処理、JSONパーサーを更新する
  6. SourceとResourceTypeで対象範囲を絞る
  7. レポートと通知を個別レコメンデーションの件数モデルへ変更する
  8. Governance rulesとContinuous exportを更新する
  9. Disable rulesをexemptionsへ移行する
  10. 0件、大量件数、複数クラウドの条件で検証する

最優先で実施すべきなのは、旧APIの再試行ではなく、依存箇所の検索とレコメンデーションIDの対応付けです。Azure portalやAzure Resource Graphに旧データが残っていても、それを移行延期の理由にせず、個別レコメンデーションを基準に自動化と運用を作り直してください。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次