Defender for Servers のリソース レベルの有効化を試す
はじめに
Microsoft Defender for Cloud の マシン向けの CWPP である Defender for Servers をリソースごとで有効化する機能が GA しました。
こちらを利用すると、今までの以下のような課題が解決できる見込みです。
- サブスクリプションで有効化した場合に Microsoft Defender for Endpoint (MDE) がサブスクリプション配下のすべての Azure VM にオンボードされ、稼働中の重要サーバへ影響が発生する可能性がある (ので有効化できない)
- MDE が導入不可の仮想アプライアンス製品など、MDE が使用できないにも関わらず、Defender for Servers の課金が発生する
注意事項
下記のリンクに注意事項がまとまっていますが、特に注意しなければいけない点は以下です。
- Defender for Servers Plan 1 の場合はサブスクリプションで有効化している際のリソース個別の無効化とサブスクリプションで無効化している場合の個別の有効化の両方が可能
- Defender for Servers Plan 2 の場合はサブスクリプションで有効化している際のリソース個別の無効化のみ可能 (リソース個別の有効化は不可)
- リソース個別で無効化する場合、すでに MDE オンボーディング済みであれば、個別にオフボーディングが必要
- 新規 VM をリソース個別で無効化したい場合は、MDE オンボーディング用の拡張機能がデプロイされるまでに無効化する必要がある
https://learn.microsoft.com/en-us/azure/defender-for-cloud/tutorial-enable-servers-plan#enable-the-plan-at-the-resource-level
設定方法
2023/12 時点では Azure ポータルや CLI から設定する方法は提供されておらず、API 経由のみになっています。
提供されている PowerShell スクリプトを試す
まずは提供されているスクリプトで Plan 1 の有効化を試してみます。こちらはリソース グループ単位もしくは特定のタグで VM をリストアップし、API 経由でリソース個別の有効化・無効化を行う仕組みです。
なお、リソース グループとタグはあくまで VM のリストアップに使用しているだけで、Azure Policy とは異なり新規 VM には適用されないため、新規 VM を個別対応したい場合は改めてスクリプトの実行が必要です。その際、すでに設定済みの VM については同じパラメータで再設定してもエラーにはなりませんので、同じリソース グループ、タグを指定可能です。
実行すると以下の順で設定値などを入力します。
- サブスクリプション ID
- RG もしくは TAG (リソース グループ単位もしくは特定タグのどちらを使うか)
- (RG の場合) リソース グループ名
- (TAG の場合) タグの名前
- (TAG の場合) タグの値
- Free もしくは Standard (無効化もしくは Plan 1 有効化)
設定後、サブスクリプションレベルでは無効になっていますが、インベントリで確認すると個別で有効化されていることが分かります。
VM の拡張機能でも MDE.Windows がインストールされています。
カスタムで API を実行してみる
今度はカスタムで API を実行してみます。API の詳細は以下にあります。
こちらでは Plan 2 無効化を試します。以下の PowerShell コマンドを使用して API を実行します。
# Azure PowerShell にログイン
Connect-AzAccount
# パラメータを指定
$vmResourceId = "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/MyRg/providers/Microsoft.Compute/virtualMachines/MyVm"
$PricingTier = "Free"
# $subPlan = "P1"
# API 実行するパスを指定
$path = "$vmResourceId/providers/Microsoft.Security/pricings/virtualMachines" + "?api-version=2024-01-01"
# 現状の設定を確認
$status = Invoke-AzRestMethod -Path $path -Method GET
$content = $status.Content | ConvertFrom-Json
$content.properties
# 変更内容を指定
if ($PricingTier -eq "Free") {
$pricingBody = @"
{
"properties": {
"pricingTier": "$PricingTier"
}
}
"@
} else {
$pricingBody = @"
{
"properties": {
"pricingTier": "$PricingTier",
"subPlan": "$subplan"
}
}
"@
}
# API を実行して設定を変更
Invoke-AzRestMethod -Path $path -Method PUT -payload $pricingBody
実行すると以下のようになります。インベントリでも無効化されていることが確認できます。
Resource Graph でも以下のように確認が可能です。(ちなみに where name のフィルタを外すと、サーバ以外の Defender プランも出てきます)
ちなみに Plan 2 を指定して有効化しようとすると以下のようにエラーになります。(誤って無効化した場合はどう戻せばよいのか。。。)
まとめ
今回、新たに GA されたリソース単位の Defender for Servers の有効化を試してみました。まだ API のみであるものの、サブスクリプションレベルで有効化するよりも段階リリースや除外設定など、オンボーディングの調整がしやすくなるはずです。
Discussion