收集 1Password 日志
支持的语言:
Google SecOps
SIEM
本文档介绍了如何使用 Bindplane 将 1Password 日志注入到 Google Security Operations。解析器会将原始 JSON 格式的日志数据转换为符合 Google SecOps 统一数据模型 (UDM) 的结构化格式。它专门用于对与用户登录尝试相关的事件进行标准化处理和丰富,提取有关用户、用户位置信息、客户端信息和尝试结果的详细信息。
准备工作
确保您满足以下前提条件:
- Google SecOps 实例
- Windows 2016 或更高版本,或者具有 systemd 的 Linux 主机
- 如果在代理后运行,防火墙端口处于开放状态
- 对 1Password 的特权访问权限
获取 Google SecOps 注入身份验证文件
- 登录 Google SecOps 控制台。
- 依次前往 SIEM 设置 > 收集代理。
- 下载注入身份验证文件。将该文件安全地保存在将要安装 Bindplane 的系统上。
获取 Google SecOps 客户 ID
- 登录 Google SecOps 控制台。
- 依次前往 SIEM 设置 > 配置文件。
- 复制并保存组织详细信息部分中的客户 ID。
安装 Bindplane 代理
Windows 安装
- 以管理员身份打开命令提示符或 PowerShell。
运行以下命令:
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
Linux 安装
- 打开具有 root 或 sudo 权限的终端。
运行以下命令:
sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh
其他安装资源
如需了解其他安装选项,请参阅安装指南。
配置 Bindplane 代理以注入 Syslog 并将其发送到 Google SecOps
- 访问配置文件:
- 找到
config.yaml
文件。通常,它位于 Linux 上的/etc/bindplane-agent/
目录中或 Windows 上的安装目录中。 - 使用文本编辑器(例如
nano
、vi
或记事本)打开该文件。
- 找到
按如下方式修改
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
根据基础架构的需要替换端口和 IP 地址。
将
<customer_id>
替换为实际的客户 ID。将
/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 令牌
- 登录 1Password 网页界面。
- 前往集成。
- 点击页面顶部的目录。
- 输入令牌的名称,然后设置令牌的失效时间。
- 在事件报告中,点击其他。
- 选择相应的活动类型。
- 点击 Issue Token(发放令牌)以生成访问令牌密钥。
- 点击 Save in 1Password,然后选择要将令牌保存到哪个保险箱。
- 点击查看集成详情即可查看令牌。
配置 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 | 如果 category 为 success 或 firewall_reported_success ,则该值设置为 USER_LOGIN ;如果没有用户信息,则设置为 STATUS_UPDATE ;否则设置为 USER_UNCATEGORIZED 。 |
不适用 | metadata.log_type | 该值设置为 ONEPASSWORD 。 |
不适用 | metadata.product_name | 该值设置为 ONEPASSWORD 。 |
不适用 | metadata.vendor_name | 该值设置为 ONEPASSWORD 。 |
不适用 | security_result.action | 如果 category 为 success 或 firewall_reported_success ,则该值设置为 ALLOW ;如果 category 为 credentials_failed 、mfa_failed 、modern_version_failed 或 firewall_failed ,则该值设置为 BLOCK ;否则,该值留空。 |
需要更多帮助?从社区成员和 Google SecOps 专业人士那里获得解答。