收集 1Password 記錄

支援的國家/地區:

本文說明如何使用 Bindplane 將 1Password 記錄擷取至 Google Security Operations。剖析器會將原始 JSON 格式的記錄資料轉換為符合 Google SecOps 統合資料模型 (UDM) 的結構化格式。這項功能主要用於正規化及擴充與使用者嘗試登入相關的事件,並擷取使用者、所在位置、用戶端資訊和嘗試結果的詳細資料。

事前準備

請確認您已完成下列事前準備事項:

  • Google SecOps 執行個體
  • Windows 2016 以上版本或 Linux 主機 (含 systemd)
  • 如果透過 Proxy 執行,防火牆通訊埠已開啟
  • 1Password 的特殊存取權

取得 Google SecOps 擷取驗證檔案

  1. 登入 Google SecOps 控制台。
  2. 依序前往「SIEM 設定」>「收集代理程式」
  3. 下載擷取驗證檔案。將檔案安全地儲存在要安裝 Bindplane 的系統上。

取得 Google SecOps 客戶 ID

  1. 登入 Google SecOps 控制台。
  2. 依序前往「SIEM 設定」>「設定檔」
  3. 複製並儲存「機構詳細資料」專區中的客戶 ID

安裝 Bindplane 代理程式

Windows 安裝

  1. 以系統管理員身分開啟「命令提示字元」或「PowerShell」
  2. 執行下列指令:

    msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
    

Linux 安裝

  1. 開啟具有根層級或 sudo 權限的終端機。
  2. 執行下列指令:

    sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh
    

其他安裝資源

如需其他安裝選項,請參閱安裝指南

設定 Bindplane 代理程式,擷取系統記錄檔並傳送至 Google SecOps

  1. 存取設定檔:
    • 找出 config.yaml 檔案。通常位於 Linux 的 /etc/bindplane-agent/ 目錄,或 Windows 的安裝目錄。
    • 使用文字編輯器 (例如 nanovi 或記事本) 開啟檔案。
  2. 按照下列方式編輯 config.yaml 檔案:

    receivers:
        udplog:
            # Replace the port and IP address as required
            listen_address: "0.0.0.0:514"
    
    exporters:
        chronicle/chronicle_w_labels:
            compression: gzip
            # Adjust the path to the credentials file you downloaded in Step 1
            creds: '/path/to/ingestion-authentication-file.json'
            # Replace with your actual customer ID from Step 2
            customer_id: <customer_id>
            endpoint: malachiteingestion-pa.googleapis.com
            # Add optional ingestion labels for better organization
            ingestion_labels:
                log_type: 'ONEPASSWORD'
                raw_log_field: body
    
    service:
        pipelines:
            logs/source0__chronicle_w_labels-0:
                receivers:
                    - udplog
                exporters:
                    - chronicle/chronicle_w_labels
    
  3. 視基礎架構需求,替換通訊埠和 IP 位址。

  4. <customer_id> 替換為實際的客戶 ID。

  5. /path/to/ingestion-authentication-file.json 更新為您在「取得 Google SecOps 擷取驗證檔案」部分儲存驗證檔案的路徑。

重新啟動 Bindplane 代理程式,以套用變更

  • 如要在 Linux 中重新啟動 Bindplane 代理程式,請執行下列指令:

    sudo systemctl restart bindplane-agent
    
  • 如要在 Windows 中重新啟動 Bindplane 代理程式,可以使用「服務」控制台,或輸入下列指令:

    net stop BindPlaneAgent && net start BindPlaneAgent
    

取得 1Password API 權杖

  1. 登入 1Password 網頁版 UI。
  2. 前往「整合」
  3. 按一下頁面頂端的「目錄」
  4. 輸入權杖名稱,並設定權杖到期日
  5. 在「事件報表」中,按一下「其他」
  6. 選取對應的「事件類型」
  7. 按一下「Issue Token」即可產生存取權杖金鑰。
  8. 按一下「Save in 1Password」(儲存到 1Password),然後選取要將權杖儲存到哪個保險箱。
  9. 按一下「查看整合詳細資料」即可查看權杖。

