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

建立動態饋給

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

產生並儲存密鑰

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

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

取得動態饋給端點網址

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

    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>。

  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 金鑰」欄位複製 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 訊息代理工具 (RabbitMQ)
  3. 如有任何服務停止,請在該服務上按一下滑鼠右鍵,然後選取「Start」。

確認可存取 OpenAccess API

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

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

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

擷取驗證目錄

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

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

驗證 OnGuard 使用者帳戶

  1. 在 OnGuard 伺服器上開啟 OnGuard System Administration 應用程式。
  2. 依序前往「管理」 > 「使用者」。
  3. 選取指定用於 API 存取權的使用者帳戶。
  4. 按一下「Permissions」(權限) 分頁標籤。
  5. 在「System Permission Group」下方,確認已啟用下列權限:
    • 在「Access control hardware」下方:查詢「Access Panels」、「Readers」和「Alarm Panels」
    • 在「存取控管」下方:查詢「區隔」
  6. 在「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...
    

建立中介軟體指令碼

  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 Webhook 動態饋給支援多種驗證方式。請選擇供應商支援的方法。

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

  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 專家尋求解答。