1. はじめに
Microsoft Ignite 2022 にて、エージェント不要で Azure VM に対して脆弱性情報を収集する機能が追加されました!
これまで仮想マシンの脆弱性情報を収集したい場合、Defender for Servers P2 機能による脆弱性スキャンエージェント(Microsoft Defender for Endpoint に付属する 脆弱性管理 (TVM)、もしくは Qualys)を導入する、もしくは 3rd Party 製品を導入するなど、何らかの専用ツールが必要でした。
この Agentless Scanning (エージェントレス スキャン) 機能は、その名前の通りエージェント不要で Azure のバックボーンで Disk Snapshot を用いて 1 日毎に脆弱性情報を収集してくれます。プレビュー中は無料で使えるため、ちょっと試してみたいユーザーに朗報ではないでしょうか?
しかもマルチクラウドに対応しており、Azure VM / AWS EC2 で用いることが出来ます!
2. エージェントレススキャンはどうやって動くのか?
このエージェントレススキャン機能は VM のスナップショット機能を活用して提供される機能になっています。
機能を有効にすると、ディスクスナップショットは Microsoft Defender for Cloud 側で自動的に作成されて管理されるため、第三者にイメージが漏洩したり、ユーザー側で何か管理を行う必要はありません。
VM のエージェントレス スキャンではクラウド API を使用してデータを収集します。 Defender for Cloud では、VM ディスクのスナップショットを撮影し、スナップショットに保存された OS 構成およびファイル システムの帯域外の詳細分析を行います。 コピーされたスナップショットは、VM の元のコンピューティング リージョンから離れず、VM はスキャンの影響を受けません。
Agentless Scanning では、ディスクスナップショットに対して MDE と同じ TVM エンジンを用いて脆弱性を検出します。
詳細は以下ドキュメントをご参照下さい。
3. やってみる
設定手順については、詳細は以下リンクをご参照下さい。
本記事では Preview 機能で試した画面例を参考までに共有したいと思います。
3.1 Agentless Scanning の有効化
はじめに Microsoft Defender for Cloud の環境設定より、Defender CSPM プランを有効化します。
本プランは Microsoft Ignite 2022 より発表された新しい Microsoft Defender for Cloud のメニューになります。
2022.11 現在、プレビュー中のため、無料で使えるようになっています。
想定されるケースとして、VM に対する負荷を考慮して新たな管理エージェントを追加インストールしたくない用途がありますが、この場合は上記画面のように Defender for Servers を無効化し、Defender for CSPM だけを有効にすることで、脆弱性の検出が出来るようになります。
「構成の編集」から詳細画面をクリックすると、Agentless scanning for machines (preview) のパラメータ設定画面が出てきます。2022.11 現在、タグを用いて脆弱性収集を対象外にする例外設定が出来るようになっています。
設定はこれだけです。
あとは 24 時間おきにシステム側で仮想マシンに対してディスクスナップショットを保管し、脆弱性検出が行われるようになります。
3.2 脆弱性情報の検出、確認を行う
脆弱性情報が検出されると、以下の画面から脆弱性を確認することが出来るようになります。
3.2.1 「推奨事項」から確認する
Microsoft Defender for Cloud の「推奨事項」より、「脆弱性情報を修復する」タブから確認を行うことが出来ます。
- マシンには脆弱性評価ソリューションが必要
- VM に対して、脆弱性エージェントの導入可否をチェックする推奨事項。
- Agentless Scanning の場合は、VM にエージェントを適用しなくても
Healthy
ステータスになります。
- マシンには脆弱性情報の検出結果が解決されている必要がある
- こちらを選択すると、個々の脆弱性情報を確認することが出来ます。
筆者の環境では、ログ/メトリクス監視のため Azure Monitor Agent とそれに付随する Azure Security Agent のみを適用しています。
これに対して、1 日経過したところ、Agentless Scanning を用いて脆弱性が検出されていることが分かりました。
3.2.2 ブック「脆弱性評価の調査結果」を用いる
VM リソースを俯瞰してみたい場合、MDfC で提供されている可視化ブックがお勧めです。
「脆弱性評価の調査結果」を用いると、各リソースグループ毎の脆弱性検出状況を確認することが出来ます。
Github で提供されているブックでも、Agentless Scanning の脆弱性情報を可視化出来ました。
以下は Defender for Servers 用に作成された「CVE Dashboard」ブックですが、Agentless Scanning でも無事表示されました。
3.3.3 Azure Resource Graph を用いて詳細をエクスポートする
詳しく脆弱性結果を出力したい & PowerBI でレポートをカスタマイズしたい!といった要望に対しては、Azure Resource Graph から直接脆弱性結果を出力することが出来ます。
サンプルのブックから Kusto Query のサンプルを抽出すれば、どのようなクエリーが使えそうか分かります。
参考までに上記クエリーの参考例を転記しておきます。
securityresources
| where type == "microsoft.security/assessments/subassessments"
| extend assessmentKey = extract(".*assessments/(.+?)/.*",1, id)
| where assessmentKey == "1195afff-c881-495e-9bc5-1486211ae03f"
| project Resource = tolower(extract("([\\s\\S]*?)(/providers/Microsoft.Security.*)",1,id)), ResourceGroup = trim_end("/",extract(".*resourceGroups/(.+?)/",0,id)), ResourceType = tolower(split(id,"/").[6]), subscriptionId, status = tostring(parse_json(properties).status.code), VulnId = tostring(parse_json(properties).id), description = tostring(parse_json(properties).displayName), cve = parse_json(properties.additionalData).cve, SoftwareVendor = tostring(properties.additionalData.softwareVendor), SoftwareName = tostring(properties.additionalData.softwareName), SoftwareVersion = tostring(properties.additionalData.softwareVersion), Source = tostring(properties.additionalData.source), severityFilter = tostring("'High','Medium','Low'")
| where status == 'Unhealthy'
| where Source == "Microsoft Defender vulnerability management"
| mvexpand todynamic(cve)
| extend severity = tostring(cve['severity']),
publishedDate = todatetime(cve['publishedDate']),
lastModifiedDate = todatetime(cve['lastModifiedDate'])
| where severityFilter has severity
| summarize affectedMachines = dcount(Resource) by CVEID = tostring(cve['title']), cvssScore = todouble(cve['cvssScore']), severity, description = tostring(cve['description']), format_datetime(publishedDate, 'yyyy-MM-dd, hh:mm'), format_datetime(lastModifiedDate, 'yyyy-MM-dd, hh:mm'), hasPublicExploit = tostring(cve['hasPublicExploit']), isExploitVerified = tostring(cve['isExploitVerified']), exploitabilityLevel = tostring(cve['exploitabilityLevel'])
| order by cvssScore, affectedMachines
4. Q&A
2022.11 現在、以下の使用制限がありましたのでご注意ください。
- PMK / Azure Storage 暗号化によって暗号化されたディスクイメージのみ対応。CMK + Azure KeyVault によるディスク暗号化によって構成された VM は対象外
詳細は以下リンクをご参照下さい。
5. まとめ
エージェント導入不要な脆弱性検出が手軽に出来るようになりましたので、クラウド基盤のセキュリティ監視の閾値が下がることを期待する方々も多いのではと思います。本記事が Azure Security にご興味ある方々のためになれば幸いです。
*本稿は、個人の見解に基づいた内容であり、所属する会社の公式見解ではありません。また、いかなる保証を与えるものでもありません。正式な情報は、各製品の販売元にご確認ください。