こんにちは、高坂です。
前回の記事では、PrismaCloudのアラートデータからアラートタイプ毎のアラート件数と重要度を取得してバブルチャートを作成しましたが、今回はそれにアラート解決状況の情報を追加して可視化を試みてみました。
Prisma Cloudではコンソールから取得できるデータがいくつかあり、アラートデータもそのひとつです。
このデータには、アラートの重要度(Severity)だけでなく、そのアラートが現在どのような状態にあるかを示すステータス(例:Open, Resolved, Dismissed)も含まれています。
日々大量に発生するアラートの中から、どの種類のアラートが、どれくらいの量と重要度で発生し、どの程度きちんと対応されているのかを読み取るのは、なかなか大変な作業です。
今回は、アラートのステータス情報に着目し、「数」「重要度」に加えて「解決状況」データを分析することで、クラウド環境のセキュリティ状態を1枚の図で直感的に可視化できないか試してみました。
取得データの紹介
まず、アラートデータはPrisma Cloudコンソールの「アラート画面」の「csvファイルをダウンロード」から取得できます。
csvファイルに記載されているカラムは以下22項目です。
| No. | カラム | 説明 |
| 1 | Alert ID | アラートに割り当てられた一意の識別子 |
| 2 | Policy Name | アラートをトリガーしたポリシーの名前 |
| 3 | Policy Type | ポリシーのタイプ(CSPMを利用した際に主に利用されるタイプはiam, config, networkなど) |
| 4 | Description | アラートが何を意味するのか、なぜトリガーされたのかについての詳細な説明 |
| 5 | Policy Labels | ポリシーに関連付けられたカスタムラベルまたはタグ |
| 6 | Policy Severity | アラートの重大度レベル(Critical, High, Medium, Low, Informationalの5段階) |
| 7 | Resource Name | アラートに関係するクラウドリソースの名前 |
| 8 | Cloud Type | クラウド環境の種類(例:AWS, Azure, GCP, Alibaba Cloud) |
| 9 | Cloud Account Id | リソースが存在するクラウドアカウントのID |
| 10 | Cloud Account Name | クラウドアカウント名 |
| 11 | Region | クラウドリソースが配置されているリージョン |
| 12 | Recommendation | アラートをトリガーした問題を解決するための推奨されるアクション |
| 13 | Alert Status | アラートの現在のステータス(例:Open, Dismissed, Resolved) |
| 14 | Alert Time | アラートが生成されたタイムスタンプ |
| 15 | Event Occurred | アラートをトリガーしたイベントが実際に発生したタイムスタンプ |
| 16 | Dismissed On | アラートが無視されたタイムスタンプ |
| 17 | Dismissed By | アラートをDismissed処理したユーザー |
| 18 | Dismissal Reason | アラートをDismissedした理由 |
| 19 | Resolved On | アラートが解決済みとしてマークされたタイムスタンプ |
| 20 | Resolution Reason | アラートを解決した理由 |
| 21 | Resource ID | アラートに関係するクラウドリソースの一意の識別子 |
| 22 | Account Groups | そのクラウドアカウントが属するPrisma Cloudのアカウントグループ |
今回はこの中から「Policy Type」、「Policy Severity」、「Cloud Account Id」、「Alert Status」を使用していきます。
可視化の準備:分析シナリオと仮想データの作成
今回は実際のアラート情報ではなく、仮想的なアラートデータを作成し、どのように可視化分析ができるかご紹介します。
可視化分析をするにあたって3つシナリオのクラウドアカウントのアラート状況を想定して用意しました。以下簡単な説明です。
| Cloud Account ID | シナリオ |
| 111122223333 | 基本的な設定ミス(config)に関するアラートが圧倒的に多い。次いで、IAMロールの権限設定ミス(iam)が散見が、アラートへの対応が追いついていないような環境。 結果として、アラート総数は多く、解決率が非常に低い状況。 |
| 444455556666 | 基本的な設定ミスはほとんどなく、configやiamのアラートは非常に少ない。 しかし、外部に公開されているサービスのため、不審なアクティビティや攻撃の兆候(anomaly, network)に関するアラートが時折発生する。 これらのアラートは深刻度がhighと高いが、迅速かつ的確に対応している環境。 結果として、アラート総数は少なく、解決率が非常に高い。 |
| 777788889999 | configやnetworkの重大なアラートは少ない。 しかし、不要な権限を持つIAMロールや長期間利用されていないユーザー(iam)に関するアラートが継続的に発生している。 これらのアラートは即時的なリスクが低いため、対応の優先順位が低く、対応が中途半端になっている環境。 結果として、アラート総数、深刻度、解決率すべてが中程度。 |
各アカウントの具体的なアラート発生状況は以下の通りです。 左列の「Policy Type」と、上段の「Policy Severity」の組み合わせごとに、発生したアラートの件数を示しています。 また、各セルには総件数、カッコ内に未解決件数の形式で、対応状況の内訳も記載しています。
Cloud Account ID=111122223333
| Cloud Account ID=111122223333 | informational | low | medium | high | critical |
| iam | 0(0) | 0(0) | 105(80) | 14(12) | 0(0) |
| config | 0(0) | 212(169) | 122(96) | 0(0) | 0(0) |
| network | 10(8) | 8(6) | 5(4) | 2(2) | 0(0) |
| anomaly | 0(0) | 0(0) | 23(21) | 0(0) | 0(0) |
Cloud Account ID=444455556666
| Cloud Account ID=444455556666 | informational | low | medium | high | critical |
| iam | 0(0) | 0(0) | 6(0) | 0(0) | 0(0) |
| config | 0(0) | 0(0) | 5(0) | 0(0) | 0(0) |
| network | 0(0) | 0(0) | 0(0) | 19(1) | 0(0) |
| anomaly | 0(0) | 0(0) | 0(0) | 11(3) | 9(0) |
Cloud Account ID= 777788889999
| Cloud Account ID= 777788889999 | informational | low | medium | high | critical |
| iam | 0(0) | 57(18) | 55(17) | 0(0) | 0(0) |
| config | 0(0) | 55(24) | 0(0) | 0(0) | 0(0) |
| network | 0(0) | 0(0) | 25(15) | 0(0) | 0(0) |
| anomaly | 0(0) | 0(0) | 8(6) | 0(0) | 0(0) |
Pythonによるデータ分析と可視化の実装
今回の可視化分析には、前回同様Pythonを使用しました。
主な利用ライブラリは、データの読み込みや加工を行うpandasと、グラフ描画を担当するmatplotlibです。
処理の概要
処理の概要は以下の通りです。
- Prisma Cloudからダウンロードしたアラートファイルからアラートデータを読み込む。
- アラートの重要度(Severity)を数値に変換し、ステータスから「解決済み」か否かを判定する。
- ポリシータイプ(Policy Type)ごとに、「アラート総数」「平均重要度スコア」「解決率」を集計する。
- 集計結果をもとにバブルチャートを生成する。
生成されるバブルチャートは、以下の要素で構成されます。
- 横軸: ポリシータイプ (Policy Type)
- 縦軸: そのポリシータイプにおけるアラートの平均的な重要度スコア
- バブルの大きさ: そのポリシータイプで発生したアラートの総数
- バブルの色: そのポリシータイプにおけるアラートの解決率
このグラフによって、「どの分野で、どれくらい重要で、どれくらいの量のアラートが、どの程度対応されているのか」を一枚で表現します。
グラフ化の工夫点
今回の可視化で特にこだわったのは、「いかに直感的に状況を理解しやすくするか」という点です。そのために、以下の2つの工夫を実装に盛り込みました。
バブルの色:2色使用し、解決率を感覚的に読み取れるようにする
まず、アラートの対応状況を視覚的に伝えるため、Alert Statusが「Resolved」または「Dismissed」のものを「解決済み」と定義し、ポリシータイプごとの解決率を、(Resolved数+Resolved数)×100/アラート数として算出しました。
そして、この解決率を赤(解決率0%)から緑(解決率100%)へと変化するカラーマップ(ヒートマップ)でバブルの色に反映させています。
これにより、例えば赤色に近いバブルがあれば「対応が遅れている危険な領域」、緑色に近ければ「きちんと対応されている健全な領域」ということが、一目で判断できるようになります。
バブルの大きさ:アラート数を「対数スケール」で調整し、差を見やすく
次に、アラートの発生件数にはポリシータイプごとに大きな偏りがあるケースが考えられます。例えば、「configアラートが1000件、anomalyアラートが5件」といった極端な差がある場合、件数をそのままバブルのサイズに反映すると、小さい方のアラートは点のようにしか表示されず、グラフ上でほとんど見えなくなってしまいます。
そこで、アラート件数を対数(log)スケールで補正し、人間の感覚に近い差で表現されるようにサイズを調整しました。
この工夫により、件数が極端に少ないポリシータイプもグラフ上で無視されることなく、その存在と状況(重要度や解決率)をしっかりと把握できるようになります。
結果の表示
前述のPythonコードで処理したバブルチャートを実際に表示すると以下のようになります。
このグラフを見ることで、各クラウドアカウントにおいて、どのようなポリシータイプで、どれぐらいの重要度のアラートがどれだけ発生していて、どれだけ解決できているかを一目でだいたい把握できます。
再渇しますが、生成されるバブルチャートは、以下の要素で構成されます。
- 横軸: ポリシータイプ (Policy Type)
- 縦軸: そのポリシータイプにおけるアラートの平均的な重要度スコア
- バブルの大きさ: そのポリシータイプで発生したアラートの総数
- バブルの色: そのポリシータイプにおけるアラートの解決率
Cloud Account ID:111122223333
anomalyやnetworkのアラート件数は少ない反面、configとiamのアラート件数が多いことがわかります。また、全体的に解決率が低い状況が読み取れます。
Cloud Account ID:444455556666
configやiamのアラート少ない反面、anomalyとnetworkアラート比較的多いことがわかります。 また、特にanomalyとnetworkのアラート重要度の平均が高いが、全体的に解決率は高い状態であることが読み取れます。
Cloud Account ID:777788889999
anomalyに比べて他アラートタイプのアラートが多いことがわかります。解決率は全体的に50%付近であることが読み取れます。
まとめ
今回はPrisma Cloudのアラートデータ(今回は仮想データを使用)をPythonで処理し、ポリシータイプごとの「アラート数」「平均重要度」「解決率」を一枚にまとめたバブルチャートを作成しました。
バブルチャートの「大きさ(数)」「高さ(重要度)」「色(解決率)」という3つの視覚的要素を用いることで、どのポリシータイプにアラートが集中し、その重要度はどれくらいで、さらにどの程度対応が遅れているのかを直感的に捉えることができます。これにより、膨大なアラート情報の中から「本当に注目すべき危険な領域」を特定し、セキュリティ対応の優先順位付けを行う際のひとつの判断材料になるのではないでしょうか。
今回紹介した手法は一例であり、データの性質や分析目的によっては、さらに多様な可視化や分析手法が存在します。今後もPrisma Cloudから取得できるデータのさらなる活用方法について、試行錯誤し結果を発信していければと考えております。
また、当社では、Prisma Cloudを利用して複数クラウド環境の設定状況を自動でチェックし、設定ミスやコンプライアンス違反、異常行動などのリスクを診断するCSPMソリューションを販売しております。ご興味のある方はお気軽にお問い合わせください。リンクはこちら↓




