收集 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 動態饋給

建立動態饋給

  1. 依序前往「SIEM 設定」>「動態饋給」
  2. 按一下「新增動態消息」
  3. 在下一個頁面中,按一下「設定單一動態饋給」
  4. 在「動態饋給名稱」欄位中輸入動態饋給名稱 (例如 LenelS2 OnGuard Events)。
  5. 選取「Webhook」做為「來源類型」
  6. 選取「Lenel OnGuard」做為「記錄類型」
  7. 點選「下一步」
  8. 指定下列輸入參數的值:
    • 分割分隔符號:輸入 \n (換行分隔符號,因為中介軟體會以 NDJSON 格式傳送事件)
    • 資產命名空間資產命名空間
    • 擷取標籤:要套用至這個動態饋給事件的標籤
  9. 點選「下一步」
  10. 在「Finalize」(完成) 畫面中檢查新的動態饋給設定,然後按一下「Submit」(提交)

產生並儲存密鑰

建立動態饋給後,您必須產生驗證用的密鑰:

  1. 在動態饋給詳細資料頁面中,按一下「產生密鑰」
  2. 對話方塊會顯示密鑰。
  3. 複製並妥善儲存密鑰。

取得動態消息端點網址

  1. 前往動態消息的「詳細資料」分頁。
  2. 在「端點資訊」部分,複製「動態消息端點網址」
  3. 網址格式為:

    https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate
    

    https://<REGION>-malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate
    
  4. 請儲存這個網址,以供後續步驟使用。

  5. 按一下 [完成]

建立 Google Cloud API 金鑰

Chronicle 需要 API 金鑰才能進行驗證。在 Google Cloud 控制台中建立受限制的 API 金鑰。

建立 API 金鑰

  1. 前往 Google Cloud 控制台的「憑證」頁面
  2. 選取專案 (與 Chronicle 執行個體相關聯的專案)。
  3. 依序按一下「建立憑證」>「API 金鑰」
  4. 系統會建立 API 金鑰,並顯示在對話方塊中。
  5. 按一下「編輯 API 金鑰」即可限制金鑰。

限制 API 金鑰

  1. 在「API 金鑰」設定頁面中:
    • 名稱:輸入描述性名稱 (例如 Chronicle Webhook API Key)
  2. 在「API 限制」下方:
    1. 選取「Restrict key」(限制金鑰)
    2. 在「選取 API」下拉式選單中,搜尋並選取「Google SecOps API」 (或「Chronicle API」)。
  3. 按一下 [儲存]
  4. 從頁面頂端的「API key」(API 金鑰) 欄位複製 API 金鑰值。
  5. 安全地儲存 API 金鑰。

確認 OnGuard OpenAccess 的必要條件

設定中介軟體前,請先確認 OnGuard OpenAccess API 運作正常。

確認 OpenAccess 服務是否正在執行

  1. 在 OnGuard 伺服器上,開啟 Windows 服務 (services.msc)。
  2. 確認下列服務正在執行:
    • LS OpenAccess
    • LS Communication Server
    • LS Event Context Provider
    • LS Web Event Bridge
    • LS Web Service
    • LS Message Broker (RabbitMQ)
  3. 如果任何服務已停止,請在服務上按一下滑鼠右鍵,然後選取「啟動」

確認可存取 OpenAccess API

  1. 在中間件主機上開啟網路瀏覽器。
  2. 前往以下網址:

    https://<ONGUARD_SERVER>:8080/api/access/onguard/openaccess/version?version=1.0
    
  3. <ONGUARD_SERVER> 替換為 OnGuard 伺服器的 IP 位址或主機名稱。

  4. API 會傳回包含 OpenAccess 版本詳細資料的 JSON 回應,確認服務可供存取。

擷取驗證目錄

  1. 傳送 GET 要求,擷取可用的驗證目錄:

    https://<ONGUARD_SERVER>:8080/api/access/onguard/openaccess/directories?version=1.0
    
  2. 回覆會包含目錄清單。記下用於驗證的目錄 (通常是內部 OnGuard 目錄) 的 IDName

驗證 OnGuard 使用者帳戶

  1. 在 OnGuard 伺服器上開啟「OnGuard System Administration」應用程式。
  2. 依序前往「管理」>「使用者」
  3. 選取指定用於 API 存取權的使用者帳戶。
  4. 按一下「Permissions」(權限) 分頁標籤。
  5. 在「系統權限群組」下方,確認下列權限已啟用:
    • 在「門禁控制硬體」下方:查詢「門禁面板」、「讀卡機」和「警報面板」
    • 在「存取控管」下方:對「區隔」執行「查詢」
  6. 在「監控權限群組」下方,確認下列權限已啟用:
    • 在「控制」下方:輕觸「開門」
    • 在「控制」下方:轉送和讀取器輸出

