收集 Workday 稽核記錄
本文說明如何使用 Google Cloud Storage,將 Workday 稽核記錄檔擷取至 Google Security Operations。剖析器會先根據 JSON 資料的模式分析,從記錄中找出特定事件類型。然後,根據識別出的類型擷取並建構相關欄位,將這些欄位對應至統一資料模型 (UDM),以進行一致的安全分析。
事前準備
請確認您已完成下列事前準備事項:
- Google SecOps 執行個體
- 已啟用 Cloud Storage API 的 GCP 專案
- 建立及管理 GCS 值區的權限
- 管理 Google Cloud Storage 值區 IAM 政策的權限
- 建立 Cloud Run 函式、Pub/Sub 主題和 Cloud Scheduler 工作的權限
- Workday 特殊存取權
建立 Google Cloud Storage 值區
- 前往 Google Cloud 控制台。
- 選取專案或建立新專案。
- 在導覽選單中,依序前往「Cloud Storage」>「Bucket」。
- 按一下「建立值區」。
請提供下列設定詳細資料:
設定 值 為 bucket 命名 輸入全域不重複的名稱 (例如 workday-audit-logs)位置類型 根據需求選擇 (區域、雙區域、多區域) 位置 選取位置 (例如 us-central1)儲存空間級別 標準 (建議用於經常存取的記錄) 存取控管 統一 (建議) 保護工具 選用:啟用物件版本管理或保留政策 點選「建立」。
建立 Workday 整合系統使用者 (ISU)
- 在 Workday 中,搜尋「Create Integration System User」(建立整合系統使用者)> 按一下「OK」(確定)。
- 填入「User Name」(使用者名稱) (例如
audit_gcs_user)。 - 按一下「確定」。
- 依序前往「相關動作」>「安全性」>「重設密碼」,即可重設密碼。
- 選取「維持密碼規則」,避免密碼過期。
- 搜尋「Create Security Group」(建立安全群組) >「Integration System Security Group (Unconstrained)」(整合系統安全群組 (無限制))。
- 提供名稱 (例如
ISU_Audit_GCS),並將 ISU 新增至「整合系統使用者」。 - 搜尋「Domain Security Policies for Functional Area > System」(功能領域的網域安全政策 > 系統)。
- 在「稽核記錄」部分,依序選取「動作」>「編輯權限」。
- 在「僅限取得」下方,新增
ISU_Audit_GCS群組。 - 依序點選「確定」>「啟用待處理的安全政策變更」。
設定 Workday 自訂報表
- 在 Workday 中搜尋「Create Custom Report」。
- 請提供下列設定詳細資料:
- 名稱:輸入不重複的名稱 (例如
Audit_Trail_BP_JSON)。 - 類型:選取「進階」。
- 資料來源:選取「稽核追蹤記錄 - 業務流程」。
- 名稱:輸入不重複的名稱 (例如
- 按一下「確定」。
- 選用:新增「業務流程類型」或「生效日期」篩選器。
- 前往「輸出」分頁。
- 選取「Enable as Web Service」(啟用為 Web 服務)、「Optimized for Performance」(針對效能進行最佳化),然後選取「JSON Format」(JSON 格式)。
- 依序按一下「確定」>「完成」。
- 開啟報表,然後依序點選「共用」> 新增 ISU_Audit_GCS 並授予「檢視」權限 >「確定」。
- 依序前往「相關動作」>「Web 服務」>「查看網址」。
複製 JSON 網址。
為 Cloud Run 函式建立服務帳戶
Cloud Run 函式需要具備 GCS bucket 寫入權限的服務帳戶,並由 Pub/Sub 叫用。
建立服務帳戶
- 在 GCP 主控台中,依序前往「IAM & Admin」(IAM 與管理) >「Service Accounts」(服務帳戶)。
- 按一下 [Create Service Account] (建立服務帳戶)。
- 請提供下列設定詳細資料:
- 服務帳戶名稱:輸入
workday-audit-collector-sa。 - 服務帳戶說明:輸入
Service account for Cloud Run function to collect Workday audit logs。
- 服務帳戶名稱:輸入
- 按一下「建立並繼續」。
- 在「將專案存取權授予這個服務帳戶」部分,新增下列角色:
- 按一下「選擇角色」。
- 搜尋並選取「Storage 物件管理員」。
- 點選「+ 新增其他角色」。
- 搜尋並選取「Cloud Run Invoker」。
- 點選「+ 新增其他角色」。
- 搜尋並選取「Cloud Functions Invoker」(Cloud Functions 叫用者)。
- 按一下「繼續」。
- 按一下 [完成]。
這些角色適用於:
- Storage 物件管理員:將記錄檔寫入 GCS bucket
- Cloud Run 叫用者:允許 Pub/Sub 叫用函式
- Cloud Functions 叫用者:允許函式叫用
授予 GCS 值區的 IAM 權限
授予服務帳戶 GCS bucket 的寫入權限:
- 依序前往「Cloud Storage」>「Buckets」。
- 按一下 bucket 名稱。
- 前往「權限」分頁標籤。
- 按一下「授予存取權」。
- 請提供下列設定詳細資料:
- 新增主體:輸入服務帳戶電子郵件地址 (例如
workday-audit-collector-sa@PROJECT_ID.iam.gserviceaccount.com)。 - 指派角色:選取「Storage 物件管理員」。
- 新增主體:輸入服務帳戶電子郵件地址 (例如
- 按一下 [儲存]。
建立 Pub/Sub 主題
建立 Pub/Sub 主題,Cloud Scheduler 會將訊息發布至該主題,而 Cloud Run 函式會訂閱該主題。
- 在 GCP Console 中,前往「Pub/Sub」>「Topics」(主題)。
- 按一下「建立主題」。
- 請提供下列設定詳細資料:
- 主題 ID:輸入
workday-audit-trigger。 - 其他設定保留預設值。
- 主題 ID:輸入
- 點選「建立」。
建立 Cloud Run 函式來收集記錄
Cloud Run 函式會由 Cloud Scheduler 的 Pub/Sub 訊息觸發,從 Workday API 擷取記錄並寫入 GCS。
- 前往 GCP Console 的「Cloud Run」。
- 按一下「Create service」(建立服務)。
- 選取「函式」 (使用內嵌編輯器建立函式)。
在「設定」部分,提供下列設定詳細資料:
設定 值 服務名稱 workday-audit-collector區域 選取與 GCS bucket 相符的區域 (例如 us-central1)執行階段 選取「Python 3.12」以上版本 在「Trigger (optional)」(觸發條件 (選用)) 專區:
- 按一下「+ 新增觸發條件」。
- 選取「Cloud Pub/Sub」。
- 在「選取 Cloud Pub/Sub 主題」中,選擇主題
workday-audit-trigger。 - 按一下 [儲存]。
在「Authentication」(驗證) 部分:
- 選取「需要驗證」。
- 檢查 Identity and Access Management (IAM)。
向下捲動並展開「Containers, Networking, Security」。
前往「安全性」分頁:
- 服務帳戶:選取服務帳戶
workday-audit-collector-sa。
- 服務帳戶:選取服務帳戶
前往「容器」分頁:
- 按一下「變數與密鑰」。
- 針對每個環境變數,按一下「+ 新增變數」:
變數名稱 範例值 GCS_BUCKETworkday-audit-logsWD_USERaudit_gcs_userWD_PASSyour-workday-passwordWD_URLhttps://wd-servicesN.workday.com/ccx/service/customreport2/<tenant>/<user>/Audit_Trail_BP_JSON?format=json在「變數與密鑰」分頁中向下捲動至「要求」:
- 要求逾時:輸入
600秒 (10 分鐘)。
- 要求逾時:輸入
前往「容器」中的「設定」分頁:
- 在「資源」部分:
- 記憶體:選取 512 MiB 以上。
- CPU:選取 1。
- 按一下 [完成]。
- 在「資源」部分:
捲動至「執行環境」:
- 選取「預設」 (建議選項)。
在「修訂版本資源調度」部分:
- 執行個體數量下限:輸入
0。 - 「Maximum number of instances」(執行個體數量上限):輸入
100(或根據預期負載調整)。
- 執行個體數量下限:輸入
點選「建立」。
等待服務建立完成 (1 到 2 分鐘)。
服務建立完成後,系統會自動開啟內嵌程式碼編輯器。
新增函式程式碼
- 在「Function entry point」(函式進入點) 中輸入 main
在內嵌程式碼編輯器中建立兩個檔案:
- 第一個檔案:main.py:
import functions_framework from google.cloud import storage import json import os import urllib3 from datetime import datetime, timezone import base64 import gzip import io import uuid # Initialize HTTP client http = urllib3.PoolManager( timeout=urllib3.Timeout(connect=5.0, read=30.0), retries=False, ) # Initialize Storage client storage_client = storage.Client() @functions_framework.cloud_event def main(cloud_event): """ Cloud Run function triggered by Pub/Sub to fetch logs from Workday API and write to GCS. Args: cloud_event: CloudEvent object containing Pub/Sub message """ # Get environment variables bucket_name = os.environ.get('GCS_BUCKET') wd_user = os.environ.get('WD_USER') wd_pass = os.environ.get('WD_PASS') wd_url = os.environ.get('WD_URL') if not all([bucket_name, wd_user, wd_pass, wd_url]): print('Error: Missing required environment variables') return try: # Get GCS bucket bucket = storage_client.bucket(bucket_name) print(f'Fetching Workday audit report from {wd_url}') # Fetch report from Workday data = fetch_report(wd_url, wd_user, wd_pass) # Upload to GCS timestamp = datetime.now(timezone.utc) upload(bucket, data, timestamp) print(f'Successfully uploaded Workday audit report ({len(data)} bytes raw)') except Exception as e: print(f'Error processing logs: {str(e)}') raise def fetch_report(url, username, password): """Fetch report from Workday using Basic Auth.""" credentials = f"{username}:{password}" credentials_bytes = credentials.encode('utf-8') auth_header = b"Basic " + base64.b64encode(credentials_bytes) req_headers = { "Authorization": auth_header.decode('utf-8') } response = http.request('GET', url, headers=req_headers) if response.status != 200: raise Exception(f"Failed to fetch report: HTTP {response.status}") return response.data def upload(bucket, payload, ts): """Upload gzipped JSON to GCS.""" key = f"{ts:%Y/%m/%d}/workday-audit-{uuid.uuid4()}.json.gz" buf = io.BytesIO() with gzip.GzipFile(fileobj=buf, mode='w') as gz: gz.write(payload) buf.seek(0) blob = bucket.blob(key) blob.upload_from_file(buf, content_type='application/gzip') print(f'Uploaded to gs://{bucket.name}/{key}')- 第二個檔案:requirements.txt:
functions-framework==3.* google-cloud-storage==2.* urllib3>=2.0.0點選「部署」來儲存並部署函式。
等待部署作業完成 (2 到 3 分鐘)。
建立 Cloud Scheduler 工作
Cloud Scheduler 會定期將訊息發布至 Pub/Sub 主題,觸發 Cloud Run 函式。
- 前往 GCP 主控台的「Cloud Scheduler」。
- 點選「建立工作」。
請提供下列設定詳細資料:
設定 值 名稱 workday-audit-collector-daily區域 選取與 Cloud Run 函式相同的區域 頻率 20 2 * * *(每天世界標準時間 02:20 執行)時區 選取時區 (建議使用世界標準時間) 目標類型 Pub/Sub 主題 選取主題 workday-audit-trigger郵件內文 {}(空白 JSON 物件)點選「建立」。
排程頻率選項
根據記錄檔量和延遲時間要求選擇頻率:
頻率 Cron 運算式 用途 每 5 分鐘 */5 * * * *高容量、低延遲 每 15 分鐘檢查一次 */15 * * * *普通量 每小時 0 * * * *標準 每 6 小時 0 */6 * * *少量、批次處理 每日 20 2 * * *歷來資料集合 (建議)
測試排程器工作
- 在 Cloud Scheduler 控制台中找出您的工作。
- 按一下「強制執行」即可手動觸發。
- 等待幾秒鐘,然後依序前往「Cloud Run」>「Services」>「workday-audit-collector」>「Logs」。
- 確認函式是否已順利執行。
- 檢查 GCS 值區,確認是否已寫入記錄。
擷取 Google SecOps 服務帳戶
Google SecOps 會使用專屬服務帳戶,從 GCS bucket 讀取資料。您必須授予這個服務帳戶值區存取權。
取得服務帳戶電子郵件地址
- 依序前往「SIEM 設定」>「動態饋給」。
- 按一下「新增動態消息」。
- 按一下「設定單一動態饋給」。
- 在「動態饋給名稱」欄位中輸入動態饋給名稱 (例如
Workday Audit Logs)。 - 選取「Google Cloud Storage V2」做為「來源類型」。
- 選取「Workday 稽核」做為「記錄類型」。
按一下「取得服務帳戶」。系統會顯示專屬的服務帳戶電子郵件地址,例如:
chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com複製這個電子郵件地址,以便在下一步中使用。
將 IAM 權限授予 Google SecOps 服務帳戶
Google SecOps 服務帳戶需要 GCS bucket 的「Storage 物件檢視者」角色。
- 依序前往「Cloud Storage」>「Buckets」。
- 按一下 bucket 名稱。
- 前往「權限」分頁標籤。
- 按一下「授予存取權」。
- 請提供下列設定詳細資料:
- 新增主體:貼上 Google SecOps 服務帳戶電子郵件地址。
- 指派角色:選取「Storage 物件檢視者」。
按一下 [儲存]。
在 Google SecOps 中設定資訊提供,擷取 Workday 稽核記錄
- 依序前往「SIEM 設定」>「動態饋給」。
- 按一下「新增動態消息」。
- 按一下「設定單一動態饋給」。
- 在「動態饋給名稱」欄位中輸入動態饋給名稱 (例如
Workday Audit Logs)。 - 選取「Google Cloud Storage V2」做為「來源類型」。
- 選取「Workday 稽核」做為「記錄類型」。
- 點選 [下一步]。
指定下列輸入參數的值:
儲存空間 bucket URL:輸入 GCS bucket URI,並加上前置路徑:
gs://workday-audit-logs/- 請將
workday-audit-logs替換成實際的 GCS 值區名稱。
- 請將
來源刪除選項:根據偏好設定選取刪除選項:
- 永不:移轉後一律不刪除任何檔案 (建議用於測試)。
- 刪除已轉移的檔案:成功轉移檔案後刪除檔案。
- 刪除已轉移的檔案和空白目錄:成功轉移後刪除檔案和空白目錄。
檔案存在時間上限:包含在過去天數內修改的檔案。預設值為 180 天。
資產命名空間:資產命名空間。
擷取標籤:要套用至這個動態饋給事件的標籤。
點選 [下一步]。
在「Finalize」(完成) 畫面中檢查新的動態饋給設定,然後按一下「Submit」(提交)。
UDM 對應表
| 記錄欄位 | UDM 對應 | 邏輯 |
|---|---|---|
| 帳戶 | metadata.event_type | 如果「帳戶」欄位不為空白,「metadata.event_type」欄位會設為「USER_RESOURCE_UPDATE_CONTENT」。 |
| 帳戶 | principal.user.primaryId | 系統會使用 grok 模式從「帳戶」欄位擷取使用者 ID,並對應至 principal.user.primaryId。 |
| 帳戶 | principal.user.primaryName | 系統會使用 grok 模式從「帳戶」欄位擷取使用者顯示名稱,並對應至「principal.user.primaryName」。 |
| ActivityCategory | metadata.event_type | 如果「ActivityCategory」欄位為「READ」,「metadata.event_type」欄位會設為「RESOURCE_READ」。如果是「WRITE」,則會設為「RESOURCE_WRITTEN」。 |
| ActivityCategory | metadata.product_event_type | 直接從「ActivityCategory」欄位對應。 |
| AffectedGroups | target.user.group_identifiers | 直接從「AffectedGroups」欄位對應。 |
| 區 | target.resource.attribute.labels.area.value | 直接從「區域」欄位對應。 |
| AuthType | extensions.auth.auth_details | 直接從「AuthType」欄位對應。 |
| AuthType | extensions.auth.type | 根據特定值,從「AuthType」欄位對應至 UDM 中定義的不同驗證類型。 |
| CFIPdeConexion | src.domain.name | 如果「CFIPdeConexion」欄位不是有效的 IP 位址,系統會將其對應至「src.domain.name」。 |
| CFIPdeConexion | target.ip | 如果「CFIPdeConexion」欄位是有效的 IP 位址,則會對應至「target.ip」。 |
| ChangedRelationship | metadata.description | 直接從「ChangedRelationship」欄位對應。 |
| ClassOfInstance | target.resource.attribute.labels.class_instance.value | 直接從「ClassOfInstance」欄位對應。 |
| column18 | about.labels.utub.value | 直接從「column18」欄位對應。 |
| CreatedBy | principal.user.userid | 系統會使用 grok 模式從「CreatedBy」欄位擷取使用者 ID,並對應至「principal.user.userid」。 |
| CreatedBy | principal.user.user_display_name | 系統會使用 grok 模式從「CreatedBy」欄位擷取使用者顯示名稱,並對應至「principal.user.user_display_name」。 |
| 網域 | about.domain.name | 直接從「網域」欄位對應。 |
| EffectiveDate | @timestamp | 轉換為「yyyy-MM-dd HH:mm:ss.SSSZ」格式後,會剖析為「@timestamp」。 |
| EntryMoment | @timestamp | 轉換為「ISO8601」格式後,剖析為「@timestamp」。 |
| EventType | security_result.description | 直接從「EventType」欄位對應。 |
| 表單 | target.resource.name | 直接從「表單」欄位對應。 |
| InstancesAdded | about.resource.attribute.labels.instances_added.value | 直接從「InstancesAdded」欄位對應。 |
| InstancesAdded | target.user.attribute.roles.instances_added.name | 直接從「InstancesAdded」欄位對應。 |
| InstancesRemoved | about.resource.attribute.labels.instances_removed.value | 直接從「InstancesRemoved」欄位對應。 |
| InstancesRemoved | target.user.attribute.roles.instances_removed.name | 直接從「InstancesRemoved」欄位對應。 |
| IntegrationEvent | target.resource.attribute.labels.integration_event.value | 直接從「IntegrationEvent」欄位對應。 |
| IntegrationStatus | security_result.action_details | 直接從「IntegrationStatus」欄位對應。 |
| IntegrationSystem | target.resource.name | 直接從「IntegrationSystem」欄位對應。 |
| IP | src.domain.name | 如果「IP」欄位不是有效的 IP 位址,系統會將其對應至「src.domain.name」。 |
| IP | src.ip | 如果「IP」欄位是有效的 IP 位址,則會對應至「src.ip」。 |
| IsDeviceManaged | additional.fields.additional1.value.string_value | 如果「IsDeviceManaged」欄位為「N」,則值會設為「Successful」。否則會設為「發生登入失敗」。 |
| IsDeviceManaged | additional.fields.additional2.value.string_value | 如果「IsDeviceManaged」欄位為「N」,則值會設為「Successful」。否則會設為「憑證無效」。 |
| IsDeviceManaged | additional.fields.additional3.value.string_value | 如果「IsDeviceManaged」欄位為「N」,則值會設為「Successful」。否則會設為「帳戶已鎖定」。 |
| IsDeviceManaged | security_result.action_details | 直接對應至「IsDeviceManaged」欄位。 |
| OutputFiles | about.file.full_path | 直接從「OutputFiles」欄位對應。 |
| 人物 | principal.user.primaryId | 如果「Person」欄位開頭為「INT」,系統會使用 grok 模式擷取使用者 ID,並對應至「principal.user.primaryId」。 |
| 人物 | principal.user.primaryName | 如果「Person」欄位開頭為「INT」,系統會使用 grok 模式擷取使用者顯示名稱,並對應至「principal.user.primaryName」。 |
| 人物 | principal.user.user_display_name | 如果「Person」欄位開頭不是「INT」,則會直接對應至「principal.user.user_display_name」。 |
| 人物 | metadata.event_type | 如果「Person」欄位不為空白,「metadata.event_type」欄位會設為「USER_RESOURCE_UPDATE_CONTENT」。 |
| ProcessedTransaction | target.resource.attribute.creation_time | 轉換為「dd/MM/yyyy HH:mm:ss,SSS (ZZZ)」、「dd/MM/yyyy, HH:mm:ss,SSS (ZZZ)」或「MM/dd/yyyy, HH:mm:ss.SSS A ZZZ」格式後,會剖析為「target.resource.attribute.creation_time」。 |
| ProgramBy | principal.user.userid | 直接從「ProgramBy」欄位對應。 |
| RecurrenceEndDate | principal.resource.attribute.last_update_time | 轉換為「yyyy-MM-dd」格式後,剖析為「principal.resource.attribute.last_update_time」。 |
| RecurrenceStartDate | principal.resource.attribute.creation_time | 轉換為「yyyy-MM-dd」格式後,剖析為「principal.resource.attribute.creation_time」。 |
| RequestName | metadata.description | 直接從「RequestName」欄位對應。 |
| ResponseMessage | security_result.summary | 直接從「ResponseMessage」欄位對應。 |
| RestrictedToEnvironment | security_result.about.hostname | 直接從「RestrictedToEnvironment」欄位對應。 |
| RevokedSecurity | security_result.outcomes.outcomes.value | 直接從「RevokedSecurity」欄位對應。 |
| RunFrequency | principal.resource.attribute.labels.run_frequency.value | 直接從「RunFrequency」欄位對應。 |
| ScheduledProcess | principal.resource.name | 直接從「ScheduledProcess」欄位對應。 |
| SecuredTaskExecuted | target.resource.name | 直接從「SecuredTaskExecuted」欄位對應。 |
| SecureTaskExecuted | metadata.event_type | 如果「SecureTaskExecuted」欄位包含「Create」,「metadata.event_type」欄位會設為「USER_RESOURCE_CREATION」。 |
| SecureTaskExecuted | target.resource.name | 直接對應至「SecureTaskExecuted」欄位。 |
| SentTime | @timestamp | 轉換為「ISO8601」格式後,剖析為「@timestamp」。 |
| SessionId | network.session_id | 直接從「SessionId」欄位對應。 |
| ShareBy | target.user.userid | 直接從「ShareBy」欄位對應。 |
| SignOffTime | additional.fields.additional4.value.string_value | 「AuthFailMessage」欄位值會放在「additional.fields」陣列中,並以「Enterprise Interface Builder」做為鍵。 |
| SignOffTime | metadata.description | 直接從「AuthFailMessage」欄位對應。 |
| SignOffTime | metadata.event_type | 如果「SignOffTime」欄位空白,「metadata.event_type」欄位會設為「USER_LOGIN」。否則會設為「USER_LOGOUT」。 |
| SignOffTime | principal.user.attribute.last_update_time | 轉換為「ISO8601」格式後,剖析為「principal.user.attribute.last_update_time」。 |
| SignOnIp | src.domain.name | 如果「SignOnIp」欄位不是有效的 IP 位址,系統會將其對應至「src.domain.name」。 |
| SignOnIp | src.ip | 如果「SignOnIp」欄位是有效的 IP 位址,則會對應至「src.ip」。 |
| 狀態 | metadata.product_event_type | 直接對應「狀態」欄位。 |
| SystemAccount | principal.user.email_addresses | 系統會使用 grok 模式從「SystemAccount」欄位擷取電子郵件地址,並對應至「principal.user.email_addresses」。 |
| SystemAccount | principal.user.primaryId | 系統會使用 grok 模式從「SystemAccount」欄位擷取使用者 ID,並對應至「principal.user.primaryId」。 |
| SystemAccount | principal.user.primaryName | 系統會使用 grok 模式從「SystemAccount」欄位擷取使用者顯示名稱,並對應至「principal.user.primaryName」。 |
| SystemAccount | src.user.userid | 系統會使用 grok 模式從「SystemAccount」欄位擷取次要使用者 ID,並對應至「src.user.userid」。 |
| SystemAccount | src.user.user_display_name | 系統會使用 grok 模式從「SystemAccount」欄位擷取次要使用者顯示名稱,並對應至「src.user.user_display_name」。 |
| SystemAccount | target.user.userid | 系統會使用 grok 模式從「SystemAccount」欄位擷取目標使用者 ID,並對應至「target.user.userid」。 |
| 目標 | target.user.user_display_name | 直接從「目標」欄位對應。 |
| 範本 | about.resource.name | 直接從「範本」欄位對應。 |
| 用戶群 | target.asset.hostname | 直接從「租戶」欄位對應。 |
| TlsVersion | network.tls.version | 直接從「TlsVersion」欄位對應。 |
| 交易 | security_result.action_details | 直接從「交易」欄位對應。 |
| TransactionType | security_result.summary | 直接從「TransactionType」欄位對應。 |
| TypeForm | target.resource.resource_subtype | 直接從「TypeForm」欄位對應。 |
| UserAgent | network.http.parsed_user_agent | 使用「useragent」篩選器從「UserAgent」欄位剖析。 |
| UserAgent | network.http.user_agent | 直接從「UserAgent」欄位對應。 |
| WorkdayAccount | target.user.user_display_name | 系統會使用 grok 模式從「WorkdayAccount」欄位擷取使用者顯示名稱,並對應至「target.user.user_display_name」。 |
| WorkdayAccount | target.user.userid | 系統會使用 grok 模式從「WorkdayAccount」欄位擷取使用者 ID,並對應至「target.user.userid」。 |
| additional.fields.additional1.key | 設為「FailedSignOn」。 | |
| additional.fields.additional2.key | 設為「InvalidCredentials」。 | |
| additional.fields.additional3.key | 設為「AccountLocked」。 | |
| additional.fields.additional4.key | 設為「Enterprise Interface Builder」。 | |
| metadata.event_type | 一開始設為「GENERIC_EVENT」,然後根據涉及其他欄位的邏輯更新。 | |
| metadata.event_type | 針對特定事件類型設為「USER_CHANGE_PERMISSIONS」。 | |
| metadata.event_type | 針對特定事件類型,請設為「RESOURCE_WRITTEN」。 | |
| metadata.log_type | 硬式編碼為「WORKDAY_AUDIT」。 | |
| metadata.product_name | 硬式編碼為「Enterprise Interface Builder」。 | |
| metadata.vendor_name | 已硬式編碼為「Workday」。 | |
| principal.asset.category | 如果「DeviceType」欄位為「Phone」,請設為「Phone」。 | |
| principal.resource.resource_type | 如果「ScheduledProcess」欄位不為空白,則會硬式編碼為「TASK」。 | |
| security_result.action | 根據「FailedSignOn」、「IsDeviceManaged」、「InvalidCredentials」和「AccountLocked」欄位的值,設為「ALLOW」或「FAIL」。 | |
| security_result.summary | 根據「FailedSignOn」、「IsDeviceManaged」、「InvalidCredentials」和「AccountLocked」欄位的值,設為「Successful」或特定錯誤訊息。 | |
| target.resource.resource_type | 針對特定事件類型硬式編碼為「TASK」。 | |
| target.resource.resource_type | 如果「TypeForm」欄位不為空白,則會硬式編碼為「DATASET」。 | |
| 訊息 | principal.user.email_addresses | 使用 grok 模式從「message」欄位擷取電子郵件地址,並在符合特定模式時,將其合併至「principal.user.email_addresses」。 |
| 訊息 | src.user.userid | 如果「event.idm.read_only_udm.principal.user.userid」欄位與從「message」欄位擷取的「user_target」相符,則清除該欄位。 |
| 訊息 | src.user.user_display_name | 如果「event.idm.read_only_udm.principal.user.userid」欄位與從「message」欄位擷取的「user_target」相符,則清除該欄位。 |
| 訊息 | target.user.userid | 使用 grok 模式從「message」欄位擷取 userid,並在符合特定模式時將其對應至「target.user.userid」。 |
需要其他協助嗎?向社群成員和 Google SecOps 專業人員尋求答案。