收集 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 網路服務
具備下列最低權限的內部 OnGuard 使用者帳戶:
- 系統權限:在「存取控管硬體」下方,對「存取面板」、「讀卡機」和「警報面板」具備「查詢」權限
- 系統權限:在「存取控管」下方,對「區隔」具備「查詢」權限
- 監控權限:在「控制」下方,「開門」和「繼電器和讀卡機輸出」
從中介軟體主機到 OnGuard 伺服器的網路連線 (TCP 通訊埠
8080,預設 OpenAccess 通訊埠)從中介軟體主機連線至網際網路 (連線至 Google SecOps Webhook 端點)
中介軟體主機上已安裝 Python 3.8 以上版本
存取 Google Cloud 控制台 (用於建立 API 金鑰)
在 Google SecOps 中建立 Webhook 動態饋給
建立動態饋給
- 依序前往 「SIEM 設定」 > 「動態饋給」。
- 按一下「新增動態饋給」。
- 在下一頁,點按「設定單一動態饋給」。
- 在「Feed name」(動態饋給名稱) 欄位中,輸入動態饋給名稱 (例如
LenelS2 OnGuard Events)。 - 「Source type」(來源類型) 請選取「Webhook」。
- 在「Log type」(記錄類型) 中選取「Lenel OnGuard」。
- 點選「下一步」。
- 指定下列輸入參數的值:
- 分割分隔符號:輸入
\n(換行分隔符號,因為中介軟體會以 NDJSON 格式傳送事件) - 資產命名空間:資產命名空間
- 擷取標籤:要套用至這個動態饋給事件的標籤
- 分割分隔符號:輸入
- 點選「下一步」。
- 在「Finalize」(完成) 畫面中檢查新的新聞動態消息設定,然後按一下「Submit」(提交)。
產生並儲存密鑰
建立動態饋給後,您必須產生用於驗證的密鑰:
- 在動態饋給詳細資料頁面中,按一下「產生密鑰」。
- 對話方塊會顯示密鑰。
- 複製並妥善儲存密鑰。
取得動態饋給端點網址
- 前往動態饋給的「詳細資料」分頁。
- 在「端點資訊」部分,複製「動態消息端點網址」。
網址格式如下:
https://{region}-chronicle.googleapis.com/v1/{parent}/logs:import其中
{region}是 Google SecOps 執行個體的區域 (例如us、europe或asia-southeast1),{parent}是資源路徑,格式為projects/<PROJECT_ID>/locations/<LOCATION>/instances/<INSTANCE_ID>/logTypes/<LOG_TYPE>。請儲存這個網址,以便進行後續步驟。
按一下「完成」。
建立 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 金鑰」欄位複製 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 訊息代理工具 (RabbitMQ)
- 如有任何服務停止,請在該服務上按一下滑鼠右鍵,然後選取「Start」。
確認可存取 OpenAccess API
- 在中介軟體主機上開啟網路瀏覽器。
前往以下網址:
https://<ONGUARD_SERVER>:8080/api/access/onguard/openaccess/version?version=1.0將
<ONGUARD_SERVER>替換為 OnGuard 伺服器的 IP 位址或主機名稱。API 會傳回 JSON 回應,其中包含 OpenAccess 版本詳細資料,確認服務可供存取。
擷取驗證目錄
傳送 GET 要求,擷取可用的驗證目錄:
https://<ONGUARD_SERVER>:8080/api/access/onguard/openaccess/directories?version=1.0回應會包含目錄清單。記下要用於驗證的目錄 (通常是內部 OnGuard 目錄) 的
ID和Name。
驗證 OnGuard 使用者帳戶
- 在 OnGuard 伺服器上開啟 OnGuard System Administration 應用程式。
- 依序前往「管理」 > 「使用者」。
- 選取指定用於 API 存取權的使用者帳戶。
- 按一下「Permissions」(權限) 分頁標籤。
- 在「System Permission Group」下方,確認已啟用下列權限:
- 在「Access control hardware」下方:查詢「Access Panels」、「Readers」和「Alarm Panels」
- 在「存取控管」下方:查詢「區隔」
- 在「Monitor Permission Group」下方,確認已啟用下列權限:
- 在「控制」下方:點選「開門」。
- 在「控制」下方:繼電器和讀卡機輸出
取得應用程式 ID
使用 OpenAccess API 的每個應用程式都必須有專屬的應用程式 ID。這是您定義的字串值 (例如 ChronicleForwarder)。應用程式 ID 會在每個 API 要求中,以 Application-Id HTTP 標頭的形式傳送。
設定 OnGuard 到 Chronicle 的中介軟體
由於 OnGuard 原生不支援外送 Webhook 或 HTTP POST 傳送,因此需要中介軟體指令碼輪詢 OpenAccess REST API 的記錄事件,並將這些事件轉送至 Google SecOps Webhook 端點。
建構 Chronicle Webhook 網址
合併 Chronicle 端點網址和 API 金鑰:
<ENDPOINT_URL>?key=<API_KEY>範例:
https://{region}-chronicle.googleapis.com/v1/{parent}/logs:import?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 Webhook 動態饋給支援多種驗證方式。請選擇供應商支援的方法。
方法 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 金鑰和密鑰不會顯示在網址中 - 更加安全 (標頭不會記錄在網路伺服器存取記錄中) - 供應商支援時的首選方法
方法 2:查詢參數
如果供應商不支援自訂標頭,請在網址中附加憑證。
網址格式:
<ENDPOINT_URL>?key=<API_KEY>&secret=<SECRET_KEY>範例:
https://{region}-chronicle.googleapis.com/v1/{parent}/logs:import?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 金鑰,並在標頭中使用 Secret 金鑰。
要求格式:
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 專家尋求解答。