Microsoft Defender for Cloud による Qualys を用いた脆弱性スキャン

# はじめに
皆さん、Azure Security を活用されていらっしゃいますか？
Microsoft Defender for Cloud (以下 MDfC) には、Virtual Machine に対して Microsoft Defender for Servers (P2) を導入すると、脆弱性スキャンの機能も活用することができます。
[公式ドキュメント:Azure およびハイブリッド マシンに対する Defender for Cloudの統合された Qualys 脆弱性評価スキャナー](https://learn.microsoft.com/ja-jp/azure/defender-for-cloud/deploy-vulnerability-assessment-vm)に様々な情報が掲載されていますが、エージェント側の動作についての記載が無かったため、本記事で取り上げて紹介してみたいと思います。

# 1. Microsoft Defender for Servers による脆弱性スキャン構成
MDfC にて Microsoft Defender for Servers P2 を有効にすると、オプションで脆弱性スキャナー機能を有効にすることができます。脆弱性スキャナーは業界で有名な Qualys 社のエージェントを OEM で利用しており、エンドポイントの内部でエージェントが脆弱性をスキャンし、MDfC に通知する仕組みになります。
![va-vm-flow-diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/f0c6b2b8-baf9-8a34-f919-02ee9a7ba0fa.png)
導入に対して、以下注意事項が掲載されています。

- Azure 仮想マシンは MDfC の対象となる Log Analytics ワークスペースに居ること
- Azure 仮想マシンは Microsoft Defender for Servers P2 を有効にすること（注：課金対象）
- Azure 仮想マシンは、Outbound で Qualys サーバに対して接続が可能であること
    - [公式ドキュメント:FAQ -統合された脆弱性スキャナー (Qualys を利用)](https://docs.microsoft.com/ja-jp/azure/security-center/deploy-vulnerability-assessment-vm#faq---integrated-vulnerability-scanner-powered-by-qualys) に接続先の情報が掲載されています。
    - Qualys Extension Agent が Outbound で HTTPS 通信で Qualys サーバに接続します。
        - 最新の脆弱性検査用データなどの取得を行っています。
- Azure 仮想マシンが Qualys 脆弱性スキャンの対象 OS、バージョンであること
    - [公式ドキュメント：統合されたスキャナーを Azure とハイブリッドのマシンにデプロイする](https://docs.microsoft.com/ja-jp/azure/security-center/deploy-vulnerability-assessment-vm#deploy-the-integrated-scanner-to-your-azure-and-hybrid-machines)対象となるOS、バージョンが掲載されているので事前確認するようにしましょう。

# 2. 試してみる - Microsoft Defender for Cloud / Defender for Servers を設定する
- はじめに、MDfC より Microsoft Defender for Servers P2 を有効にします。
    - 　対象となるサブスクリプション毎に有効にします。
        - 　管理メニュー「価格と設定」からサブスクリプションを選択し、「サーバー」のプランを有効化します。
        - 　脆弱性スキャン機能は Microsoft Defender for Servers プラン2 を選択する必要があります。
        - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/95eb29c3-6a2d-960b-d948-e3532e59bbca.png)
    - 「自動プロビジョニング」設定より、「マシンの脆弱性評価」から「Microsoft Defender for Cloud 統合 Qualys スキャナー」を選択します。
        - Microsoft Defender for Servers プラン 2 のサービスとして、Microsoft Defender for Endpoint (MDE) で提供される脆弱性スキャン機能か、Qualys 脆弱性スキャナーの選択が出来るようになります。
        - 「保存」を押して設定を反映させます。 
- 脆弱性スキャナーエージェントを導入します。
    - 「推奨事項」より「マシンには脆弱性評価ソリューションが必要」選択し、**Unhealthy resource** から対象リソースを選択して Fix を選択します。
        - 最初は未導入のため、Unhealty resource を選んでFixを押すことで、Qualys Agent の導入がスタートします。
        - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/3212ddbb-31ba-20f0-0ac4-b9e38542a408.png)

>[注意] Fixボタンで Agent 導入を行った後「Healthy resources」に切り替わる時間は Azure Policy の Freshness Interval 時間である 24 時間がかかります。

この手順では手動による Qualys Agent 導入になりますが、大規模環境を想定して導入を自動化する方法が公式 Docs に掲載されています。 
- ARM テンプレートを用いて、Qualys Agent を一括導入する
- Azure Policy を用いて、Qualys Agent を一括導入する (DeployIfNotExists ポリシー)
- PowerShell スクリプト – ``Update qualys-remediate-unhealthy-vms.ps1``を用いる
- 専用の Logic Apps **[Install-VulnAssessmentAgent](https://github.com/Azure/Microsoft-Defender-for-Cloud/tree/main/Workflow%20automation/Install-VulnAssesmentAgent)** を利用する
- REST API を利用する

https://learn.microsoft.com/ja-jp/azure/defender-for-cloud/deploy-vulnerability-assessment-vm#automate-at-scale-deployments

Logic Apps のサンプルを試してみました。
GitHub のリンクから導入すると、Install-VulnAssessmentAgent が導入されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/498a13cf-f90b-207a-b77c-8d7ae0ce8bf9.png)

この Apps を Microsoft Defender for Cloud の Automation 「ワークフローの自動化」より設定を行います。
トリガーの条件としては以下を設定してみました。

|  Parameter  |  Value  |
| ---- | ---- |
| Defender for Cloud のデータ型 | 推奨事項 |
| 推奨事項の名前 | マシンには脆弱性評価ソリューションが必要 |
| 推奨事項の状態 | 異常 |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/110a1a55-18cd-55ef-f8f8-54ff5a205e3c.png)

