收集 Azure WAF 記錄
支援的國家/地區:
Google SecOps
SIEM
本文說明如何使用 Azure 儲存空間帳戶,將 Azure Web 應用程式防火牆 (WAF) 記錄匯出至 Google Security Operations。剖析器會處理 JSON 格式的記錄,並轉換為 UDM。系統會處理含有 records 陣列的記錄,方法是逐一疊代每筆記錄,並將特定欄位對應至 UDM 屬性。如果缺少 records 陣列,剖析器會將記錄檔視為單一事件,並相應地擷取及對應欄位。
事前準備
請確認您已完成下列事前準備事項:
- Google SecOps 執行個體
- 有效的 Azure 租用戶
- Azure 特殊存取權
設定 Azure 儲存體帳戶
- 在 Azure 控制台中,搜尋「Storage accounts」(儲存體帳戶)。
- 點選「建立」。
- 指定下列輸入參數的值:
- 訂閱:選取訂閱方案。
- 資源群組:選取資源群組。
- 區域:選取區域。
- 成效:選取成效 (建議使用「標準」)。
- 備援:選取備援 (建議使用 GRS 或 LRS)。
- 「儲存體帳戶名稱」:輸入新儲存體帳戶的名稱。
- 按一下「Review + create」。
- 查看帳戶總覽,然後按一下「建立」。
- 在「儲存空間帳戶總覽」頁面中,選取「安全性 + 網路」中的「存取金鑰」子選單。
- 按一下「key1」或「key2」旁邊的「顯示」。
- 按一下「複製到剪貼簿」即可複製金鑰。
- 將金鑰儲存於安全的位置,以供日後使用。
- 在「儲存空間帳戶總覽」頁面中,選取「設定」中的「端點」子選單。
- 按一下「複製到剪貼簿」,複製「Blob 服務」端點網址,例如
https://<storageaccountname>.blob.core.windows.net
。 - 請將端點網址儲存於安全位置,以供日後使用。
如何設定 Azure WAF 記錄的記錄匯出功能
- 使用具備權限的帳戶登入 Azure 入口網站。
- 前往「網頁應用程式防火牆 (WAF) 規則」,然後選取要監控的 WAF。
- 選取「監控」>「診斷設定」。
- 按一下「+ 新增診斷設定」。
- 輸入診斷設定的描述性名稱。
- 選取「allLogs」allLogs。
- 選取「封存至儲存空間帳戶」核取方塊做為目的地。
- 指定「訂閱項目」和「儲存空間帳戶」。
- 按一下 [儲存]。
設定動態饋給
在 Google SecOps 平台中,有兩種不同的進入點可設定動態饋給:
- 「SIEM 設定」>「動態消息」
- 內容中心 > 內容包
依序前往「SIEM 設定」>「動態消息」,設定動態消息
如要為這個產品系列中的不同記錄類型設定多個動態饋給,請參閱「依產品設定動態饋給」。
如要設定單一動態饋給,請按照下列步驟操作:
- 依序前往「SIEM 設定」>「動態饋給」。
- 按一下「新增動態消息」。
- 在下一個頁面中,按一下「設定單一動態饋給」。
- 在「動態饋給名稱」欄位中,輸入動態饋給的名稱,例如「Azure WAF Logs」。
- 選取「Microsoft Azure Blob Storage」做為「來源類型」。
- 選取「Azure WAF」做為「記錄類型」。
- 點選「下一步」。
指定下列輸入參數的值:
- Azure URI:Blob 端點 URL。
ENDPOINT_URL/BLOB_NAME
- 取代下列項目:
ENDPOINT_URL
:Blob 端點網址 (https://<storageaccountname>.blob.core.windows.net
)BLOB_NAME
:Blob 的名稱 (例如<logname>-logs
)
- 取代下列項目:
- URI 為:根據記錄串流設定選取 URI 類型 (「單一檔案」|「目錄」|「包含子目錄的目錄」)。
來源刪除選項:根據擷取偏好設定選取刪除選項。
共用金鑰:Azure Blob 儲存體的存取金鑰。
資產命名空間:資產命名空間。
擷取標籤:要套用至這個動態饋給事件的標籤。
- Azure URI:Blob 端點 URL。
點選「下一步」。
在「Finalize」畫面上檢查新的動態饋給設定,然後按一下「Submit」。
從內容中心設定動態饋給
為下列欄位指定值:
- Azure URI:Blob 端點 URL。
ENDPOINT_URL/BLOB_NAME
- 取代下列項目:
ENDPOINT_URL
:Blob 端點網址 (https://<storageaccountname>.blob.core.windows.net
)BLOB_NAME
:Blob 的名稱 (例如<logname>-logs
)
- 取代下列項目:
- URI 為:根據記錄串流設定選取 URI 類型 (「單一檔案」|「目錄」|「包含子目錄的目錄」)。
- 來源刪除選項:根據擷取偏好設定選取刪除選項。
- 共用金鑰:Azure Blob 儲存體的存取金鑰。
進階選項
- 動態饋給名稱:系統預先填入的值,用於識別動態饋給。
- 來源類型:將記錄收集到 Google SecOps 的方法。
- 資產命名空間:與動態饋給相關聯的命名空間。
- 擷取標籤:套用至這個動態饋給所有事件的標籤。
UDM 對應表
記錄欄位 | UDM 對應 | 邏輯 |
---|---|---|
backendPoolName |
additional.fields[?key=='backendPoolName'].value.string_value |
這個值取自原始記錄中的 backendPoolName 欄位。 |
backendSettingName |
additional.fields[?key=='backendSettingName'].value.string_value |
這個值取自原始記錄中的 backendSettingName 欄位。 |
category |
metadata.product_event_type |
這個值取自原始記錄中的 category 欄位。 |
EventEnqueuedUtcTime |
additional.fields[?key=='EventEnqueuedUtcTime'].value.string_value |
如果 records 欄位存在,系統會從原始記錄中的 EventEnqueuedUtcTime 欄位取得值。 |
EventProcessedUtcTime |
additional.fields[?key=='EventProcessedUtcTime'].value.string_value |
如果 records 欄位存在,系統會從原始記錄中的 EventProcessedUtcTime 欄位取得值。 |
operationName |
additional.fields[?key=='operationName'].value.string_value |
這個值取自原始記錄中的 operationName 欄位。 |
properties.action |
additional.fields[?key=='action'].value.string_value |
如果 records 欄位存在,系統會從原始記錄中的 properties.action 欄位取得值。 |
properties.action |
security_result.action_details |
如果沒有 records 欄位,系統會從原始記錄的 properties.action 欄位擷取值。 |
properties.clientIP 、properties.clientIp |
principal.asset.ip 、principal.ip |
這個值取自原始記錄中的 properties.clientIP 或 properties.clientIp 欄位,並以 clientIP 為優先。 |
properties.clientPort |
principal.port |
這個值取自原始記錄中的 properties.clientPort 欄位。 |
properties.clientResponseTime |
principal.resource.attribute.labels[?key=='Client Response Time'].value |
如果沒有 records 欄位,系統會從原始記錄的 properties.clientResponseTime 欄位擷取值。 |
properties.details.data |
additional.fields[?key=='Properties data'].value.string_value |
如果 records 欄位存在,系統會從原始記錄中的 properties.details.data 欄位取得值。 |
properties.details.file |
principal.process.file.full_path |
如果沒有 records 欄位,系統會從原始記錄的 properties.details.file 欄位擷取值。 |
properties.details.matches[].matchVariableName 、properties.details.matches[].matchVariableValue |
additional.fields[?key.startsWith('%{idx} ')].value.string_value |
這個值取自原始記錄中的 properties.details.matches 陣列。UDM 中的 key 是使用索引 (idx ) 和 matchVariableName 建構而成。value 取自matchVariableValue 。 |
properties.details.message |
metadata.description |
這個值取自原始記錄中的 properties.details.message 欄位,並移除反斜線和引號。 |
properties.details.msg |
metadata.description |
如果 records 欄位存在,系統會從原始記錄中的 properties.details.msg 欄位取得值。 |
properties.httpMethod |
network.http.method |
這個值取自原始記錄中的 properties.httpMethod 欄位。 |
properties.httpStatus |
network.http.response_code |
這個值取自原始記錄中的 properties.httpStatus 欄位。 |
properties.httpVersion |
network.application_protocol |
如果 properties.httpVersion 欄位包含 HTTP ,則會指派 HTTP 值。 |
properties.host 、properties.hostname 、properties.originalHost |
principal.asset.hostname 、principal.hostname |
這個值取自 properties.originalHost 、properties.host 或 properties.hostname ,優先順序依序為 properties.originalHost 、properties.host 和 properties.hostname 。 |
properties.policyId |
security_result.detection_fields[?key=='policyId'].value |
這個值取自原始記錄中的 properties.policyId 欄位。 |
properties.policyMode |
security_result.detection_fields[?key=='policyMode'].value |
如果 records 欄位存在,系統會從原始記錄中的 properties.policyMode 欄位取得值。 |
properties.policy |
additional.fields[?key=='Properties policy'].value.string_value |
如果 records 欄位存在,系統會從原始記錄中的 properties.policy 欄位取得值。 |
properties.receivedBytes |
network.received_bytes |
這個值取自原始記錄中的 properties.receivedBytes 欄位。 |
properties.requestUri |
target.url |
這個值取自原始記錄中的 properties.requestUri 欄位。 |
properties.ruleId |
security_result.rule_id |
這個值取自原始記錄中的 properties.ruleId 欄位。 |
properties.ruleName |
security_result.rule_name |
如果 records 欄位存在,系統會從原始記錄中的 properties.ruleName 欄位取得值。 |
properties.ruleName 、ruleSetType |
security_result.rule_name |
如果 records 欄位不存在,系統會從 properties.ruleName 欄位擷取值,如果該欄位為空白,則從原始記錄中的 ruleSetType 欄位擷取值。 |
properties.ruleSetVersion |
security_result.detection_fields[?key=='ruleSetVersion'].value |
這個值取自原始記錄中的 properties.ruleSetVersion 欄位。 |
properties.sentBytes |
network.sent_bytes |
這個值取自原始記錄中的 properties.sentBytes 欄位。 |
properties.serverResponseLatency |
additional.fields[?key=='Server Response Latency'].value.string_value |
如果沒有 records 欄位,系統會從原始記錄的 properties.serverResponseLatency 欄位擷取值。 |
properties.serverRouted |
target.asset.ip 、target.ip 、target.port |
系統會從 properties.serverRouted 欄位擷取 IP 和通訊埠。 |
properties.sslCipher |
network.tls.cipher |
這個值取自原始記錄中的 properties.sslCipher 欄位。 |
properties.sslClientCertificateIssuerName |
network.tls.server.certificate.issuer |
這個值取自原始記錄中的 properties.sslClientCertificateIssuerName 欄位。 |
properties.sslProtocol |
network.tls.version |
這個值取自原始記錄中的 properties.sslProtocol 欄位。 |
properties.timeTaken |
additional.fields[?key=='Properties Timetaken'].value.string_value |
如果沒有 records 欄位,系統會從原始記錄的 properties.timeTaken 欄位擷取值。 |
properties.trackingReference |
additional.fields[?key=='trackingReference'].value.string_value |
如果 records 欄位存在,系統會從原始記錄中的 properties.trackingReference 欄位取得值。 |
properties.transactionId |
network.session_id |
這個值取自原始記錄中的 properties.transactionId 欄位。 |
properties.userAgent |
network.http.user_agent |
這個值取自原始記錄中的 properties.userAgent 欄位。 |
properties.WAFEvaluationTime |
additional.fields[?key=='Properties WAFEvaluationTime'].value.string_value |
如果沒有 records 欄位,系統會從原始記錄的 properties.WAFEvaluationTime 欄位擷取值。 |
properties.WAFMode |
additional.fields[?key=='Properties WAFMode'].value.string_value |
如果沒有 records 欄位,系統會從原始記錄的 properties.WAFMode 欄位擷取值。 |
rec.category |
metadata.product_event_type |
如果 records 欄位存在,系統會從原始記錄中的 rec.category 欄位取得值。 |
rec.operationName |
additional.fields[?key=='operationName'].value.string_value |
如果 records 欄位存在,系統會從原始記錄中的 rec.operationName 欄位取得值。 |
rec.properties.clientIP 、rec.properties.clientIp |
principal.asset.ip 、principal.ip |
值取自原始記錄中的 rec.properties.clientIP 或 rec.properties.clientIp 欄位,如果 records 欄位存在,則優先採用 clientIP 。 |
rec.properties.clientPort |
principal.port |
如果 records 欄位存在,系統會從原始記錄中的 rec.properties.clientPort 欄位取得值。 |
rec.properties.host |
principal.asset.hostname 、principal.hostname |
如果 records 欄位存在,系統會從原始記錄中的 rec.properties.host 欄位取得值。 |
rec.properties.policy |
additional.fields[?key=='Properties policy'].value.string_value |
如果 records 欄位存在,系統會從原始記錄中的 rec.properties.policy 欄位取得值。 |
rec.properties.requestUri |
target.url |
如果 records 欄位存在,系統會從原始記錄中的 rec.properties.requestUri 欄位取得值。 |
rec.properties.ruleName |
security_result.rule_name |
如果 records 欄位存在,系統會從原始記錄中的 rec.properties.ruleName 欄位取得值。 |
rec.properties.trackingReference |
additional.fields[?key=='trackingReference'].value.string_value |
如果 records 欄位存在,系統會從原始記錄中的 rec.properties.trackingReference 欄位取得值。 |
rec.resourceId |
target.resource.id |
如果 records 欄位存在,系統會從原始記錄中的 rec.resourceId 欄位取得值。 |
rec.time |
metadata.event_timestamp |
如果 records 欄位存在,系統會從原始記錄中的 rec.time 欄位取得值。 |
resourceId |
target.resource.id |
如果沒有 records 欄位,系統會從原始記錄的 resourceId 欄位擷取值。 |
timeStamp |
metadata.event_timestamp |
如果沒有 records 欄位,系統會從原始記錄的 timeStamp 欄位擷取值。 |
不適用 | metadata.event_type |
如果主體 (主機名稱或用戶端 IP) 和目的地 IP 都存在,則值會設為 NETWORK_CONNECTION 。如果主體存在但缺少目的地 IP,則會設為 STATUS_UPDATE 。否則,預設值為 GENERIC_EVENT 或 event_type 欄位的值。 |
不適用 | metadata.log_type |
值會硬式編碼為 AZURE_WAF 。 |
不適用 | metadata.product_name |
值會硬式編碼為 Azure WAF Logs 。 |
不適用 | metadata.vendor_name |
值會硬式編碼為 Microsoft 。 |
不適用 | security_result.action |
如果 properties.action 為 Matched ,值會設為 ALLOW ;如果 properties.action 為 Block ,值會設為 BLOCK 。 |
還有其他問題嗎?向社群成員和 Google SecOps 專業人員尋求答案。