收集 VanDyke VShell SFTP 日志
本文档介绍了如何使用 Bindplane 通过 Syslog 或 Amazon S3(使用日志传送程序)将 VanDyke VShell SFTP 日志注入到 Google Security Operations。解析器会将原始日志转换为结构化的 UDM 格式。它可处理 JSON 和 SYSLOG 格式,提取相关字段(如 IP 地址、端口和事件详细信息),并利用平台详细信息和安全严重程度等背景信息来丰富数据。
准备工作
请确保满足以下前提条件:
- Google SecOps 实例
- 对 VanDyke VShell 服务器或管理控制台的特权访问权限
- 对于选项 1:一个 Windows 2016 或更高版本或 Linux 主机,其中包含
systemd(适用于 Bindplane 代理) - 对于选项 2:具有 S3 访问权限的 AWS 账号,以及 VShell 服务器上的 NXLog/Fluent Bit
选项 1:通过 Bindplane 和 Syslog 进行集成
此选项可提供延迟时间极短的实时日志流式传输,建议在大多数部署中使用。
- 登录 Google SecOps 控制台。
- 依次前往 SIEM 设置 > 收集代理。
- 下载注入身份验证文件。将该文件安全地保存在将要安装 Bindplane 的系统上,或者您将要配置 Feed 的系统上。
获取 Google SecOps 客户 ID
- 登录 Google SecOps 控制台。
- 依次前往 SIEM 设置 > 个人资料。
- 复制并保存组织详细信息部分中的客户 ID。
安装 Bindplane 代理
按照以下说明在 Windows 或 Linux 操作系统上安装 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_file_path: '/path/to/ingestion-authentication-file.json' # Replace with your actual customer ID from Step 2 customer_id: YOUR_CUSTOMER_ID endpoint: malachiteingestion-pa.googleapis.com # Custom log type - requires parser extension log_type: 'VANDYKE_SFTP' raw_log_field: body ingestion_labels: 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 注入身份验证文件部分中保存身份验证文件的路径。 - 如果使用 TCP 而不是 UDP,请将
udplog替换为tcplog。
重启 Bindplane 代理以应用更改
如需在 Linux 中重启 Bindplane 代理,请运行以下命令:
sudo systemctl restart bindplane-agent如需在 Windows 中重启 Bindplane 代理,您可以使用服务控制台,也可以输入以下命令:
net stop BindPlaneAgent && net start BindPlaneAgent
在 VanDyke VShell 上配置 Syslog 转发
适用于 Windows 的 VShell
- 登录 VShell 控制面板。
- 前往日志记录设置。
- 配置远程 syslog 日志记录:
- 启用向远程 syslog 服务器记录日志的功能。
- 服务器地址:输入 Bindplane 代理 IP 地址。
- 端口:输入 514(或您配置的端口)。
- 协议:选择 UDP(或 TCP,如果已配置)。
- 消息组:选择连接、身份验证、SFTP、FTPS、HTTPS、错误、警告 和信息。
- 依次点击应用 > 确定。
适用于 Linux/macOS 上的 VShell
- 修改 vshelld_config 文件(通常为
/etc/vshell/vshelld_config)。 配置以下参数:
SyslogFacility LOG_LOCAL3 LogLevel INFO配置系统的 syslog,以将 LOG_LOCAL3 转发到 Bindplane 代理:
- 修改
/etc/rsyslog.conf或/etc/syslog-ng/syslog-ng.conf。 - 添加:
local3.* @bindplane-agent-ip:514(对于 UDP)或local3.* @@bindplane-agent-ip:514(对于 TCP)。
- 修改
重启 VShell 服务和 syslog 服务:
sudo systemctl restart vshelld sudo systemctl restart rsyslog
选项 2:通过 AWS S3 进行集成
此选项适用于需要日志归档或无法直接转发 syslog 的环境。请注意,由于 AWS Lambda 无法访问本地文件,因此需要在 VShell 服务器上安装日志传送程序。
为 Google SecOps 配置 AWS S3 存储桶和 IAM
- 按照以下用户指南创建 Amazon S3 存储桶:创建存储桶。
- 保存存储桶名称和区域以供日后参考(例如
vandyke-sftp-logs)。 - 按照以下用户指南创建用户:创建 IAM 用户。
- 选择创建的用户。
- 选择安全凭据标签页。
- 在访问密钥部分中,点击创建访问密钥。
- 选择第三方服务作为使用情形。
- 点击下一步。
- 可选:添加说明标记。
- 点击创建访问密钥。
- 点击下载 CSV 文件,保存访问密钥和不公开的访问密钥以供日后参考。
- 点击完成。
- 选择权限标签页。
- 在权限政策部分中,点击添加权限。
- 选择添加权限。
- 选择直接附加政策。
- 搜索 AmazonS3FullAccess 政策。
- 选择相应政策。
- 点击下一步。
- 点击添加权限。
在 VShell 服务器上安装和配置日志传送器
根据您的操作系统,选择以下选项之一:
选项 A:使用 NXLog (Windows)
- 从 nxlog.co 下载并安装 NXLog 社区版。
修改
C:\Program Files\nxlog\conf\nxlog.conf:<Extension json> Module xm_json </Extension> <Extension syslog> Module xm_syslog </Extension> <Input vshell_log> Module im_file File "C:\\Program Files\\VanDyke Software\\VShell\\Log\\VShell.log" SavePos TRUE <Exec> # Parse VShell log format if $raw_event =~ /^(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) "(.*)"$/ { $EventTime = $1; $Protocol = $2; $EventType = $3; $SessionID = $4; $ClientIP = $5; $ClientPort = $6; $Username = $7; $Filename = $9; $BytesDown = $10; $BytesUp = $11; $ServerIP = $14; $ServerPort = $15; $EventMessage = $16; # Convert to JSON to_json(); } </Exec> </Input> <Output s3> Module om_exec Command C:\scripts\upload_to_s3.ps1 Args %FILEPATH% </Output> <Route vshell_to_s3> Path vshell_log => s3 </Route>创建 PowerShell 脚本
C:\scripts\upload_to_s3.ps1:param([string]$FilePath) $bucket = "vandyke-sftp-logs" $key = "vshell/$(Get-Date -Format 'yyyy/MM/dd/HH')/$(Get-Date -Format 'yyyyMMddHHmmss').json" # Batch logs $logs = Get-Content $FilePath | ConvertFrom-Json $jsonLines = $logs | ForEach-Object { $_ | ConvertTo-Json -Compress } $content = $jsonLines -join "`n" # Upload to S3 Write-S3Object -BucketName $bucket -Key $key -Content $content -ProfileName default创建 AWS 凭据配置文件:
Set-AWSCredential -AccessKey YOUR_ACCESS_KEY -SecretKey YOUR_SECRET_KEY -StoreAs default- 使用任务计划程序将 PowerShell 脚本安排为每 5 分钟运行一次。
选项 B:使用 Fluent Bit (Linux)
安装 Fluent Bit:
curl https://raw.githubusercontent.com/fluent/fluent-bit/master/install.sh | sh配置
/etc/fluent-bit/fluent-bit.conf:[SERVICE] Flush 5 Daemon On Log_Level info [INPUT] Name tail Path /var/log/vshell/vshell.log Parser vshell_parser Tag vshell.* Refresh_Interval 5 Mem_Buf_Limit 10MB [PARSER] Name vshell_parser Format regex Regex ^(?<timestamp>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) (?<protocol>\S+) (?<event_type>\S+) (?<session_id>\S+) (?<client_ip>\S+) (?<client_port>\S+) (?<username>\S+) (?<dash>\S+) (?<filename>\S+) (?<bytes_down>\S+) (?<bytes_up>\S+) (?<field1>\S+) (?<field2>\S+) (?<server_ip>\S+) (?<server_port>\S+) "(?<event_message>[^"]*)" [OUTPUT] Name s3 Match vshell.* bucket vandyke-sftp-logs region us-east-1 use_put_object On total_file_size 5M upload_timeout 10s compression gzip s3_key_format /vshell/%Y/%m/%d/%H/%{hostname}_%{uuid}.json.gz配置 AWS 凭据:
export AWS_ACCESS_KEY_ID=YOUR_ACCESS_KEY export AWS_SECRET_ACCESS_KEY=YOUR_SECRET_KEY启动 Fluent Bit:
sudo systemctl enable fluent-bit sudo systemctl start fluent-bit
在 Google SecOps 中配置 Feed 以注入 VanDyke VShell 日志
- 依次前往 SIEM 设置 > Feed。
- 点击添加新 Feed。
- 在Feed 名称字段中,输入 Feed 的名称(例如
VanDyke VShell SFTP logs)。 - 选择 Amazon S3 V2 作为来源类型。
- 选择 VanDyke SFTP 作为日志类型(自定义)。
- 点击下一步。
- 为以下输入参数指定值:
- S3 URI:
s3://vandyke-sftp-logs/vshell/ - 源删除选项:根据您的偏好选择保留(推荐)或删除选项。
- 文件存在时间上限:包含在过去指定天数内修改的文件。默认值为 180 天。
- 访问密钥 ID:有权访问 S3 存储桶的用户访问密钥。
- 私有访问密钥:有权访问 S3 存储桶的用户私有密钥。
- 资产命名空间:资产命名空间。
- 注入标签:应用于此 Feed 中事件的标签。
- S3 URI:
- 点击下一步。
- 在最终确定界面中查看新的 Feed 配置,然后点击提交。
UDM 映射表
| 日志字段 | UDM 映射 | 逻辑 |
|---|---|---|
| agent.id | read_only_udm.observer.asset_id | 将“filebeat:”与 agent.id 字段的值串联起来 |
| agent.type | read_only_udm.observer.application | 直接映射 agent.type 字段的值 |
| agent.version | read_only_udm.observer.platform_version | 直接映射 agent.version 字段的值 |
| ecs.version | read_only_udm.metadata.product_version | 直接映射 ecs.version 字段的值 |
| host.architecture | read_only_udm.target.asset.hardware.cpu_platform | 直接映射 host.architecture 字段的值 |
| host.hostname | read_only_udm.target.hostname | 直接映射 host.hostname 字段的值 |
| host.id | read_only_udm.principal.asset_id | 将“VANDYKE_SFTP:”与 host.id 字段的值串联起来 |
| host.ip | read_only_udm.target.ip | 将 host.ip 数组中的每个 IP 地址直接映射到单独的 read_only_udm.target.ip 字段 |
| host.mac | read_only_udm.target.mac | 将 host.mac 数组中的每个 MAC 地址直接映射到单独的 read_only_udm.target.mac 字段 |
| host.os.kernel | read_only_udm.target.platform_patch_level | 直接映射 host.os.kernel 字段的值 |
| host.os.platform | read_only_udm.target.platform | 根据 host.os.platform 的值,将其映射到 WINDOWS、LINUX、MAC 或 UNKNOWN_PLATFORM |
| host.os.version | read_only_udm.target.platform_version | 直接映射 host.os.version 字段的值 |
| log.file.path | read_only_udm.principal.process.file.full_path | 直接映射 log.file.path 字段的值 |
| logstash.collect.timestamp | read_only_udm.metadata.collected_timestamp | 解析 logstash.collect.timestamp 字段中的时间戳,并将其转换为时间戳对象 |
| logstash.irm_environment | read_only_udm.additional.fields.value.string_value | 直接映射 logstash.irm_environment 字段的值。键设置为“irm_environment” |
| logstash.irm_region | read_only_udm.additional.fields.value.string_value | 直接映射 logstash.irm_region 字段的值。键设置为“irm_region” |
| logstash.irm_site | read_only_udm.additional.fields.value.string_value | 直接映射 logstash.irm_site 字段的值。键设置为“irm_site” |
| logstash.process.host | read_only_udm.observer.hostname | 直接映射 logstash.process.host 字段的值 |
| 消息 | 用于使用 Grok 模式和正则表达式提取各种字段 | |
| read_only_udm.metadata.event_type | 设置为“NETWORK_FTP” | |
| read_only_udm.metadata.log_type | 设置为“VANDYKE_SFTP” | |
| read_only_udm.metadata.product_event_type | 使用 Grok 模式从消息字段中提取 | |
| read_only_udm.metadata.product_name | 设置为“VANDYKE_SFTP” | |
| read_only_udm.metadata.vendor_name | 设置为“VANDYKE SOFTWARE” | |
| read_only_udm.network.application_protocol | 如果说明字段包含“SSH2”或“SSH”,则设置为“SSH”;否则,如果方法字段与 HTTP 方法匹配,则设置为“HTTP” | |
| read_only_udm.network.http.method | 使用 Grok 模式从消息字段中提取,仅当匹配常见的 HTTP 方法时才提取 | |
| read_only_udm.network.http.referral_url | 使用 Grok 模式从消息字段中提取 | |
| read_only_udm.network.http.response_code | 使用 Grok 模式从消息字段中提取并转换为整数 | |
| read_only_udm.network.ip_protocol | 如果说明字段包含“TCP”,则设置为“TCP” | |
| read_only_udm.principal.ip | 使用 Grok 模式从消息字段中提取 | |
| read_only_udm.principal.port | 使用 Grok 模式从消息字段中提取并转换为整数 | |
| read_only_udm.security_result.description | 使用 Grok 模式从消息字段中提取 | |
| read_only_udm.security_result.severity | 如果 syslog_severity 为“error”或“warning”,则设置为“HIGH”;如果为“notice”,则设置为“MEDIUM”;如果为“information”或“info”,则设置为“LOW” | |
| read_only_udm.security_result.severity_details | 直接映射 syslog_severity 字段的值 | |
| read_only_udm.target.ip | 使用 Grok 模式从消息字段中提取 | |
| read_only_udm.target.port | 使用 Grok 模式从消息字段中提取并转换为整数 | |
| read_only_udm.target.process.pid | 使用 Grok 模式从消息字段中提取 | |
| syslog_severity | 用于确定 security_result 的严重程度 |
需要更多帮助?获得社区成员和 Google SecOps 专业人士的解答。