
脆弱性の対応管理
はじめに
UPWARDの北明です。インフラ監視の一環で、Azureのリソースの脆弱性の対応管理をしています。今回はDefender for Cloudで検出されるコンテナーレジストリ、SQL Database、仮想マシンの脆弱性とMicrosoft Blogの協調的脆弱性開示をSlackに通知したり、Notionのデータベースに登録する機能についてご紹介します。
背景
Defender for Cloudはコンテナーレジストリ、SQL Database、仮想マシンの脆弱性を検出し、次の推奨事項を表示します。
Azure レジストリ コンテナー イメージの脆弱性は解決されている必要があります
SQL データベースでは、脆弱性の検出結果が解決されている必要がある
マシンでは、脆弱性の検出結果が解決されている必要がある
リソースのメニュー:「セキュリティ」>「Defender for Cloud」で該当の推奨事項をクリックするか、図1のようにDefender for Cloudのブック:脆弱性評価の調査結果を開くと脆弱性の詳細を確認することが出来ます。推奨事項には脆弱性の検出日や対象のリソース名、脆弱性のID、脆弱性の説明、脆弱性の影響、脆弱性の修復が一覧で紐づけられています。

Defender for Cloudで検出される脆弱性以外に、Microsoft Blogで公開される協調的脆弱性開示があります。協調的脆弱性開示は第三者が発見した脆弱性に対し、ベンダーが対応策を用意した上で一般公開するものです。
これらの脆弱性について、セキュリティ向上のため、脆弱性が検出された時に通知したり、対応日やエビデンスをデータベース管理する機能を作成することにしました。
Defender for Cloudの標準機能による対応
まず、Defender for Cloudの標準機能で対応可能かを試してみました。Defender for Cloudは選択した推奨事項に対し、「ワークフローの自動化」を設定することが出来ます。「ワークフローの自動化」で、推奨事項が検知された時にアラートを送信するので、それをロジックアプリのトリガーとしてSlackに通知します。


この方法だと推奨事項が検知されたか否かしかわからず、推奨事項に紐づく脆弱性の詳細(検出日、対象のリソース名、脆弱性のIDや説明、影響、修復)を確認することが出来ません。
Azure Resource Graphによる対応
Defender for Cloudで検出される脆弱性は、Azure Resource Graphによるクエリの結果を加工したものです。Azureポータルで対象の推奨事項を開き、「セキュリティの検索結果を返すクエリ」をクリックすると脆弱性の一覧を取得するクエリを確認することが出来ます。

取得したクエリを修正し、次の条件で脆弱性を検出するようにしました。
コンテナーレジストリ
ステータス:Unhealthy
重要度:Critical or High
重要度、CVE ID、公開日を元にリソースグループ名、リソース名、レポジトリ名、脆弱性の説明、脆弱性の影響、脆弱性の修復、イメージのダイジェストを集計する
SQL Database
ステータス:Unhealthy
重要度:Critical or High
リソースグループ名、リソース名、重要度、ID、脆弱性の説明、脆弱性の影響、脆弱性の修復を元に、データベース名、検出日を集計する
仮想マシン
ステータス:Unhealthy
重要度:Critical or High
重要度、ID、脆弱性の説明を元に、リソースグループ名、リソース名、CVE ID、検出日を集計する
例えば、コンテナーレジストリの脆弱性を検出するクエリは下記です。作成したクエリはAzure Resource Graphにクエリとして保存します。
securityresources
| where type == "microsoft.security/assessments/subassessments"
| where subscriptionId == "サブスクリプションID"
| extend assessmentKey = extract(@"(?i)providers/Microsoft.Security/assessments/([^/]*)", 1, id)
| where assessmentKey == "推奨事項のID"
| where properties.status.severity == "High" or properties.status.severity == "Critical"
| where properties.status.code == "Unhealthy"
| extend resourceGroup = tostring(resourceGroup),
resourceName = tostring(properties.resourceDetails.ResourceName),
repositoryName = tostring(properties.additionalData.artifactDetails.repositoryName),
cveId = tostring(properties.id),
digest = tostring(properties.additionalData.artifactDetails.digest),
severity = tostring(properties.status.severity),
description = tostring(properties.description),
impact = tostring(properties.impact),
remediation = tostring(properties.remediation),
publishedDate = todatetime(properties.additionalData.vulnerabilityDetails.publishedDate)
| summarize resourceGroup_set = make_set(resourceGroup), resourceName_set = make_set(resourceName), repositoryName_set = make_set(repositoryName), description_set = make_set(description), remediation_set = make_set(remediation), impact_set = make_set(impact), digest_set = make_set(digest) by severity, cveId, publishedDate
| sort by severity asc, cveId asc
毎週決まった時刻に起動し、Azure Resouce Graphのクエリで取得した結果をSlackに通知するロジックアプリを作成します。ロジックアプリのトリガーはRecurrenceを選択します。Recurrenceに起動する曜日や時刻を入力します。

ロジックアプリのアクションとしてHTTPを追加します。URIにAzure Resource GraphのAPIの接続先:https://management.azure.com/providers/Microsoft.ResourceGraph/resources、Bodyに作成したクエリを入力します。ロジックアプリでAzure Resource Graphのクエリを実行するには、マネージドIDの有効化が必要です。システム割り当て済みマネージドIDを有効化し、サブスクリプションに対するロール:閲覧者を割り当てます。

クエリの結果をSlackのメッセージに投稿する、Notionのデータベースに登録するアクションを追加します。ロジックアプリでNotionのデータベースに接続するにはインテグレーションのトークンが必要です。事前にNotionの開発者ポータルより取得しておきます。


RSSフィードを取得するアクションを追加します。RSS フィードの URLにMicrosoft Blogの協調的脆弱性開示のURLを入力します。クエリの結果と同様にして、Slackにメッセージを投稿する、Notionのデータベースに登録するアクションを追加します。

作成したロジックアプリを手動で実行し、正常に完了することを確認します。
動作確認
Defender for Cloudで検出された重要度:High以上の脆弱性とMicrosoft Blogの協調的脆弱性開示がSlackに投稿されること、Notionのデータベースに登録されることを確認しました。下記はコンテナーレジストリの脆弱性です。脆弱性のCVE IDをキーとして、対象のリソース名、レポジトリ名がデータベースに登録されます。CVE IDをクリックすると、脆弱性の説明、脆弱性の影響、脆弱性の修復を確認することが出来ます。登録されたレコードに対し、ステータスや対応要否、対応日、エビデンスを紐づけて管理します。




まとめ
Azure Resource Graphとロジックアプリを組み合わせてAzureのリソースの脆弱性をSlackに通知したり、Notionのデータベースに登録する機能を実現しました。脆弱性のIDと対象のリソース名、対応要否や対応日、対応結果を紐づけてデータベース管理することが出来ます。
さいごに
部門問わず、少しでもUPWARDにご興味いただいた方は、まずはカジュアルにお話しすることも可能ですので、ぜひコンタクトをお待ちしております。