取得應用程式 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...
    

建立中介軟體指令碼

  1. 在中間件主機上,為指令碼建立目錄:

    mkdir -p /opt/onguard-chronicle-forwarder
    cd /opt/onguard-chronicle-forwarder
    
  2. 安裝必要的 Python 套件:

    pip3 install requests
    
  3. 建立轉送程式指令碼:

    nano onguard_to_chronicle.py
    
  4. 在指令碼中新增下列內容:

    #!/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()
    
  5. 儲存並關閉檔案。

設定環境變數

  1. 為轉送器建立環境檔案:

    nano /opt/onguard-chronicle-forwarder/.env
    
  2. 新增下列設定值:

    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)
  3. 保護環境檔案:

    chmod 600 /opt/onguard-chronicle-forwarder/.env
    

以 systemd 服務形式安裝

  1. 建立 systemd 服務檔案:

    sudo nano /etc/systemd/system/onguard-chronicle-forwarder.service
    
  2. 新增下列內容:

    [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
    
  3. 啟用並啟動服務:

    sudo systemctl daemon-reload
    sudo systemctl enable onguard-chronicle-forwarder.service
    sudo systemctl start onguard-chronicle-forwarder.service
    
  4. 確認服務正在執行:

    sudo systemctl status onguard-chronicle-forwarder.service
    
  5. 檢查轉送器記錄,確認作業是否成功:

    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 網頁掛鉤動態消息支援多種驗證方法。選擇供應商支援的方法。

如果供應商支援自訂 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,請按照下列步驟操作:

  1. 確認中介軟體主機可連線至 OnGuard 伺服器:

    curl -k https://<ONGUARD_SERVER>:8080/api/access/onguard/openaccess/version?version=1.0
    
  2. 確認 OnGuard 伺服器防火牆已開啟通訊埠 8080

  3. 在 OnGuard 伺服器上執行下列指令,確認通訊埠正在監聽:

    netstat -anb | findstr 8080
    
  4. 如果通訊埠未監聽,請重新啟動 LS OpenAccess 服務:

    • 在 OnGuard 伺服器上開啟 Windows 服務 (services.msc)。
    • 在「LS OpenAccess」上按一下滑鼠右鍵,然後選取「重新啟動」

驗證失敗

如果中介軟體收到驗證錯誤:

  1. 確認 OnGuard 使用者名稱和密碼正確無誤。
  2. 確認 ONGUARD_DIRECTORY_ID 符合 GET /directories 傳回的有效目錄。
  3. 確認 OnGuard 使用者帳戶未因暴力破解防護機制而遭到鎖定。OnGuard 會在多次登入失敗後鎖定帳戶。
  4. 如果 openaccess.ini 檔案位於 C:\ProgramData\lnl\openaccess.ini,請確認設定是否正確。

Chronicle 未收到任何事件

如果中介軟體執行時沒有錯誤,但 Chronicle 中未顯示任何事件:

  1. 檢查「Alarm Monitoring」(警報監控) 應用程式,確認 OnGuard 是否產生事件。
  2. 確認 OnGuard 資料庫已啟用事件發布功能。在 OnGuard 資料庫伺服器上,執行下列 SQL 查詢:

    SELECT * FROM LNL_SYSTEMSETTINGS WHERE SETTINGNAME = 'EventPublishingDisabled'
    
    • 如果結果為 0 或沒有結果,表示已啟用事件發布功能。
    • 如果結果為 1,表示事件發布功能已停用,必須重新啟用。
  3. 檢查 /opt/onguard-chronicle-forwarder/forwarder.log 的轉送器記錄檔,查看錯誤訊息。

  4. 確認 .env 檔案中的 Chronicle Webhook 端點網址、API 金鑰和密鑰正確無誤。

要求集區已滿錯誤

如果中介軟體收到 OpenAccess 的 request pool full 錯誤:

  1. 在 OnGuard 伺服器上,建立或編輯 C:\ProgramData\Lnl\OpenAccess.ini 檔案。
  2. 新增下列內容:

    [http_request]
    request_pool_size=128
    
  3. 重新啟動 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 專業人員尋求答案。