收集 Armis 漏洞日志
支持的平台:
Google SecOps
SIEM
本文档介绍了如何使用 Google Cloud Functions 将 Armis 漏洞日志注入到 Google Security Operations。解析器会将原始 JSON 格式的安全漏洞日志转换为符合 Google SecOps UDM 的结构化格式。它从原始日志中提取各种字段,将这些字段映射到相应的 UDM 字段,执行数据类型转换,并构建输出以供注入到 Google SecOps 平台中。
准备工作
请确保满足以下前提条件:
- 具有客户 ID 和服务账号凭据的 Google SecOps 实例
- 对 Armis Centrix 平台的特权访问权限
- Armis API Secret Key 和服务器网址
- 对 Google Cloud 的访问权限,以及创建 Cloud Functions 函数、Secret Manager 密文和 Cloud Scheduler 作业的权限
- Armis 资产漏洞管理 (AVM) 许可或模块访问权限
获取 Google SecOps 客户 ID
- 登录 Google SecOps 控制台。
- 依次前往 SIEM 设置 > 个人资料。
- 复制并保存组织详细信息部分中的客户 ID。
获取 Google SecOps 服务账号凭据
- 登录 Google SecOps 控制台。
- 依次前往 SIEM 设置 > 收集代理。
- 下载提取身份验证文件(服务账号 JSON 文件)。
- 请安全地保存该文件,因为您需要将其上传到 Google Secret Manager。
获取 Armis API 密钥
- 登录 Armis Centrix 平台。
- 依次前往设置 > API 管理。
- 如果您需要生成新的 API 密钥,请点击创建。
- 点击显示以查看密钥。
- 复制并妥善保存密钥。
配置 Google Secret Manager
本部分将指导您使用 Google Secret Manager 安全地存储集成所需的服务账号密钥。
添加 Google SecOps 服务账号 Secret
- 登录 Google Cloud 控制台。
- 依次前往安全性 > Secret Manager。
- 点击创建 Secret。
- 提供以下配置详细信息:
- 名称:输入 Secret 的名称(例如
secops-service-account)。 - 密钥值:上传您之前下载的 Google SecOps 服务账号 JSON 文件,或直接粘贴其内容。
- 名称:输入 Secret 的名称(例如
- 点击创建 Secret。
复制所创建 Secret 的资源 ID,格式如下:
projects/{project_id}/secrets/{secret_id}/versions/{version_id}
添加 Armis API Secret Key 密文
- 在 Secret Manager 中,点击创建密钥。
- 提供以下配置详细信息:
- 名称:输入 Secret 的名称(例如
armis-api-secret)。 - Secret 值:粘贴您之前获得的 Armis API Secret 密钥。
- 名称:输入 Secret 的名称(例如
- 点击创建 Secret。
复制所创建 Secret 的资源 ID,格式如下:
projects/{project_id}/secrets/{secret_id}/versions/{version_id}`
下载并准备提取脚本
- 访问 Google SecOps 提取脚本的官方代码库:https://github.com/chronicle/ingestion-scripts。
- 从代码库下载 armis 目录的内容。
- 从代码库中下载 common 目录(必需的依赖项)。
- 在本地机器上为 Cloud Function 部署创建一个新目录。
- 将 armis 和 common 目录的内容复制到部署目录中。
配置环境变量
- 通过文本编辑器打开
.env.yml文件。 修改文件,并使用以下配置:
CHRONICLE_CUSTOMER_ID: <YOUR_CUSTOMER_ID> CHRONICLE_REGION: "us" CHRONICLE_SERVICE_ACCOUNT: projects/{project_id}/secrets/{chronicle-secret-id}/versions/{version_id} CHRONICLE_NAMESPACE: <YOUR_NAMESPACE> POLL_INTERVAL: "10" ARMIS_SERVER_URL: https://<your-armis-instance>.armis.com ARMIS_API_SECRET_KEY: projects/{project_id}/secrets/{armis-secret-id}/versions/{version_id} HTTPS_PROXY: CHRONICLE_DATA_TYPE: ARMIS_VULNERABILITIES替换以下值:
<YOUR_CUSTOMER_ID>:您的 Google SecOps 客户 IDprojects/{project_id}/secrets/{chronicle-secret-id}/versions/{version_id}:Google SecOps 服务账号 Secret 在 Secret Manager 中的完整资源 ID 路径<YOUR_NAMESPACE>:Google Security Operations 日志的可选命名空间(例如armis-vulnerabilities)<your-armis-instance>:您的 Armis 租户子网域(例如,如果您的网址是 https://company.armis.com,请使用company)projects/{project_id}/secrets/{armis-secret-id}/versions/{version_id}:Secret Manager 中 Armis API Secret 的完整资源 ID 路径
部署 Cloud Functions 函数
使用 Cloud Function 第 2 代进行部署(推荐)
- 打开 Cloud Shell 或安装了 gcloud CLI 的本地终端。
- 前往包含提取脚本文件的目录。
运行以下命令:
gcloud functions deploy armis-vulnerabilities-ingestion \ --gen2 \ --entry-point main \ --trigger-http \ --runtime python39 \ --env-vars-file .env.yml \ --memory 512MB \ --timeout 3600s \ --region us-central1
使用 Cloud Function 第 1 代进行部署(替代方案)
运行以下命令:
gcloud functions deploy armis-vulnerabilities-ingestion \ --entry-point main \ --trigger-http \ --runtime python39 \ --env-vars-file .env.yml \ --memory 512MB \ --timeout 540s \ --region us-central1
创建 Cloud Scheduler 作业
- 在 Google Cloud 控制台中,前往 Cloud Scheduler。
- 点击创建作业。
- 提供以下配置详细信息:
- 名称:输入作业的名称(例如
armis-vulnerabilities-scheduler)。 - 区域:选择与 Cloud Function 相同的区域(例如
us-central1)。 - 频率:使用 cron 语法输入时间表(例如,
*/10 * * * *表示每 10 分钟一次)。 - 时区:选择您的首选时区(例如 UTC)。
- 名称:输入作业的名称(例如
- 点击继续。
- 选择 HTTP 作为目标类型。
- 提供以下配置详细信息:
- 网址:在 Cloud Functions 控制台中,前往函数的触发器标签页,然后复制触发器网址。请粘贴到此处。
- HTTP 方法:选择 POST。
- 依次点击身份验证标头 > 添加 OIDC 令牌。
- 选择 Cloud Function 使用的服务账号。
- 点击创建。
UDM 映射表
| 日志字段 | UDM 映射 | 逻辑 |
|---|---|---|
| affectedDevicesCount | read_only_udm.security_result.detection_fields.value | 直接映射,转换为字符串。 |
| attackComplexity | read_only_udm.extensions.vulns.vulnerabilities.about.labels.value | 直接映射。 |
| attackVector | read_only_udm.extensions.vulns.vulnerabilities.about.labels.value | 直接映射。 |
| availabilityImpact | read_only_udm.extensions.vulns.vulnerabilities.about.labels.value | 直接映射。 |
| avmRating | read_only_udm.security_result.detection_fields.value | 直接映射。 |
| 僵尸网络 | read_only_udm.extensions.vulns.vulnerabilities.about.labels.value | 如果存在多个僵尸网络,则会连接成一个字符串。 |
| cisaDueDate | read_only_udm.extensions.vulns.vulnerabilities.about.labels.value | 直接映射。 |
| collection_time.nanos | read_only_udm.metadata.event_timestamp.nanos | 直接映射。 |
| collection_time.seconds | read_only_udm.metadata.event_timestamp.seconds | 直接映射。 |
| commonName | read_only_udm.extensions.vulns.vulnerabilities.name | 直接映射。 |
| confidentialityImpact | read_only_udm.security_result.detection_fields.value | 直接映射。 |
| cveUid | read_only_udm.extensions.vulns.vulnerabilities.cve_id | 直接映射。 |
| cvssScore | read_only_udm.extensions.vulns.vulnerabilities.cvss_base_score | 直接映射,转换为浮点数。 |
| 说明 | read_only_udm.metadata.description | 直接映射。 |
| epssPercentile | read_only_udm.extensions.vulns.vulnerabilities.about.labels.value | 直接映射,转换为字符串。 |
| epssScore | read_only_udm.extensions.vulns.vulnerabilities.about.labels.value | 直接映射,转换为字符串。 |
| exploitabilityScore | read_only_udm.extensions.vulns.vulnerabilities.about.labels.value | 直接映射,转换为字符串。 |
| firstReferencePublishDate | read_only_udm.extensions.vulns.vulnerabilities.first_found | 解析为时间戳,可处理包含和不包含毫秒的格式。 |
| firstWeaponizedReferencePublishDate | read_only_udm.extensions.vulns.vulnerabilities.about.labels.value | 直接映射。 |
| hasRansomware | read_only_udm.extensions.vulns.vulnerabilities.about.labels.value | 直接映射,转换为字符串。 |
| id | read_only_udm.metadata.product_log_id | 直接映射。 |
| impactScore | read_only_udm.security_result.detection_fields.value | 直接映射,转换为字符串。 |
| integrityImpact | read_only_udm.security_result.detection_fields.value | 直接映射。 |
| isWeaponized | read_only_udm.extensions.vulns.vulnerabilities.about.labels.value | 直接映射,转换为字符串。 |
| latestExploitUpdate | read_only_udm.extensions.vulns.vulnerabilities.about.labels.value | 直接映射。 |
| numOfExploits | read_only_udm.security_result.detection_fields.value | 直接映射,转换为字符串。 |
| numberOfThreatActors | read_only_udm.security_result.detection_fields.value | 直接映射,转换为字符串。 |
| orgPriorityManualChangeReason | read_only_udm.security_result.detection_fields.value | 直接映射。 |
| orgPriorityManualChangedBy | read_only_udm.principal.user.userid | 直接映射。 |
| orgPriorityManualUpdateTime | read_only_udm.principal.labels.value | 直接映射。 |
| privilegesRequired | read_only_udm.security_result.detection_fields.value | 直接映射。 |
| publishedDate | read_only_udm.extensions.vulns.vulnerabilities.about.labels.value | 直接映射。 |
| reportedByGoogleZeroDays | read_only_udm.extensions.vulns.vulnerabilities.about.labels.value | 直接映射,转换为字符串。 |
| 范围 | read_only_udm.extensions.vulns.vulnerabilities.about.labels.value | 直接映射。 |
| 和程度上减少 | read_only_udm.extensions.vulns.vulnerabilities.severity | 根据值映射到 CRITICAL、HIGH、MEDIUM、LOW,原始值也会映射到 severity_details。 |
| 状态 | read_only_udm.extensions.vulns.vulnerabilities.about.labels.value | 直接映射。 |
| threatTags | read_only_udm.extensions.vulns.vulnerabilities.about.labels.value | 如果存在多个威胁标记,则会连接成一个字符串。 |
| userInteraction | read_only_udm.about.labels.value | 直接映射。 |
| vulnerabilities_matches | read_only_udm.metadata.url_back_to_product | 直接映射。 |
| read_only_udm.metadata.event_type | 设置为“GENERIC_EVENT”。 | |
| read_only_udm.metadata.product_name | 设置为“ARMIS”。 | |
| read_only_udm.metadata.vendor_name | 设置为“ARMIS”。 | |
| read_only_udm.metadata.log_type | 设置为“ARMIS_VULNERABILITIES”。 | |
| read_only_udm.extensions.vulns.vulnerabilities.severity_details | “严重程度”字段值映射到此字段 |
需要更多帮助?获得社区成员和 Google SecOps 专业人士的解答。