これにより、VM に対して脆弱性評価が必要なリソースを発見すると、自動で Logic Apps が動いて、Qualys Agent を導入することが出来るようになります。
実際に VM を作成して試してみたところ、Logic Apps 側のログで "Create or Update a template deployment" まで動作し、``provisioningState`` も Succeeded になっていることが確認出来ました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/37a68668-0e9a-b00c-b43a-e8718fd96bbe.png)

対象リソースには ``LinuxAgent.AzureSecurityCenter`` が導入されていることが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/0b988d1a-9b34-467f-bd2d-6e93a1ede0d4.png)

# 3. Agent 側で Qualys によるエージェント導入、脆弱性調査が始まっているかをモニターする
公式ドキュメントでは、端末側で動作する Qualys エージェント側の状況について掲載がなく、デバッグなどの調査の際に困ってしまうように思います。Qualys 社の情報から、Windows / Linux の出力先が掲載されていましたので、以下参考として記載しておきます。

## 3.1 Windows Qualys Agent のデバッグログ
Windowsサーバの場合、Qualys Agentのログは以下に出力されます。
``C:\C:\Program Data\Qualys\QualysAgent``

![Win_QualysAgent.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/eaa10a58-103b-fa23-dccd-2e9a8fd69276.png)

実際にログファイルをチェックすると、Qualys Agent が Qualys サーバと行った通信内容や、脆弱性スキャンのステータス情報が分かるため、現在サーバでどのようなことが行われているかどうかを調査する際に有益な情報になります。

![Win_QualysAgent_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/417bbe3d-6085-c3c8-e0a5-a0548762773f.png)

## 3.2 Linux Qualys Agent のデバッグログ
Linuxサーバの場合、Qualys Agentのログは以下に出力されます。
``/var/log/qualys/``

ログは qualys-cloud-agent-scan.log などをtailするのが良さそうです。
![Linux_QualysAgent_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/5a97af6f-4a1f-a993-0638-910953491673.png)

