收集 DomainTools Iris Investigate 結果
剖析器版本:1.0
本文說明如何使用 Google Cloud Storage,將 DomainTools Iris Investigate 結果擷取至 Google Security Operations。剖析器會將 DomainTools Iris API 的原始 JSON 資料,轉換為符合 Google SecOps 統合式資料模型 (UDM) 的結構化格式。並擷取網域詳細資料、聯絡資訊、安全風險、SSL 憑證和其他相關屬性的資訊,然後對應至相應的 UDM 欄位,以進行一致的分析和威脅情報。
事前準備
請確認您已完成下列事前準備事項:
- Google SecOps 執行個體
- DomainTools 公司帳戶的特殊存取權 (Iris Investigate 的 API 存取權)
- 已啟用 Cloud Storage API 的 GCP 專案
- 建立及管理 GCS bucket 的權限
- 管理 Google Cloud Storage 值區 IAM 政策的權限
- 建立 Cloud Run 服務、Pub/Sub 主題和 Cloud Scheduler 工作的權限
取得 DomainTools API 金鑰和端點
- 登入 DomainTools API 資訊主頁 (只有 API 擁有者帳戶可以重設 API 金鑰)。
- 在「我的帳戶」部分,選取「帳戶摘要」分頁中的「查看 API 資訊主頁」連結。
- 前往「API Username」(API 使用者名稱) 部分,取得使用者名稱。
- 在同一個分頁中,找出 API 金鑰。
複製金鑰並妥善儲存於安全的位置。如需新金鑰,請選取「重設 API 金鑰」。
記下 Iris Investigate 端點:
https://api.domaintools.com/v1/iris-investigate/。
建立 Google Cloud Storage bucket
- 前往 Google Cloud 控制台。
- 選取專案或建立新專案。
- 在導覽選單中,依序前往「Cloud Storage」>「Bucket」。
- 按一下「建立值區」。
請提供下列設定詳細資料:
設定 值 為 bucket 命名 輸入全域不重複的名稱 (例如 domaintools-iris)位置類型 根據需求選擇 (區域、雙區域、多區域) 位置 選取位置 (例如 us-central1)儲存空間級別 標準 (建議用於經常存取的記錄) 存取控管 統一 (建議) 保護工具 選用:啟用物件版本管理或保留政策 點選「建立」。
為 Cloud Run 函式建立服務帳戶
Cloud Run 函式需要具備 GCS bucket 寫入權限,且可由 Pub/Sub 叫用的服務帳戶。
建立服務帳戶
- 在 GCP 控制台中,依序前往「IAM & Admin」(IAM 與管理) >「Service Accounts」(服務帳戶)。
- 按一下「Create Service Account」(建立服務帳戶)。
- 請提供下列設定詳細資料:
- 服務帳戶名稱:輸入
domaintools-iris-collector-sa。 - 服務帳戶說明:輸入
Service account for Cloud Run function to collect DomainTools Iris Investigate 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 名稱。
- 前往「權限」分頁標籤。
- 按一下「授予存取權」。
- 請提供下列設定詳細資料:
- 新增主體:輸入服務帳戶電子郵件地址 (例如
domaintools-iris-collector-sa@PROJECT_ID.iam.gserviceaccount.com)。 - 指派角色:選取「Storage 物件管理員」。
- 新增主體:輸入服務帳戶電子郵件地址 (例如
- 按一下 [儲存]。
建立 Pub/Sub 主題
建立 Pub/Sub 主題,Cloud Scheduler 會將訊息發布至該主題,而 Cloud Run 函式會訂閱該主題。
- 在 GCP Console 中,前往「Pub/Sub」>「Topics」(主題)。
- 按一下「建立主題」。
- 請提供下列設定詳細資料:
- 主題 ID:輸入
domaintools-iris-trigger。 - 其他設定保留預設值。
- 主題 ID:輸入
- 點選「建立」。
建立 Cloud Run 函式來收集記錄
Cloud Run 函式會由 Cloud Scheduler 的 Pub/Sub 訊息觸發,從 DomainTools Iris Investigate API 擷取記錄,並將記錄寫入 GCS。
- 前往 GCP Console 的「Cloud Run」。
- 按一下「Create service」(建立服務)。
- 選取「函式」 (使用內嵌編輯器建立函式)。
在「設定」部分,提供下列設定詳細資料:
設定 值 服務名稱 domaintools-iris-collector區域 選取與 GCS bucket 相符的區域 (例如 us-central1)執行階段 選取 Python 3.12 以上版本 在「Trigger (optional)」(觸發條件 (選用)) 專區:
- 按一下「+ 新增觸發條件」。
- 選取「Cloud Pub/Sub」。
- 在「選取 Cloud Pub/Sub 主題」中,選擇 Pub/Sub 主題 (
domaintools-iris-trigger)。 - 按一下 [儲存]。
在「Authentication」(驗證) 部分:
- 選取「需要驗證」。
- 檢查 Identity and Access Management (IAM)。
向下捲動並展開「容器」、「網路」和「安全性」。
前往「安全性」分頁:
- 服務帳戶:選取服務帳戶 (
domaintools-iris-collector-sa)。
- 服務帳戶:選取服務帳戶 (
前往「容器」分頁:
- 按一下「變數與密鑰」。
- 針對每個環境變數,按一下「+ 新增變數」:
變數名稱 範例值 說明 GCS_BUCKETdomaintools-iris要儲存資料的 GCS bucket 名稱。 GCS_PREFIXdomaintools/iris/物件的選填 GCS 前置字串 (子資料夾)。 STATE_KEYdomaintools/iris/state.json選用的狀態/檢查點檔案金鑰。 DT_API_KEYDT-XXXXXXXXXXXXXXXXXXXXDomainTools API 金鑰。 USE_MODEHASH選取要使用的模式:「 HASH」、「DOMAINS」或「QUERY」(一次只能啟用一個模式)。SEARCH_HASHEShash1;hash2;hash3如果 USE_MODE=HASH,則為必要欄位。以半形分號分隔的清單,列出 Iris UI 中已儲存的搜尋雜湊。DOMAINSexample.com;domaintools.com如果 USE_MODE=DOMAINS,則為必要欄位。以半形分號分隔的網域清單。QUERY_LISTip=1.1.1.1;ip=8.8.8.8;domain=example.org如果 USE_MODE=QUERY,則為必要欄位。以半形分號分隔的查詢字串清單 (k=v&k2=v2)。PAGE_SIZE500每頁列數 (預設為 500)。 MAX_PAGES20每項要求的頁數上限。 在「變數與密鑰」部分,向下捲動至「要求」:
- 要求逾時:輸入
900秒 (15 分鐘)。
- 要求逾時:輸入
前往「設定」分頁:
- 在「資源」部分:
- 記憶體:選取 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 urllib.parse from urllib.request import Request, urlopen from urllib.error import HTTPError import time from datetime import datetime, timezone # Initialize Storage client storage_client = storage.Client() # Environment variables GCS_BUCKET = os.environ.get("GCS_BUCKET", "").strip() GCS_PREFIX = os.environ.get("GCS_PREFIX", "domaintools/iris/").strip() STATE_KEY = os.environ.get("STATE_KEY", "domaintools/iris/state.json").strip() DT_API_KEY = os.environ.get("DT_API_KEY", "").strip() USE_MODE = os.environ.get("USE_MODE", "HASH").strip().upper() SEARCH_HASHES = [h.strip() for h in os.environ.get("SEARCH_HASHES", "").split(";") if h.strip()] DOMAINS = [d.strip() for d in os.environ.get("DOMAINS", "").split(";") if d.strip()] QUERY_LIST = [q.strip() for q in os.environ.get("QUERY_LIST", "").split(";") if q.strip()] PAGE_SIZE = int(os.environ.get("PAGE_SIZE", "500")) MAX_PAGES = int(os.environ.get("MAX_PAGES", "20")) USE_NEXT = os.environ.get("USE_NEXT", "true").lower() == "true" HTTP_TIMEOUT = int(os.environ.get("HTTP_TIMEOUT", "60")) RETRIES = int(os.environ.get("HTTP_RETRIES", "2")) BASE_URL = "https://api.domaintools.com/v1/iris-investigate/" HDRS = { "X-Api-Key": DT_API_KEY, "Accept": "application/json", } def _http_post(url: str, body: dict) -> dict: """Make HTTP POST request with form-encoded body.""" req = Request(url, method="POST") for k, v in HDRS.items(): req.add_header(k, v) req.add_header("Content-Type", "application/x-www-form-urlencoded") encoded_body = urllib.parse.urlencode(body, doseq=True).encode('utf-8') attempt = 0 while True: try: with urlopen(req, data=encoded_body, timeout=HTTP_TIMEOUT) as r: return json.loads(r.read().decode("utf-8")) except HTTPError as e: if e.code in (429, 500, 502, 503, 504) and attempt < RETRIES: delay = int(e.headers.get("Retry-After", "2")) time.sleep(max(1, delay)) attempt += 1 continue raise def _write_page(bucket, obj: dict, label: str, page: int) -> str: ts = time.strftime("%Y/%m/%d/%H%M%S", time.gmtime()) key = f"{GCS_PREFIX.rstrip('/')}/{ts}-{label}-p{page:05d}.json" blob = bucket.blob(key) blob.upload_from_string( json.dumps(obj, separators=(",", ":")), content_type="application/json" ) return key def _first_page_params() -> dict: params = {"page_size": str(PAGE_SIZE)} if USE_NEXT: params["next"] = "true" return params def _paginate(bucket, label: str, params: dict) -> tuple: pages = 0 total = 0 while pages < MAX_PAGES: data = _http_post(BASE_URL, params) _write_page(bucket, data, label, pages) resp = data.get("response") or {} results = resp.get("results") or [] total += len(results) pages += 1 next_url = resp.get("next") if isinstance(resp, dict) else None if next_url: parsed = urllib.parse.urlparse(next_url) params = dict(urllib.parse.parse_qsl(parsed.query)) continue if resp.get("has_more_results") and resp.get("position"): base = _first_page_params() base.pop("next", None) base["position"] = resp["position"] params = base continue break return pages, total def run_hashes(bucket, hashes: list) -> dict: agg_pages = agg_results = 0 for h in hashes: params = _first_page_params() params["search_hash"] = h p, r = _paginate(bucket, f"hash-{h}", params) agg_pages += p agg_results += r return {"pages": agg_pages, "results": agg_results} def run_domains(bucket, domains: list) -> dict: agg_pages = agg_results = 0 for d in domains: params = _first_page_params() params["domain"] = d p, r = _paginate(bucket, f"domain-{d}", params) agg_pages += p agg_results += r return {"pages": agg_pages, "results": agg_results} def run_queries(bucket, queries: list) -> dict: agg_pages = agg_results = 0 for q in queries: base = _first_page_params() for k, v in urllib.parse.parse_qsl(q, keep_blank_values=True): base.setdefault(k, v) p, r = _paginate(bucket, f"query-{q.replace('=', '-')}", base) agg_pages += p agg_results += r return {"pages": agg_pages, "results": agg_results} @functions_framework.cloud_event def main(cloud_event): """ Cloud Run function triggered by Pub/Sub to fetch DomainTools Iris Investigate results and write to GCS. Args: cloud_event: CloudEvent object containing Pub/Sub message """ if not GCS_BUCKET: print("Error: GCS_BUCKET environment variable not set") return try: bucket = storage_client.bucket(GCS_BUCKET) if USE_MODE == "HASH" and SEARCH_HASHES: res = run_hashes(bucket, SEARCH_HASHES) elif USE_MODE == "DOMAINS" and DOMAINS: res = run_domains(bucket, DOMAINS) elif USE_MODE == "QUERY" and QUERY_LIST: res = run_queries(bucket, QUERY_LIST) else: raise ValueError( "Invalid USE_MODE or missing parameters. Set USE_MODE to HASH | DOMAINS | QUERY " "and provide SEARCH_HASHES | DOMAINS | QUERY_LIST accordingly." ) print(f"Successfully processed: {json.dumps({'ok': True, 'mode': USE_MODE, **res})}") except Exception as e: print(f"Error processing DomainTools Iris data: {str(e)}") raise- 第二個檔案:requirements.txt:
functions-framework==3.* google-cloud-storage==2.*點選「部署」即可儲存並部署函式。
等待部署作業完成 (2 到 3 分鐘)。
建立 Cloud Scheduler 工作
Cloud Scheduler 會定期將訊息發布至 Pub/Sub 主題,觸發 Cloud Run 函式。
- 前往 GCP 主控台的「Cloud Scheduler」。
- 點選「建立工作」。
請提供下列設定詳細資料:
設定 值 名稱 domaintools-iris-1h區域 選取與 Cloud Run 函式相同的區域 頻率 0 * * * *(每小時整點)時區 選取時區 (建議使用世界標準時間) 目標類型 Pub/Sub 主題 選取 Pub/Sub 主題 ( domaintools-iris-trigger)郵件內文 {}(空白 JSON 物件)點選「建立」。
排程頻率選項
根據記錄檔量和延遲時間要求選擇頻率:
頻率 Cron 運算式 用途 每 5 分鐘 */5 * * * *大量、低延遲 每 15 分鐘 */15 * * * *中等 每小時 0 * * * *標準 (建議) 每 6 小時 0 */6 * * *少量、批次處理 每日 0 0 * * *歷來資料集合
測試整合項目
- 在 Cloud Scheduler 控制台中找出您的工作。
- 按一下「強制執行」即可手動觸發工作。
- 稍等幾秒鐘。
- 前往「Cloud Run」>「Services」。
- 按一下函式名稱 (
domaintools-iris-collector)。 - 按一下 [Logs] (記錄) 分頁標籤。
確認函式是否已順利執行。請找出以下項目:
Successfully processed: {"ok": true, "mode": "HASH", "pages": X, "results": Y}依序前往「Cloud Storage」>「Buckets」。
按一下 bucket 名稱。
前往前置字元資料夾 (
domaintools/iris/)。確認是否已建立含有目前時間戳記的新
.json檔案。
如果記錄中顯示錯誤:
- HTTP 401:檢查環境變數中的 DomainTools API 憑證
- HTTP 403:確認帳戶是否具備 Iris Investigate API 的必要權限
- HTTP 429:頻率限制 - 函式會自動重試,並延遲一段時間
- 缺少環境變數:檢查是否已設定所有必要變數
- USE_MODE 無效:確認 USE_MODE 設為 HASH、DOMAINS 或 QUERY,並提供對應參數
擷取 Google SecOps 服務帳戶
Google SecOps 會使用專屬服務帳戶,從 GCS bucket 讀取資料。您必須授予這個服務帳戶值區存取權。
取得服務帳戶電子郵件地址
- 依序前往「SIEM 設定」>「動態饋給」。
- 按一下「新增動態消息」。
- 按一下「設定單一動態饋給」。
- 在「動態饋給名稱」欄位中輸入動態饋給名稱 (例如
DomainTools Iris Investigate)。 - 選取「Google Cloud Storage V2」做為「來源類型」。
- 選取「DomainTools Threat Intelligence」做為「記錄類型」。
按一下「取得服務帳戶」。系統會顯示專屬服務帳戶電子郵件地址,例如:
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 中設定動態饋給,擷取 DomainTools Iris Investigate 結果
- 依序前往「SIEM 設定」>「動態饋給」。
- 按一下「新增動態消息」。
- 按一下「設定單一動態饋給」。
- 在「動態饋給名稱」欄位中輸入動態饋給名稱 (例如
DomainTools Iris Investigate)。 - 選取「Google Cloud Storage V2」做為「來源類型」。
- 選取「DomainTools Threat Intelligence」做為「記錄類型」。
- 點選「下一步」。
指定下列輸入參數的值:
儲存空間 bucket URL:輸入 GCS bucket URI,並加上前置路徑:
gs://domaintools-iris/domaintools/iris/更改項目:
domaintools-iris:您的 GCS bucket 名稱。domaintools/iris/:選用的前置字元/資料夾路徑,用於儲存記錄 (如為根目錄,請留空)。
範例:
- 根層級 bucket:
gs://domaintools-iris/ - 加上前置字元:
gs://domaintools-iris/domaintools/iris/
- 根層級 bucket:
來源刪除選項:根據偏好設定選取刪除選項:
- 永不:移轉後一律不刪除任何檔案 (建議用於測試)。
- 刪除已轉移的檔案:成功轉移檔案後刪除檔案。
刪除已轉移的檔案和空白目錄:成功轉移後刪除檔案和空白目錄。
檔案存在時間上限:納入在過去天數內修改的檔案。預設值為 180 天。
資產命名空間:
domaintools.threat_intel擷取標籤:要套用至這個動態饋給事件的標籤。
點選「下一步」。
在「Finalize」(完成) 畫面中檢查新的動態饋給設定,然後按一下「Submit」(提交)。
支援的 DomainTools Iris Investigate 範例記錄檔
標準網域擴充功能 (基本)
{ "domain": "example-sanitized-01.com", "whois_url": "https://whois.domaintools.com/example-sanitized-01.com", "active": false, "admin_contact": { "name": { "value": "REDACTED_NAME" }, "org": { "value": "Sanitized Corp" }, "email": [ { "value": "admin@example-sanitized.com" } ] }, "ip": [ { "address": { "value": "192.168.1.100" }, "asn": [ { "value": 12345 } ], "isp": { "value": "Generic ISP" } } ], "domain_risk": { "risk_score": 46, "components": [ { "name": "proximity", "risk_score": 5 }, { "name": "threat_profile_phishing", "risk_score": 46 } ] }, "timestamp": "2023-11-21T12:15:50.130728Z" }進階行銷/追蹤架構
{ "domain": "analytics-tracker-sample.com", "google_analytics": { "value": "UA-000000-0" }, "ga4": [ { "value": "G-YYYYYYYYYX" } ], "gtm_codes": [ { "value": "GTM-YYYX" } ], "fb_codes": [ { "value": "1234567890" } ], "baidu_codes": [ { "value": "hash_masked_value" } ], "yandex_codes": [ { "value": "98765432" } ], "matomo_codes": [ { "value": "https://analytics.internal-sanitized.net/" } ] }已標記及監控的結構定義
{ "domain": "monitored-threat.net", "monitor_domain": true, "monitoring_domain_list_name": "Watchlist_Alpha", "tags": [ { "label": "Sanitized_Tag", "scope": "group", "tagged_at": "2020-12-02T13:33:40Z" } ], "registrar": { "value": "Safe-Registrar LLC" } }高風險 SSL 和網頁回應結構定義
{ "domain": "high-risk-malware.org", "domain_risk": { "risk_score": 100, "components": [ { "name": "threat_profile_malware", "risk_score": 95 } ] }, "ssl_info": [ { "hash": { "value": "sha1_masked_hash_sequence" }, "common_name": { "value": "www.sanitized-cert.com" }, "issuer_common_name": { "value": "Sanitized CA" }, "not_after": { "value": 20251231 } } ], "website_response": 200, "server_type": "Sanitized-Server-v1.0", "website_title": "Sanitized Landing Page" }
UDM 對應表
| 記錄欄位 | UDM 對應 | 邏輯 |
|---|---|---|
| 有效 | principal.domain.status | 直接從原始記錄中的有效欄位對應。 |
| additional_whois_email.[].value | about.labels.additional_whois_email | 從 additional_whois_email 陣列擷取,並新增為 about 物件中的標籤。 |
| adsense.value | about.labels.adsense | 從 adsense.value 擷取,並在 about 物件中新增為標籤。 |
| admin_contact.city.value | principal.domain.admin.office_address.city | 直接從原始記錄中的 admin_contact.city.value 欄位對應。 |
| admin_contact.country.value | principal.domain.admin.office_address.country_or_region | 直接從原始記錄中的 admin_contact.country.value 欄位對應。 |
| admin_contact.email.[].value | principal.domain.admin.email_addresses | 從 admin_contact.email 陣列擷取,並新增至 email_addresses 欄位。 |
| admin_contact.fax.value | principal.domain.admin.attribute.labels.fax | 從 admin_contact.fax.value 擷取,並在 admin 屬性中新增為標籤,鍵為「fax」。 |
| admin_contact.name.value | principal.domain.admin.user_display_name | 直接從原始記錄中的 admin_contact.name.value 欄位對應。 |
| admin_contact.org.value | principal.domain.admin.company_name | 直接從原始記錄中的 admin_contact.org.value 欄位對應。 |
| admin_contact.phone.value | principal.domain.admin.phone_numbers | 直接從原始記錄中的 admin_contact.phone.value 欄位對應。 |
| admin_contact.postal.value | principal.domain.admin.attribute.labels.postal | 從 admin_contact.postal.value 擷取,並在管理員屬性中新增為標籤,鍵為「postal」。 |
| admin_contact.state.value | principal.domain.admin.office_address.state | 直接從原始記錄中的 admin_contact.state.value 欄位對應。 |
| admin_contact.street.value | principal.domain.admin.office_address.name | 直接從原始記錄中的 admin_contact.street.value 欄位對應。 |
| Alexa | about.labels.alexa | 直接從原始記錄中的 alexa 欄位對應,並以標籤形式新增至 about 物件。 |
| baidu_codes.[].value | about.labels.baidu_codes | 從 baidu_codes 陣列擷取,並以標籤形式新增至 about 物件。 |
| billing_contact.city.value | principal.domain.billing.office_address.city | 直接從原始記錄中的 billing_contact.city.value 欄位對應。 |
| billing_contact.country.value | principal.domain.billing.office_address.country_or_region | 直接從原始記錄中的 billing_contact.country.value 欄位對應。 |
| billing_contact.email.[].value | principal.domain.billing.email_addresses | 從 billing_contact.email 陣列擷取,並新增至 email_addresses 欄位。 |
| billing_contact.fax.value | principal.domain.billing.attribute.labels.fax | 從 billing_contact.fax.value 擷取,並在帳單屬性中新增為索引鍵為「fax」的標籤。 |
| billing_contact.name.value | principal.domain.billing.user_display_name | 直接從原始記錄中的 billing_contact.name.value 欄位對應。 |
| billing_contact.org.value | principal.domain.billing.company_name | 直接從原始記錄中的 billing_contact.org.value 欄位對應。 |
| billing_contact.phone.value | principal.domain.billing.phone_numbers | 直接從原始記錄中的 billing_contact.phone.value 欄位對應。 |
| billing_contact.postal.value | principal.domain.billing.attribute.labels.postal | 從 billing_contact.postal.value 擷取,並在帳單屬性中以「postal」做為鍵新增為標籤。 |
| billing_contact.state.value | principal.domain.billing.office_address.state | 直接從原始記錄中的 billing_contact.state.value 欄位對應。 |
| billing_contact.street.value | principal.domain.billing.office_address.name | 直接從原始記錄中的 billing_contact.street.value 欄位對應。 |
| create_date.value | principal.domain.creation_time | 從原始記錄的 create_date.value 欄位轉換為時間戳記格式。 |
| data_updated_timestamp | principal.domain.audit_update_time | 從原始記錄中的 data_updated_timestamp 欄位轉換為時間戳記格式。 |
| 網域 | principal.hostname | 直接從原始記錄中的網域欄位對應。 |
| domain_risk.components.[].evidence | security_result.detection_fields.evidence | 從 domain_risk.components.[].evidence 陣列擷取,並在 security_result 物件中新增為偵測欄位,金鑰為「evidence」。 |
| domain_risk.components.[].name | security_result.category_details | 直接從原始記錄中的 domain_risk.components.[].name 欄位對應。 |
| domain_risk.components.[].risk_score | security_result.risk_score | 直接從原始記錄中的 domain_risk.components.[].risk_score 欄位對應。 |
| domain_risk.components.[].threats | security_result.threat_name | domain_risk.components.[].threats 陣列的第一個元素會對應至 security_result.threat_name。 |
| domain_risk.components.[].threats | security_result.detection_fields.threats | domain_risk.components.[].threats 陣列的其餘元素會新增為偵測欄位,且 security_result 物件中的鍵為「threats」。 |
| domain_risk.risk_score | security_result.risk_score | 直接對應原始記錄中的 domain_risk.risk_score 欄位。 |
| email_domain.[].value | about.labels.email_domain | 從 email_domain 陣列擷取,並新增為 about 物件中的標籤。 |
| expiration_date.value | principal.domain.expiration_time | 從原始記錄的 expiration_date.value 欄位轉換為時間戳記格式。 |
| fb_codes.[].value | about.labels.fb_codes | 從 fb_codes 陣列擷取,並新增為 about 物件中的標籤。 |
| first_seen.value | principal.domain.first_seen_time | 從原始記錄檔的 first_seen.value 欄位轉換為時間戳記格式。 |
| ga4.[].value | about.labels.ga4 | 從 ga4 陣列擷取,並在 about 物件中新增為標籤。 |
| google_analytics.value | about.labels.google_analytics | 從 google_analytics.value 擷取,並以標籤形式新增至 about 物件。 |
| gtm_codes.[].value | about.labels.gtm_codes | 從 gtm_codes 陣列擷取,並新增為 about 物件中的標籤。 |
| hotjar_codes.[].value | about.labels.hotjar_codes | 從 hotjar_codes 陣列擷取,並新增為 about 物件中的標籤。 |
| ip.[].address.value | principal.ip | ip 陣列的第一個元素會對應至 principal.ip。 |
| ip.[].address.value | about.labels.ip_address | ip 陣列的其餘元素會以「about」物件中的「ip_address」鍵新增為標籤。 |
| ip.[].asn.[].value | network.asn | 第一個 ip.asn 陣列的第一個元素會對應至 network.asn。 |
| ip.[].asn.[].value | about.labels.asn | ip.asn 陣列的其餘元素會以「asn」鍵的形式,新增為 about 物件中的標籤。 |
| ip.[].country_code.value | principal.location.country_or_region | ip 陣列中第一個元素的 country_code.value 會對應至 principal.location.country_or_region。 |
| ip.[].country_code.value | about.location.country_or_region | ip 陣列中其餘元素的 country_code.value 會對應至 about.location.country_or_region。 |
| ip.[].isp.value | principal.labels.isp | ip 陣列中第一個元素的 isp.value 會對應至 principal.labels.isp。 |
| ip.[].isp.value | about.labels.isp | ip 陣列中其餘元素的 isp.value 會對應至 about.labels.isp。 |
| matomo_codes.[].value | about.labels.matomo_codes | 從 matomo_codes 陣列擷取,並新增為 about 物件中的標籤。 |
| monitor_domain | about.labels.monitor_domain | 直接從原始記錄中的 monitor_domain 欄位對應,並新增為 about 物件中的標籤。 |
| monitoring_domain_list_name | about.labels.monitoring_domain_list_name | 直接從原始記錄中的 monitoring_domain_list_name 欄位對應,並以標籤形式新增至 about 物件。 |
| mx.[].domain.value | about.domain.name | 直接從原始記錄中的 mx.[].domain.value 欄位對應。 |
| mx.[].host.value | about.hostname | 直接從原始記錄中的 mx.[].host.value 欄位對應。 |
| mx.[].ip.[].value | about.ip | 從 mx.[].ip 陣列擷取,並新增至 ip 欄位。 |
| mx.[].priority | about.security_result.priority_details | 直接從原始記錄中的 mx.[].priority 欄位對應。 |
| name_server.[].domain.value | about.labels.name_server_domain | 從 name_server.[].domain.value 擷取,並在 about 物件中新增為標籤,鍵為「name_server_domain」。 |
| name_server.[].host.value | principal.domain.name_server | 從 name_server.[].host.value 擷取,並新增至 name_server 欄位。 |
| name_server.[].host.value | about.domain.name_server | 從 name_server.[].host.value 擷取,並新增至 name_server 欄位。 |
| name_server.[].ip.[].value | about.labels.ip | 從 name_server.[].ip 陣列擷取,並在 about 物件中新增為含有「ip」鍵的標籤。 |
| popularity_rank | about.labels.popularity_rank | 直接從原始記錄中的 popularity_rank 欄位對應,並以標籤形式新增至 about 物件。 |
| redirect.value | about.labels.redirect | 從 redirect.value 擷取,並在 about 物件中新增為標籤。 |
| redirect_domain.value | about.labels.redirect_domain | 從 redirect_domain.value 擷取,並新增為 about 物件中的標籤。 |
| registrant_contact.city.value | principal.domain.registrant.office_address.city | 直接從原始記錄中的 registrant_contact.city.value 欄位對應。 |
| registrant_contact.country.value | principal.domain.registrant.office_address.country_or_region | 直接從原始記錄中的 registrant_contact.country.value 欄位對應。 |
| registrant_contact.email.[].value | principal.domain.registrant.email_addresses | 從 registrant_contact.email 陣列擷取,並新增至 email_addresses 欄位。 |
| registrant_contact.fax.value | principal.domain.registrant.attribute.labels.fax | 從 registrant_contact.fax.value 擷取,並在註冊人屬性中新增為標籤,鍵為「fax」。 |
| registrant_contact.name.value | principal.domain.registrant.user_display_name | 直接從原始記錄中的 registrant_contact.name.value 欄位對應。 |
| registrant_contact.org.value | principal.domain.registrant.company_name | 直接從原始記錄中的 registrant_contact.org.value 欄位對應。 |
| registrant_contact.phone.value | principal.domain.registrant.phone_numbers | 直接從原始記錄中的 registrant_contact.phone.value 欄位對應。 |
| registrant_contact.postal.value | principal.domain.registrant.attribute.labels.postal | 從 registrant_contact.postal.value 擷取,並以「postal」鍵新增為註冊者屬性中的標籤。 |
| registrant_contact.state.value | principal.domain.registrant.office_address.state | 直接從原始記錄中的 registrant_contact.state.value 欄位對應。 |
| registrant_contact.street.value | principal.domain.registrant.office_address.name | 直接從原始記錄中的 registrant_contact.street.value 欄位對應。 |
| registrant_name.value | about.labels.registrant_name | 從 registrant_name.value 擷取,並新增為 about 物件中的標籤。 |
| registrant_org.value | about.labels.registrant_org | 從 registrant_org.value 擷取,並新增為 about 物件中的標籤。 |
| registrar.value | principal.domain.registrar | 直接從原始記錄中的 registrar.value 欄位對應。 |
| registrar_status | about.labels.registrar_status | 從 registrar_status 陣列擷取,並以標籤形式新增至 about 物件。 |
| server_type | network.tls.client.server_name | 直接從原始記錄中的 server_type 欄位對應。 |
| soa_email.[].value | principal.user.email_addresses | 從 soa_email 陣列擷取,並新增至 email_addresses 欄位。 |
| spf_info | about.labels.spf_info | 直接從原始記錄中的 spf_info 欄位對應,並新增為 about 物件中的標籤。 |
| ssl_email.[].value | about.labels.ssl_email | 從 ssl_email 陣列擷取,並新增為 about 物件中的標籤。 |
| ssl_info.[].alt_names.[].value | about.labels.alt_names | 從 ssl_info.[].alt_names 陣列擷取,並以標籤形式新增至 about 物件。 |
| ssl_info.[].common_name.value | about.labels.common_name | 從 ssl_info.[].common_name.value 擷取,並以標籤形式新增至 about 物件。 |
| ssl_info.[].duration.value | about.labels.duration | 從 ssl_info.[].duration.value 擷取,並以標籤形式新增至 about 物件。 |
| ssl_info.[].email.[].value | about.labels.ssl_info_email | 從 ssl_info.[].email 陣列擷取,並在 about 物件中以「ssl_info_email」鍵新增為標籤。 |
| ssl_info.[].hash.value | network.tls.server.certificate.sha1 | ssl_info 陣列中第一個元素的 hash.value 會對應至 network.tls.server.certificate.sha1。 |
| ssl_info.[].hash.value | about.labels.hash | ssl_info 陣列中其餘元素的 hash.value 會對應至 about.labels.hash。 |
| ssl_info.[].issuer_common_name.value | network.tls.server.certificate.issuer | ssl_info 陣列中第一個元素的 issuer_common_name.value 會對應至 network.tls.server.certificate.issuer。 |
| ssl_info.[].issuer_common_name.value | about.labels.issuer_common_name | ssl_info 陣列中其餘元素的 issuer_common_name.value 會對應至 about.labels.issuer_common_name。 |
| ssl_info.[].not_after.value | network.tls.server.certificate.not_after | ssl_info 陣列中第一個元素的 not_after.value 會轉換為時間戳記格式,並對應至 network.tls.server.certificate.not_after。 |
| ssl_info.[].not_after.value | about.labels.not_after | ssl_info 陣列中其餘元素的 not_after.value 會對應至 about.labels.not_after。 |
| ssl_info.[].not_before.value | network.tls.server.certificate.not_before | ssl_info 陣列中第一個元素的 not_before.value 會轉換為時間戳記格式,並對應至 network.tls.server.certificate.not_before。 |
| ssl_info.[].not_before.value | about.labels.not_before | ssl_info 陣列中其餘元素 not_before.value 會對應至 about.labels.not_before。 |
| ssl_info.[].organization.value | network.organization_name | ssl_info 陣列中第一個元素的 organization.value 會對應至 network.organization_name。 |
| ssl_info.[].organization.value | about.labels.organization | ssl_info 陣列中其餘元素的 organization.value 會對應至 about.labels.organization。 |
| ssl_info.[].subject.value | about.labels.subject | 從 ssl_info.[].subject.value 擷取,並以標籤形式新增至 about 物件。 |
| statcounter_project_codes.[].value | about.labels.statcounter_project_codes | 從 statcounter_project_codes 陣列擷取,並以標籤形式新增至 about 物件。 |
| statcounter_security_codes.[].value | about.labels.statcounter_security_codes | 從 statcounter_security_codes 陣列擷取,並以標籤形式新增至 about 物件。 |
| tags.[].label | about.file.tags | 從 tags.[].label 擷取並新增至 tags 欄位。 |
| tags.[].scope | security_result.detection_fields.scope | 從 tags.[].scope 擷取,並在 security_result 物件中新增為偵測欄位,金鑰為「scope」。 |
| tags.[].tagged_at | security_result.detection_fields.tagged_at | 從標記中擷取。[].tagged_at,並在 security_result 物件中新增為偵測欄位,金鑰為「tagged_at」。 |
| technical_contact.city.value | principal.domain.tech.office_address.city | 直接對應至原始記錄中的 technical_contact.city.value 欄位。 |
| technical_contact.country.value | principal.domain.tech.office_address.country_or_region | 直接對應原始記錄中的 technical_contact.country.value 欄位。 |
| technical_contact.email.[].value | principal.domain.tech.email_addresses | 從 technical_contact.email 陣列擷取,並新增至 email_addresses 欄位。 |
| technical_contact.fax.value | principal.domain.tech.attribute.labels.fax | 從 technical_contact.fax.value 擷取,並在技術屬性中以「fax」鍵新增為標籤。 |
| technical_contact.name.value | principal.domain.tech.user_display_name | 直接從原始記錄中的 technical_contact.name.value 欄位對應。 |
| technical_contact.org.value | principal.domain.tech.company_name | 直接對應至原始記錄中的 technical_contact.org.value 欄位。 |
| technical_contact.phone.value | principal.domain.tech.phone_numbers | 直接從原始記錄中的 technical_contact.phone.value 欄位對應。 |
| technical_contact.postal.value | principal.domain.tech.attribute.labels.postal | 從 technical_contact.postal.value 擷取,並在技術屬性中新增為鍵為「postal」的標籤。 |
| technical_contact.state.value | principal.domain.tech.office_address.state | 直接從原始記錄中的 technical_contact.state.value 欄位對應。 |
| technical_contact.street.value | principal.domain.tech.office_address.name | 直接對應於原始記錄中的 technical_contact.street.value 欄位。 |
| tld | about.labels.tld | 直接從原始記錄中的 tld 欄位對應,並新增為 about 物件中的標籤。 |
| 時間戳記 | about.labels.timestamp | 直接從原始記錄中的時間戳記欄位對應,並以標籤形式新增至 about 物件。 |
| website_response | principal.network.http.response_code | 直接從原始記錄中的 website_response 欄位對應。 |
| website_title | about.labels.website_title | 直接從原始記錄中的 website_title 欄位對應,並以標籤形式新增至 about 物件。 |
| whois_url | principal.domain.whois_server | 直接從原始記錄中的 whois_url 欄位對應。 |
| yandex_codes.[].value | about.labels.yandex_codes | 從 yandex_codes 陣列擷取,並新增為 about 物件中的標籤。 |
| edr.client.hostname | 設為網域欄位的值。 | |
| edr.client.ip_addresses | 設為 ip 陣列中第一個元素的值,具體來說是 ip.[0].address.value。 | |
| edr.raw_event_name | 如果 principal.hostname 存在,則設為「STATUS_UPDATE」,否則設為「GENERIC_EVENT」。 | |
| metadata.event_timestamp | 從原始記錄的頂層 create_time 欄位複製。 | |
| metadata.event_type | 如果 principal.hostname 存在,則設為「STATUS_UPDATE」,否則設為「GENERIC_EVENT」。 | |
| metadata.log_type | 設為「DOMAINTOOLS_THREATINTEL」。 | |
| metadata.product_name | 設為「DOMAINTOOLS」。 | |
| metadata.vendor_name | 設為「DOMAINTOOLS」。 |
變更記錄
還有其他問題嗎?向社群成員和 Google SecOps 專業人員尋求答案。