收集 LenelS2 OnGuard 記錄
本文說明如何從 LenelS2 (Honeywell) OnGuard 收集記錄,並使用 Webhook 饋給將記錄轉送至 Google Security Operations。由於 OnGuard 本身不支援直接傳送 Webhook 或 HTTP POST,本指南會使用自訂中介軟體指令碼輪詢 OnGuard OpenAccess REST API 的事件,並將這些事件轉送至 Google SecOps Webhook 擷取端點。
LenelS2 OnGuard 是實體存取控管和識別證管理系統,可管理企業設施的持卡人、憑證、讀卡機、面板和存取事件。OpenAccess REST API 可提供 OnGuard 資料的程式輔助存取權,包括存取權授予、存取權遭拒、門保持開啟、門遭強行開啟和警報事件等記錄事件。
事前準備
請確認您已完成下列事前準備事項:
- Google SecOps 執行個體
- 已啟用 OpenAccess 授權的 OnGuard 伺服器 (7.5 以上版本)
在 OpenAccess 伺服器上執行的 OnGuard 服務如下:
- LS Communication Server
- LS 事件內容供應商
- LS Web Event Bridge
- LS OpenAccess
- LS Web Service
具備下列最低權限的內部 OnGuard 使用者帳戶:
- 系統權限:在「門禁系統設備」下方,對「門禁面板」、「讀卡機」和「警報面板」授予「查詢」權限
- 系統權限:在「存取控管」下方,對「區隔」授予「查詢」權限
- 監控權限:在「控制」下方,選取「開門」和「繼電器和讀取器輸出」
從中介軟體主機到 OnGuard 伺服器的網路連線 (TCP 通訊埠
8080,預設 OpenAccess 通訊埠)從中介軟體主機到網際網路的網路連線 (可連線至 Google SecOps Webhook 端點)
中介軟體主機上安裝的 Python 3.8 以上版本
存取 Google Cloud 控制台 (用於建立 API 金鑰)
在 Google SecOps 中建立 Webhook 動態饋給
建立動態饋給
- 依序前往「SIEM 設定」>「動態饋給」。
- 按一下「新增動態消息」。
- 在下一個頁面中,按一下「設定單一動態饋給」。
- 在「動態饋給名稱」欄位中輸入動態饋給名稱 (例如
LenelS2 OnGuard Events)。 - 選取「Webhook」做為「來源類型」。
- 選取「Lenel OnGuard」做為「記錄類型」。
- 點選「下一步」。
- 指定下列輸入參數的值:
- 分割分隔符號:輸入
\n(換行分隔符號,因為中介軟體會以 NDJSON 格式傳送事件) - 資產命名空間:資產命名空間
- 擷取標籤:要套用至這個動態饋給事件的標籤
- 分割分隔符號:輸入
- 點選「下一步」。
- 在「Finalize」(完成) 畫面中檢查新的動態饋給設定,然後按一下「Submit」(提交)。
產生並儲存密鑰
建立動態饋給後,您必須產生驗證用的密鑰:
- 在動態饋給詳細資料頁面中,按一下「產生密鑰」。
- 對話方塊會顯示密鑰。
- 複製並妥善儲存密鑰。
取得動態消息端點網址
- 前往動態消息的「詳細資料」分頁。
- 在「端點資訊」部分,複製「動態消息端點網址」。
網址格式為:
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate或
https://<REGION>-malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate請儲存這個網址,以供後續步驟使用。
按一下 [完成]。
建立 Google Cloud API 金鑰
Chronicle 需要 API 金鑰才能進行驗證。在 Google Cloud 控制台中建立受限制的 API 金鑰。
建立 API 金鑰
- 前往 Google Cloud 控制台的「憑證」頁面。
- 選取專案 (與 Chronicle 執行個體相關聯的專案)。
- 依序按一下「建立憑證」>「API 金鑰」。
- 系統會建立 API 金鑰,並顯示在對話方塊中。
- 按一下「編輯 API 金鑰」即可限制金鑰。
限制 API 金鑰
- 在「API 金鑰」設定頁面中:
- 名稱:輸入描述性名稱 (例如
Chronicle Webhook API Key)
- 名稱:輸入描述性名稱 (例如
- 在「API 限制」下方:
- 選取「Restrict key」(限制金鑰)。
- 在「選取 API」下拉式選單中,搜尋並選取「Google SecOps API」 (或「Chronicle API」)。
- 按一下 [儲存]。
- 從頁面頂端的「API key」(API 金鑰) 欄位複製 API 金鑰值。
- 安全地儲存 API 金鑰。
確認 OnGuard OpenAccess 的必要條件
設定中介軟體前,請先確認 OnGuard OpenAccess API 運作正常。
確認 OpenAccess 服務是否正在執行
- 在 OnGuard 伺服器上,開啟 Windows 服務 (
services.msc)。 - 確認下列服務正在執行:
- LS OpenAccess
- LS Communication Server
- LS Event Context Provider
- LS Web Event Bridge
- LS Web Service
- LS Message Broker (RabbitMQ)
- 如果任何服務已停止,請在服務上按一下滑鼠右鍵,然後選取「啟動」。
確認可存取 OpenAccess API
- 在中間件主機上開啟網路瀏覽器。
前往以下網址:
https://<ONGUARD_SERVER>:8080/api/access/onguard/openaccess/version?version=1.0將
<ONGUARD_SERVER>替換為 OnGuard 伺服器的 IP 位址或主機名稱。API 會傳回包含 OpenAccess 版本詳細資料的 JSON 回應,確認服務可供存取。
擷取驗證目錄
傳送 GET 要求,擷取可用的驗證目錄:
https://<ONGUARD_SERVER>:8080/api/access/onguard/openaccess/directories?version=1.0回覆會包含目錄清單。記下用於驗證的目錄 (通常是內部 OnGuard 目錄) 的
ID和Name。
驗證 OnGuard 使用者帳戶
- 在 OnGuard 伺服器上開啟「OnGuard System Administration」應用程式。
- 依序前往「管理」>「使用者」。
- 選取指定用於 API 存取權的使用者帳戶。
- 按一下「Permissions」(權限) 分頁標籤。
- 在「系統權限群組」下方,確認下列權限已啟用:
- 在「門禁控制硬體」下方:查詢「門禁面板」、「讀卡機」和「警報面板」
- 在「存取控管」下方:對「區隔」執行「查詢」
- 在「監控權限群組」下方,確認下列權限已啟用:
- 在「控制」下方:輕觸「開門」。
- 在「控制」下方:轉送和讀取器輸出
取得應用程式 ID
使用 OpenAccess API 的每個應用程式都必須有專屬的應用程式 ID。這是您定義的字串值 (例如 ChronicleForwarder)。應用程式 ID 會以 Application-Id HTTP 標頭的形式,隨每個 API 要求傳送。
設定 OnGuard 到 Chronicle 的中介軟體
由於 OnGuard 本身不支援外送 Webhook 或 HTTP POST 傳送,因此需要中介軟體指令碼輪詢 OpenAccess REST API 的記錄事件,並將這些事件轉送至 Google SecOps Webhook 端點。
建構 Chronicle Webhook 網址
合併 Chronicle 端點網址和 API 金鑰:
<ENDPOINT_URL>?key=<API_KEY>範例:
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate?key=AIzaSyD...
建立中介軟體指令碼
在中間件主機上,為指令碼建立目錄:
mkdir -p /opt/onguard-chronicle-forwarder cd /opt/onguard-chronicle-forwarder安裝必要的 Python 套件:
pip3 install requests建立轉送程式指令碼:
nano onguard_to_chronicle.py在指令碼中新增下列內容:
#!/usr/bin/env python3 """LenelS2 OnGuard to Google SecOps (Chronicle) Event Forwarder. Polls the OnGuard OpenAccess REST API for logged events and forwards them to a Chronicle webhook ingestion endpoint. """ import json import logging import os import sys import time from datetime import datetime, timedelta, timezone import requests import urllib3 # Suppress SSL warnings if using self-signed certificates urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) # ── Configuration ────────────────────────────────────────────────── ONGUARD_HOST = os.environ.get("ONGUARD_HOST", "192.168.1.100") ONGUARD_PORT = os.environ.get("ONGUARD_PORT", "8080") ONGUARD_USERNAME = os.environ.get("ONGUARD_USERNAME", "") ONGUARD_PASSWORD = os.environ.get("ONGUARD_PASSWORD", "") ONGUARD_DIRECTORY_ID = os.environ.get("ONGUARD_DIRECTORY_ID", "") APPLICATION_ID = os.environ.get("APPLICATION_ID", "ChronicleForwarder") VERIFY_SSL = os.environ.get("VERIFY_SSL", "false").lower() == "true" CHRONICLE_ENDPOINT = os.environ.get("CHRONICLE_ENDPOINT", "") CHRONICLE_API_KEY = os.environ.get("CHRONICLE_API_KEY", "") CHRONICLE_SECRET_KEY = os.environ.get("CHRONICLE_SECRET_KEY", "") POLL_INTERVAL_SECONDS = int(os.environ.get("POLL_INTERVAL_SECONDS", "30")) PAGE_SIZE = int(os.environ.get("PAGE_SIZE", "100")) LOOKBACK_MINUTES = int(os.environ.get("LOOKBACK_MINUTES", "5")) # ── Logging ──────────────────────────────────────────────────────── logging.basicConfig( level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s", handlers=[ logging.StreamHandler(sys.stdout), logging.FileHandler("/opt/onguard-chronicle-forwarder/forwarder.log"), ], ) logger = logging.getLogger(__name__) BASE_URL = f"https://{ONGUARD_HOST}:{ONGUARD_PORT}/api/access/onguard/openaccess" class OnGuardClient: """Client for the OnGuard OpenAccess REST API.""" def __init__(self): self.session_token = None self.headers = { "Content-Type": "application/json", "Application-Id": APPLICATION_ID, } def authenticate(self): """Authenticate to OpenAccess and obtain a session token.""" url = f"{BASE_URL}/authentication?version=1.0" payload = { "user_name": ONGUARD_USERNAME, "password": ONGUARD_PASSWORD, "directory_id": ONGUARD_DIRECTORY_ID, } try: resp = requests.post( url, headers=self.headers, json=payload, verify=VERIFY_SSL, timeout=30, ) resp.raise_for_status() data = resp.json() self.session_token = data.get("session_token") self.headers["Session-Token"] = self.session_token logger.info("Successfully authenticated to OnGuard OpenAccess.") except requests.exceptions.RequestException as exc: logger.error("Authentication failed: %s", exc) raise def keepalive(self): """Renew the session idle timeout.""" url = f"{BASE_URL}/keepalive?version=1.0" try: resp = requests.get( url, headers=self.headers, verify=VERIFY_SSL, timeout=15 ) resp.raise_for_status() except requests.exceptions.RequestException: logger.warning("Keepalive failed. Re-authenticating.") self.authenticate() def get_logged_events(self, start_time, page_number=1): """Retrieve a page of logged events since start_time.""" url = f"{BASE_URL}/logged_events?version=1.0" params = { "filter": f"timestamp >= '{start_time}'", "page_number": page_number, "page_size": PAGE_SIZE, "order_by": "timestamp", } try: resp = requests.get( url, headers=self.headers, params=params, verify=VERIFY_SSL, timeout=30, ) resp.raise_for_status() return resp.json() except requests.exceptions.RequestException as exc: logger.error("Failed to retrieve logged events: %s", exc) return None def logout(self): """Logout and invalidate the session token.""" url = f"{BASE_URL}/authentication?version=1.0" try: requests.delete( url, headers=self.headers, verify=VERIFY_SSL, timeout=15 ) logger.info("Logged out of OnGuard OpenAccess.") except requests.exceptions.RequestException: pass def send_to_chronicle(events): """Send a batch of events to the Chronicle webhook endpoint.""" if not events: return True url = f"{CHRONICLE_ENDPOINT}?key={CHRONICLE_API_KEY}" headers = { "Content-Type": "application/json", "x-chronicle-auth": CHRONICLE_SECRET_KEY, } # Send events as NDJSON (newline-delimited JSON) body = "\n".join(json.dumps(event) for event in events) try: resp = requests.post(url, headers=headers, data=body, timeout=30) resp.raise_for_status() logger.info("Sent %d events to Chronicle.", len(events)) return True except requests.exceptions.RequestException as exc: logger.error("Failed to send events to Chronicle: %s", exc) return False def main(): """Main polling loop.""" logger.info("Starting OnGuard-to-Chronicle forwarder.") client = OnGuardClient() client.authenticate() last_poll_time = datetime.now(timezone.utc) - timedelta(minutes=LOOKBACK_MINUTES) while True: try: current_time = datetime.now(timezone.utc) start_time_str = last_poll_time.strftime("%Y-%m-%dT%H:%M:%SZ") all_events = [] page = 1 while True: result = client.get_logged_events(start_time_str, page_number=page) if result is None: # Session may have expired; re-authenticate client.authenticate() result = client.get_logged_events( start_time_str, page_number=page ) if result is None: break events = result.get("logged_events", []) if not events: break all_events.extend(events) total = result.get("total_items", 0) if page * PAGE_SIZE >= total: break page += 1 if all_events: success = send_to_chronicle(all_events) if success: last_poll_time = current_time else: last_poll_time = current_time logger.debug("No new events found.") # Send keepalive to maintain session client.keepalive() except KeyboardInterrupt: logger.info("Shutting down.") client.logout() sys.exit(0) except Exception as exc: logger.error("Unexpected error: %s", exc) try: client.authenticate() except Exception: pass time.sleep(POLL_INTERVAL_SECONDS) if __name__ == "__main__": main()儲存並關閉檔案。
設定環境變數
為轉送器建立環境檔案:
nano /opt/onguard-chronicle-forwarder/.env新增下列設定值:
ONGUARD_HOST=<ONGUARD_SERVER_IP_OR_HOSTNAME> ONGUARD_PORT=8080 ONGUARD_USERNAME=<ONGUARD_API_USERNAME> ONGUARD_PASSWORD=<ONGUARD_API_PASSWORD> ONGUARD_DIRECTORY_ID=<DIRECTORY_ID> APPLICATION_ID=ChronicleForwarder VERIFY_SSL=false CHRONICLE_ENDPOINT=<CHRONICLE_WEBHOOK_ENDPOINT_URL> CHRONICLE_API_KEY=<GOOGLE_CLOUD_API_KEY> CHRONICLE_SECRET_KEY=<CHRONICLE_FEED_SECRET_KEY> POLL_INTERVAL_SECONDS=30 PAGE_SIZE=100 LOOKBACK_MINUTES=5- ONGUARD_HOST:執行 OpenAccess 服務的 OnGuard 伺服器 IP 位址或主機名稱 (例如
192.168.1.100) - ONGUARD_PORT:OpenAccess 服務監聽的通訊埠 (預設:
8080) - ONGUARD_USERNAME:OnGuard 內部使用者帳戶的使用者名稱
- ONGUARD_PASSWORD:OnGuard 使用者帳戶的密碼
- ONGUARD_DIRECTORY_ID:從
GET /directories端點擷取的目錄 ID - APPLICATION_ID:這個整合項目的專屬 ID (例如
ChronicleForwarder) - VERIFY_SSL:如果 OnGuard 伺服器使用受信任的 SSL 憑證,請設為
true;如果是自行簽署的憑證,請設為false - CHRONICLE_ENDPOINT:來自 Chronicle 動態消息設定的 Webhook 端點網址
- CHRONICLE_API_KEY:先前建立的 Google Cloud API 金鑰
- CHRONICLE_SECRET_KEY:建立 Chronicle 資訊提供時產生的密鑰
- POLL_INTERVAL_SECONDS:輪詢新事件的頻率 (以秒為單位,預設為
30) - PAGE_SIZE:每個 API 頁面要擷取的事件數量 (預設值:
100,上限:1000) - LOOKBACK_MINUTES:初始啟動時要擷取多少分鐘的歷史事件 (預設值:
5)
- ONGUARD_HOST:執行 OpenAccess 服務的 OnGuard 伺服器 IP 位址或主機名稱 (例如
保護環境檔案:
chmod 600 /opt/onguard-chronicle-forwarder/.env
以 systemd 服務形式安裝
建立 systemd 服務檔案:
sudo nano /etc/systemd/system/onguard-chronicle-forwarder.service新增下列內容:
[Unit] Description=LenelS2 OnGuard to Chronicle Event Forwarder After=network.target [Service] Type=simple User=root WorkingDirectory=/opt/onguard-chronicle-forwarder EnvironmentFile=/opt/onguard-chronicle-forwarder/.env ExecStart=/usr/bin/python3 /opt/onguard-chronicle-forwarder/onguard_to_chronicle.py Restart=always RestartSec=10 [Install] WantedBy=multi-user.target啟用並啟動服務:
sudo systemctl daemon-reload sudo systemctl enable onguard-chronicle-forwarder.service sudo systemctl start onguard-chronicle-forwarder.service確認服務正在執行:
sudo systemctl status onguard-chronicle-forwarder.service檢查轉送器記錄,確認作業是否成功:
tail -f /opt/onguard-chronicle-forwarder/forwarder.log啟動成功時會顯示:
Starting OnGuard-to-Chronicle forwarder. Successfully authenticated to OnGuard OpenAccess. Sent <N> events to Chronicle.
OpenAccess API 參考資料
中介軟體會使用下列 OnGuard OpenAccess REST API 端點。所有端點都與 https://<ONGUARD_SERVER>:8080/api/access/onguard/openaccess 相關。
驗證
| 方法 | 端點 | 說明 |
|---|---|---|
POST |
/authentication?version=1.0 |
登入並擷取工作階段符記 |
DELETE |
/authentication?version=1.0 |
登出並使工作階段符記失效 |
GET |
/directories?version=1.0 |
取得可用的驗證目錄 |
GET |
/keepalive?version=1.0 |
延長工作階段閒置逾時時間 |
所有已驗證要求都必須包含的 HTTP 標頭:
| 標頭 | 說明 |
|---|---|
Application-Id |
應用程式的專屬 ID 字串 (例如 ChronicleForwarder) |
Session-Token |
「POST /authentication」傳回的工作階段符記 |
Content-Type |
application/json |
活動
| 方法 | 端點 | 說明 |
|---|---|---|
GET |
/logged_events?version=1.0 |
擷取記錄事件頁面 |
POST |
/event_subscriptions?version=1.0 |
建立即時事件訂閱 |
GET |
/event_subscriptions?version=1.0 |
列出事件訂閱項目 |
事件類型
OnGuard 會產生下列類別的事件,並轉送至 Google SecOps:
- 存取權核准事件:讀取器接受刷卡
- 存取遭拒事件:徽章刷卡遭拒 (徽章無效、過期、存取層級錯誤)
- 門未關閉事件:門未在設定時間內關閉
- 門遭強行開啟事件:門在沒有有效識別證刷卡的情況下開啟
- 警報事件:觸發或確認警報輸入
- 狀態事件:面板上線/離線、通訊失敗、遭人竄改
- 持卡人事件:新增、修改或刪除持卡人
- 徽章事件:徽章已啟用、停用或遺失
- 訪客事件:訪客登入或登出
驗證方法參考資料
Chronicle 網頁掛鉤動態消息支援多種驗證方法。選擇供應商支援的方法。
方法 1:自訂標頭 (建議)
如果供應商支援自訂 HTTP 標頭,請使用這個方法,以提升安全性。
要求格式:
POST <ENDPOINT_URL> HTTP/1.1 Content-Type: application/json x-goog-chronicle-auth: <API_KEY> x-chronicle-auth: <SECRET_KEY> { "event": "data", "timestamp": "2025-01-15T10:30:00Z" }
優點: - API 金鑰和 Secret 不會顯示在網址中 - 更安全 (網路伺服器存取記錄不會記錄標頭) - 如果供應商支援,建議使用這個方法
方法 2:查詢參數
如果供應商不支援自訂標頭,請將憑證附加至網址。
網址格式:
<ENDPOINT_URL>?key=<API_KEY>&secret=<SECRET_KEY>範例:
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate?key=AIzaSyD...&secret=abcd1234...要求格式:
POST <ENDPOINT_URL>?key=<API_KEY>&secret=<SECRET_KEY> HTTP/1.1 Content-Type: application/json { "event": "data", "timestamp": "2025-01-15T10:30:00Z" }
缺點:
- 網址中顯示憑證
- 可能會記錄在網路伺服器存取記錄中
- 安全性不如標頭
方法 3:混合式 (網址 + 標頭)
部分設定會在網址中使用 API 金鑰,並在標頭中使用密鑰。
要求格式:
POST <ENDPOINT_URL>?key=<API_KEY> HTTP/1.1 Content-Type: application/json x-chronicle-auth: <SECRET_KEY> { "event": "data", "timestamp": "2025-01-15T10:30:00Z" }
驗證標頭名稱
Chronicle 接受下列驗證標頭名稱:
API 金鑰:
x-goog-chronicle-auth(建議)X-Goog-Chronicle-Auth(不區分大小寫)
密鑰:
x-chronicle-auth(建議)X-Chronicle-Auth(不區分大小寫)
疑難排解
OpenAccess API 連線失敗
如果中介軟體無法連線至 OpenAccess API,請按照下列步驟操作:
確認中介軟體主機可連線至 OnGuard 伺服器:
curl -k https://<ONGUARD_SERVER>:8080/api/access/onguard/openaccess/version?version=1.0確認 OnGuard 伺服器防火牆已開啟通訊埠
8080。在 OnGuard 伺服器上執行下列指令,確認通訊埠正在監聽:
netstat -anb | findstr 8080如果通訊埠未監聽,請重新啟動 LS OpenAccess 服務:
- 在 OnGuard 伺服器上開啟 Windows 服務 (
services.msc)。 - 在「LS OpenAccess」上按一下滑鼠右鍵,然後選取「重新啟動」。
- 在 OnGuard 伺服器上開啟 Windows 服務 (
驗證失敗
如果中介軟體收到驗證錯誤:
- 確認 OnGuard 使用者名稱和密碼正確無誤。
- 確認
ONGUARD_DIRECTORY_ID符合GET /directories傳回的有效目錄。 - 確認 OnGuard 使用者帳戶未因暴力破解防護機制而遭到鎖定。OnGuard 會在多次登入失敗後鎖定帳戶。
- 如果
openaccess.ini檔案位於C:\ProgramData\lnl\openaccess.ini,請確認設定是否正確。
Chronicle 未收到任何事件
如果中介軟體執行時沒有錯誤,但 Chronicle 中未顯示任何事件:
- 檢查「Alarm Monitoring」(警報監控) 應用程式,確認 OnGuard 是否產生事件。
確認 OnGuard 資料庫已啟用事件發布功能。在 OnGuard 資料庫伺服器上,執行下列 SQL 查詢:
SELECT * FROM LNL_SYSTEMSETTINGS WHERE SETTINGNAME = 'EventPublishingDisabled'- 如果結果為
0或沒有結果,表示已啟用事件發布功能。 - 如果結果為
1,表示事件發布功能已停用,必須重新啟用。
- 如果結果為
檢查
/opt/onguard-chronicle-forwarder/forwarder.log的轉送器記錄檔,查看錯誤訊息。確認
.env檔案中的 Chronicle Webhook 端點網址、API 金鑰和密鑰正確無誤。
要求集區已滿錯誤
如果中介軟體收到 OpenAccess 的 request pool full 錯誤:
- 在 OnGuard 伺服器上,建立或編輯
C:\ProgramData\Lnl\OpenAccess.ini檔案。 新增下列內容:
[http_request] request_pool_size=128重新啟動 LS OpenAccess 服務,變更才會生效。
Webhook 限制和最佳做法
要求限制
| 限制 | 值 |
|---|---|
| 要求大小上限 | 4 MB |
| 每秒查詢次數 (QPS) 上限 | 15,000 |
| 要求逾時 | 30 秒 |
| 重試行為 | 自動執行指數輪詢 |
UDM 對應表
| 原始記錄欄位 | UDM 對應 | 邏輯 |
|---|---|---|
timestamp |
metadata.event_timestamp |
直接從事件時間戳記對應 |
description |
metadata.description |
活動說明文字 |
event_type |
metadata.product_event_type |
OnGuard 事件類型 ID |
badge_id |
principal.user.product_object_id |
與活動相關的徽章編號 |
cardholder_first_name |
principal.user.first_name |
持卡人姓名 |
cardholder_last_name |
principal.user.last_name |
持卡人姓氏 |
device |
principal.asset.hostname |
讀者或面板名稱 |
source |
target.asset.hostname |
來源裝置或面板 |
serial_number |
principal.asset.hardware.serial_number |
面板序號 |
access_result |
security_result.action |
根據存取權是否獲准,選擇「允許」或「封鎖」 |
cardnumber", "device", "eid", "machine", "serialnum", and "site |
additional.fields |
從變更記錄對應 |
變更記錄
還有其他問題嗎?向社群成員和 Google SecOps 專業人員尋求答案。