# 4. サーバーの脆弱性情報を出力する
Microsoft Defender for Servers によって、Qualys Agent が導入され脆弱性スキャンが行われると、Microsoft Defender for Cloud に脆弱性データが報告されます。

> 公式ドキュメントに掲載されている通り、脆弱性スキャンは4時間おきに行われており、2021.8 現在インターバルの変更は出来ない仕様になっています。

脆弱性スキャンの結果は、いくつかの方法で確認することができます。

## 4.1 Microsoft Defender for Cloud 「推奨事項」-> 「仮想マシンの脆弱性を修復する必要があります」でリストする（非推奨）
こちらはドキュメントに掲載がある方法で、推奨事項からリストする方法です。
以下が画面になるのですが、Microsoft Defender for Cloud の画面から2ステップ踏むことや、可視性があまりよくない点、エクスポート出来ない等の理由から、運用で本手法を使うのは大変だと思われます。

![ASC_VulnReport_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/46e707fb-fa1b-d0ab-d3dc-751a20e7a69c.png)

## 4.2 Microsoft Defender for Cloud 「ブック」より、脆弱性テンプレートダッシュボードを用いる
Microsoft Defender for Cloud にはブック機能があり、Microsoft Defender for Cloud で得られた情報をダッシュボードで作成することができます。
- [Security Center データの豊富な対話型レポートを作成する](https://docs.microsoft.com/ja-jp/azure/security-center/custom-dashboards-azure-workbooks)

ブックのテンプレートに「脆弱性評価の調査結果」が用意されています。こちらを用いて、脆弱性スキャンのデータをダッシュボード等に表示しておくと、可視性も高く見やすいのではと思います。
![ASC_VulnReport_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/f5722b60-1875-3fd7-1f89-2f5484464c61.png)

## 4.3 Azure Resource Graph を用いてエクスポートする
脆弱性スキャンデータの抽出が目的であれば、本方法がお勧めです。
細かい設定内容は以下ブログに掲載されています。

- [Exporting Vulnerability Assessment Results in Azure Security Center](https://techcommunity.microsoft.com/t5/azure-security-center/exporting-vulnerability-assessment-results-in-azure-security/bc-p/2618261#M423)

方法は Azure Resource Graph を用いて、以下の Kusto クエリーを打つだけです。

```
securityresources
 | where type == "microsoft.security/assessments"
 | where * contains "Vulnerabilities"
 | summarize by assessmentKey=name //the ID of the assessment
 | join kind=inner (
    securityresources
     | where type == "microsoft.security/assessments/subassessments"
     | extend assessmentKey = extract(".*assessments/(.+?)/.*",1,  id)
 ) on assessmentKey
| where split(id, "/")[7] == "virtualMachines"
| project assessmentKey, vmname = split(id, "/")[8], subassessmentKey=name, id, parse_json(properties), resourceGroup, subscriptionId, tenantId
| extend description = properties.description,
         displayName = properties.displayName,
         resourceId = properties.resourceDetails.id,
         resourceSource = properties.resourceDetails.source,
         category = properties.category,
         severity = properties.status.severity,
         code = properties.status.code,
         timeGenerated = properties.timeGenerated,
         remediation = properties.remediation,
         impact = properties.impact,
         vulnId = properties.id,
         additionalData = properties.additionalData
```

結果は Azure Resource Graph エクスプローラーを用いて以下抽出することができます。
データをエクスポートすることもできますし、これは便利！ですね。

![ResourceGraphReport.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/d80c49f9-0cb7-8b35-e4f3-4da5f48a0b2a.png)

# 5. おわりに
Microsoft Defender for Cloud / Microsoft Defender for Servers ではエンドポイントの脆弱性運用も手軽にできそうです。本記事が Azure Security にご興味ある方々のためになれば幸いです。

＊本稿は、個人の見解に基づいた内容であり、所属する会社の公式見解ではありません。また、いかなる保証を与えるものでもありません。正式な情報は、各製品の販売元にご確認ください。