Share via


Azure Firewall に Microsoft Sentinel を使用してマルウェアを検出する

マルウェアは、コンピューター システム、ネットワーク、またはデバイスのセキュリティと機能に損傷、中断、または侵害を起こさせるように設計されたソフトウェアです。 ウイルス、ワーム、トロイの木馬、ランサムウェア、スパイウェア、アドウェア、ルートキットなど、さまざまな種類の脅威が含まれます。 マルウェアは、機密データの盗難、ファイルの暗号化や削除、迷惑な広告の表示、パフォーマンスの低下、デバイスの制御の取得など、さまざまな悪影響を及ぼす可能性があります。

システムまたはネットワークからマルウェアを見つけ出して除去することが重要です。これは、署名ベース、行動ベース、ヒューリスティック ベース、機械学習ベースの手法など、さまざまな検出手法を使って実行できます。 マルウェアの検出は、ユーザーのセキュリティとプライバシーと共に、システムとネットワークの整合性と可用性を保護するために不可欠です。

Azure Firewall IDPS 機能は、マルウェアを自動的に検出して既定で拒否し、クラウド ワークロードが感染するのを防ぐことができます。 事前構築済みの検出クエリと Microsoft Sentinel を使用する自動検出と応答を導入することで、この機能をさらに強化できます。 この記事では、Azure Firewall 用に既に定義されている KQL 検出クエリを使って、Azure Firewall ログで見つかる CoinminerCl0pSunburst などの一般的なマルウェアを検出する方法を見ていきます。

セキュリティ チームは、これらの検出機能を使って、内部ネットワーク上のマシンが、検出ルール クエリで定義されている既知の侵害インジケーター (IOC) にリンクされているインターネット上のドメイン名または IP アドレスへの接続を要求したときに、Sentinel アラートを受け取ることができます。 真陽性の検出は、侵害インジケーター (IOC) と見なす必要があります。 その後、セキュリティ インシデント対応チームは、これらの検出シグナルに基づいて、対応を開始し、適切なカスタム修復アクションを実装できます。

以下のクエリを使って分析ルールをデプロイする手順については、「Microsoft Sentinel と Azure Web Application Firewall を使用して新しい脅威を検出する」をご覧ください。

一般的なマルウェアの悪用

今日のネットワークでは、次のようなマルウェアの悪用がよく発生します。

Coinminer

最近の暗号通貨マイニングの急増により、高性能のネットワーク処理ユニットの必要性が高まっています。 分散型コンピューティングは拡大し、適法と違法両方のコンテキストで、マイニング ソフトウェアを広範に利用できます。

Coinminer は、被害者が気づかないうちにそのコンピューターのハードウェア リソースを使って暗号通貨マイニングを行うマルウェアの種類を表します。 疑いを持たないユーザーの PC のグラフィック処理装置 (GPU) を使って、暗号通貨のマイニングとトランザクション ブロック ハッシュの計算を目的としたさまざまなスクリプトが実行されます。

これらの脅威のリスクを軽減するには、一般的なエントリ ポイントでプロアクティブな対策を実装する必要があります。 これには、適切な認証を備えた Jupyter ソフトウェアの確実なデプロイ、脆弱性を最小限に抑えるための Web アプリケーションの構成と更新、Docker への外部アクセスの制御、追加対策としてのゼロ トラスト原則の遵守が含まれます。

次の検出クエリを使うと、Azure Firewall ログを使ってこのマルウェアを自動的に検出して対応する分析ルールを Sentinel で作成できます。

// Coinminer Detection Rule
// Detects suspicious traffic patterns associated with coinmining activity in Azure Firewall logs for Sentinel

let coinminerPorts = dynamic(["2375", "2376", "2377", "4243", "4244"]); // List of known coinminer ports  
//Assign the known domains to a variable
let coinminerdomains = dynamic(["teamtnt.red", "kaiserfranz.cc", "45.9.148.123"]); // List of known coinminer domains  