設定 Linux 主機,執行下列作業:

  • 執行下列指令:

      import datetime
      import requests
      import os
      import socket
      import json
    
    # For more information, check out the support page: https://support.1password.com/events-reporting
    
      api_token = os.environ.get('EVENTS_API_TOKEN')
      url = "https://events.1password.com"
      if not api_token:
          print("Please set the EVENTS_API_TOKEN environment variable.")
          exit(1)
      start_time = datetime.datetime.now() - datetime.timedelta(hours=24)
    
    # Define the bindplane agent details
    
      syslog_server_ip = <ip-address> # Replace with your Bindplane IP
      syslog_server_port = <port-number> # Replace with your Bindplane port
      headers = {
          "Content-Type": "application/json",
          "Authorization": f"Bearer {api_token}"
      payload = {
          "limit": 20,
          "start_time": start_time.astimezone().replace(microsecond=0).isoformat()
    
    # Alternatively, use the cursor returned from previous responses to get any new events
      # payload = { "cursor": cursor }
      try:
          r = requests.post(f"{url}/api/v1/signinattempts", headers=headers, json=payload)
          r.raise_for_status()  # Raise an exception if the request fails
          if r.status_code == requests.codes.ok:
    
    # Send the response to the bindplane server
              syslog_message = f"{json.dumps(r.json())}"
              with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
                  sock.connect((syslog_server_ip, syslog_server_port))
                  sock.sendall(f"{syslog_message}\n".encode())
          else:
              print(f"Error getting sign-in attempts: status code {r.status_code}")
      except requests.exceptions.RequestException as e:
          print(f"Request error: {e}")
      except Exception as e:
          print(f"Error during syslog logging: {e}")
    

UDM 對應表

記錄欄位 UDM 對應 邏輯
category security_result.category_details 這個值取自原始記錄中的 category 欄位。
client.app_name principal.application 這個值取自原始記錄中的 client.app_name 欄位。
client.app_version metadata.product_version 這個值取自原始記錄中的 client.app_version 欄位。
client.ip_address principal.ip 這個值取自原始記錄中的 client.ip_address 欄位。
client.os_name principal.platform 這個值取自原始記錄中的 client.os_name 欄位,並對應至相應的 UDM 平台值 (LINUX、WINDOWS、MAC)。
client.os_version principal.platform_version 這個值取自原始記錄中的 client.os_version 欄位。
client.platform_name principal.resource.attribute.labels.key: platform_name, principal.resource.attribute.labels.value: Chrome 這個值取自原始記錄中的 client.platform_name 欄位。
client.platform_version principal.asset.platform_software.platform_version 這個值取自原始記錄中的 client.platform_version 欄位。
國家/地區 principal.location.country_or_region 如果沒有 location.country,系統會從原始記錄的 country 欄位擷取值。
item_uuid security_result.about.resource.attribute.labels.key: item_uuid, security_result.about.resource.attribute.labels.value: nx4f2lhmafhhfkvgid6ff2fyh4 這個值取自原始記錄中的 item_uuid 欄位。
location.city principal.location.city 這個值取自原始記錄中的 location.city 欄位。
location.country principal.location.country_or_region 這個值取自原始記錄中的 location.country 欄位。
location.latitude principal.location.region_latitude 這個值取自原始記錄中的 location.latitude 欄位。
location.longitude principal.location.region_longitude 這個值取自原始記錄中的 location.longitude 欄位。
location.region principal.location.name 這個值取自原始記錄中的 location.region 欄位。
session.ip principal.ip 這個值取自原始記錄中的 session.ip 欄位。
session_uuid network.session_id 這個值取自原始記錄中的 session_uuid 欄位。
target_user.email target.user.email_addresses 這個值取自原始記錄中的 target_user.email 欄位。
target_user.uuid target.user.userid 這個值取自原始記錄中的 target_user.uuid 欄位。
時間戳記 metadata.event_timestamp.seconds、metadata.event_timestamp.nanos 這個值取自原始記錄中的 timestamp 欄位,並轉換為秒和奈秒。
類型 additional.fields.key:type,additional.fields.value.string_value:mfa_ok 這個值取自原始記錄中的 type 欄位。
user.email principal.user.email_addresses 這個值取自原始記錄中的 user.email 欄位。
user.name principal.user.user_display_name 這個值取自原始記錄中的 user.name 欄位。
used_version additional.fields.key:used_version,additional.fields.value.string_value:1 這個值取自原始記錄中的 used_version 欄位。
uuid principal.resource.attribute.labels.key: uuid, principal.resource.attribute.labels.value: EPNGUJLHFVHCXMJL5LJQGXTENA 這個值取自原始記錄中的 uuid 欄位。
vault_uuid security_result.about.resource.attribute.labels.key: vault_uuid, security_result.about.resource.attribute.labels.value: lddjidoxtrxteclqhubbo3pkyq 這個值取自原始記錄中的 vault_uuid 欄位。
不適用 extensions.auth 系統會為這個欄位建立空白物件。
不適用 metadata.event_type 如果 categorysuccessfirewall_reported_success,值會設為 USER_LOGIN;如果沒有使用者資訊,值會設為 STATUS_UPDATE;否則會設為 USER_UNCATEGORIZED
不適用 metadata.log_type 值會設為 ONEPASSWORD
不適用 metadata.product_name 值會設為 ONEPASSWORD
不適用 metadata.vendor_name 值會設為 ONEPASSWORD
不適用 security_result.action 如果 categorysuccessfirewall_reported_success,值會設為 ALLOW;如果 categorycredentials_failedmfa_failedmodern_version_failedfirewall_failed,值會設為 BLOCK;否則值會留空。

還有其他問題嗎?向社群成員和 Google SecOps 專業人員尋求答案。