收集 1Password 日志

支持的语言:

本文档介绍了如何使用 Bindplane 将 1Password 日志注入到 Google Security Operations。解析器会将原始 JSON 格式的日志数据转换为符合 Google SecOps 统一数据模型 (UDM) 的结构化格式。它专门用于对与用户登录尝试相关的事件进行标准化处理和丰富,提取有关用户、用户位置信息、客户端信息和尝试结果的详细信息。

准备工作

确保您满足以下前提条件:

  • Google SecOps 实例
  • Windows 2016 或更高版本,或者具有 systemd 的 Linux 主机
  • 如果在代理后运行,防火墙端口处于开放状态
  • 对 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. 打开具有 root 或 sudo 权限的终端。
  2. 运行以下命令:

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

其他安装资源

如需了解其他安装选项,请参阅安装指南

配置 Bindplane 代理以注入 Syslog 并将其发送到 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 网页界面。
  2. 前往集成
  3. 点击页面顶部的目录
  4. 输入令牌的名称,然后设置令牌的失效时间
  5. 事件报告中,点击其他
  6. 选择相应的活动类型
  7. 点击 Issue Token(发放令牌)以生成访问令牌密钥。
  8. 点击 Save in 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 映射 逻辑
类别 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 专业人士那里获得解答。