(union isfuzzy=true 

(AzureDiagnostics  
| where ResourceType == "AZUREFIREWALLS"  
| where Category == "AzureFirewallApplicationRule" 
| parse msg_s with Protocol 'request from ' SourceHost ':' SourcePort 'to ' DestinationHost ':' DestinationPort '. Action:' Action 
| extend action_s = column_ifexists("action_s", ""), transactionId_g = column_ifexists("transactionId_g", "")  
| where DestinationPort in (coinminerPorts) // Filter traffic on known coinminer ports  
| summarize CoinminerAttempts = count() by DestinationHost, DestinationPort  
| where CoinminerAttempts > 10 // Adjust threshold as needed  
), 

(AZFWIdpsSignature 
| where DestinationPort in (coinminerPorts) 
| summarize CoinminerAttempts = count() by DestinationIp, DestinationPort 
| where CoinminerAttempts > 10 // Adjust threshold as needed   

), 

(AzureDiagnostics  
| where ResourceType == "AZUREFIREWALLS"  
| where Category == "AzureFirewallDnsProxy"  
| parse msg_s with "DNS Request: " ClientIP ":" ClientPort " - " QueryID " " Request_Type " " Request_Class " " Request_Name ". " Request_Protocol " " Request_Size " " EDNSO_DO " " EDNS0_Buffersize " " Response_Code " " Response_Flags " " Response_Size " " Response_Duration  
| where Request_Name has_any(coinminerdomains)  
| extend DNSName = Request_Name  
| extend IPCustomEntity = ClientIP  

),  

(AzureDiagnostics  
| where ResourceType == "AZUREFIREWALLS"  
| where Category == "AzureFirewallApplicationRule"  
| parse msg_s with Protocol ' request from ' SourceHost ':' SourcePort 'to' DestinationHost ':' DestinationPort '. Action:' Action  
| where isnotempty(DestinationHost)  
| where DestinationHost has_any(coinminerdomains)  
| extend DNSName = DestinationHost  
| extend IPCustomEntity = SourceHost), 

(AZFWApplicationRule 
| where isnotempty(Fqdn) 
| where Fqdn has_any (coinminerdomains)   
| extend DNSName = Fqdn  
| extend IPCustomEntity = SourceIp), 

(AZFWDnsQuery 
| where isnotempty(QueryName) 
| where QueryName has_any (coinminerdomains) 
| extend DNSName = QueryName 
| extend IPCustomEntity = SourceIp 

), 

(AZFWIdpsSignature 
| where DestinationIp has_any (coinminerdomains) 
| extend DNSName = DestinationIp 
| extend IPCustomEntity = SourceIp 

), 

(AZFWIdpsSignature 
| where Description contains "coinminer" 
| extend DNSName = DestinationIp 
| extend IPCustomEntity = SourceIp 
) 

)

Cl0p

Cl0p は、被害者のファイルに独自の暗号化キーを適用してから、ファイルの暗号化を解除するために身代金を要求するランサムウェアです。 これは、データ転送ソフトウェア MOVEit の脆弱性を使用し、cl0p の配布を目的として多数の従業員にスピア フィッシング メールを送信します. その後、truebotdewmode などのツールを使ってネットワーク内を横方向に移動し、データを流出させます。 ランサムウェアは、AES-256 暗号化アルゴリズムを使ってファイルを暗号化します。

Cl0p の脆弱性には、CVE-2023-35036、CVE-2023-34362、CVE-2023-35708 が含まれます。 2023 年 6 月に、FBI と CISA はこの悪用に関するプレスリリースを発表しました。 cl0p ランサムウェアの影響は、米国中西部の複数の大学と政府機関に記録されています。 航空会社、テレビ ネットワーク、英国を拠点とする小売店が、cl0p ランサムウェア集団の最新の被害者です。

次の検出クエリを使うと、Azure Firewall ログを使ってこのマルウェアを自動的に検出して対応する分析ルールを Sentinel で作成できます。

Cl0p 用の検出クエリ: Firewall Malware Detections for Sentinel/Detection - Analytic rule query for Cl0p.json

Sunburst

このマルウェアは、ドメイン生成アルゴリズム (DGA) 文字列を使って検出を回避し、コマンド アンド コントロール バックドア攻撃を確立することで、被害者を標的にします。 多くの場合、構文で使われているパターンと、ドメイン情報の絶え間ない変更のため、マルウェアによって使われているドメインをセキュリティ ツールで DGA 文字列から特定するのは困難です。

次の検出クエリを使うと、Azure Firewall ログを使ってこのマルウェアを自動的に検出して対応する分析ルールを Sentinel で作成できます。

Sunburst マルウェア用の検出クエリ: Firewall Malware Detections for Sentinel/Detection - Analytic rule query for Sunburst.json