riparino/azure-threat-lens

GitHub: riparino/azure-threat-lens

一款针对 Microsoft Sentinel 的自动化事件分诊与调查工具,整合 Azure 原生日志与外部威胁情报,帮助 SOC 分析师快速生成带优先级和 MITRE 映射的调查报告。

Stars: 1 | Forks: 0

# Azure Threat Lens 一个用于 Microsoft Sentinel 和 Azure 安全调查的生产级 Python CLI 工具。Azure Threat Lens 通过从 Sentinel、Microsoft Graph、Azure Resource Graph 和 Activity Logs 拉取数据,将其与外部威胁情报相关联,并生成结构化的调查报告(可选择通过 Azure OpenAI 进行 AI 辅助分析),从而自动化 SOC 工作流程。 ## 目录 - [功能特性](#features) - [架构](#architecture) - [前置条件](#prerequisites) - [安装](#installation) - [Azure App Registration 设置](#azure-app-registration-setup) - [配置](#configuration) - [环境变量](#environment-variables) - [YAML Configuration](#yaml-configuration) - [多租户 / Azure Lighthouse](#multi-tenant--azure-lighthouse) - [快速开始](#quick-start) - [CLI 命令](#cli-commands) - [triage-incident](#triage-incident) - [resolve-entity](#resolve-entity) - [investigate-identity](#investigate-identity) - [investigate-resource](#investigate-resource) - [全局标志](#global-flags) - [威胁情报集成](#threat-intelligence-integration) - [Azure OpenAI 集成](#azure-openai-integration) - [Microsoft Defender XDR 集成](#microsoft-defender-xdr-integration) - [输出格式](#output-formats) - [运行测试](#running-tests) - [安全注意事项](#security-considerations) - [开发](#development) ## 功能特性 - **事件分诊 (Incident triage)** – 获取 Sentinel 事件,解析所有实体,运行多信号分析,并生成包含 MITRE ATT&CK 映射的优先级调查报告 - **身份调查** – 登录日志分析、不可能旅行检测、传统身份验证、MFA 状态、特权角色枚举以及 Defender 告警关联 - **资源调查** – 针对敏感操作(Key Vault 读取、存储密钥枚举、VM run-command、RBAC 变更)的 Activity Log 分析 - **令牌与特权分析** – 服务主体凭证 sprawl、过度授权的应用权限、RBAC 提权检测 - **威胁情报富化** – 并发查询 VirusTotal、GreyNoise 和 AbuseIPDB 以获取 IP、域名和文件哈希的信息 - **Azure OpenAI 推理** – 可选的 LLM 辅助叙述分析和建议操作(Entra ID 认证,无需 API 密钥) - **多租户支持** – 面向管理多个租户 MSSP 的 Azure Lighthouse 工作区联合 - **结构化输出** – 丰富的终端表格、JSON 或纯文本,用于流水线集成 ## 架构 ``` azure-threat-lens/ ├── threatlens/ │ ├── cli/ # Click/Typer CLI entry point and command implementations │ ├── core/ # Triage, verdict, and investigation orchestration engines │ ├── azure/ # Azure API clients (Sentinel, Graph, Resource Graph, Activity Log) │ ├── analysis/ # Threat analysis modules (identity, token, privilege, resource) │ ├── entities/ # Entity resolution and enrichment (IP, hostname, UPN, ARM resource) │ ├── intel/ # Threat intelligence providers (VirusTotal, GreyNoise, AbuseIPDB) │ ├── models/ # Pydantic data models (incidents, entities, investigations) │ ├── reasoning/ # Azure OpenAI LLM reasoning engine and prompt templates │ ├── storage/ # In-memory cache and evidence persistence │ └── utils/ # Authentication, configuration, structured logging ├── config/ │ └── default.yaml # Default configuration values (overridden by environment variables) └── tests/ ├── unit/ # Unit tests for core engines and models └── new_unit/ # Additional unit tests ``` **调查流水线:** ``` CLI command └─▶ InvestigationEngine.run() ├─▶ SentinelClient – fetch incident + alerts ├─▶ EntityResolver – resolve IP / UPN / hostname / ARM resource ├─▶ Analysis modules – identity, token, privilege, resource access ├─▶ ThreatIntelEnricher – VirusTotal / GreyNoise / AbuseIPDB ├─▶ TriageEngine – score, MITRE mapping, attack hypotheses ├─▶ VerdictEngine – disposition (TP/FP/…) + recommended actions └─▶ LLMEngine – optional Azure OpenAI narrative (--llm flag) ``` ## 前置条件 | 需求 | 最低版本 | |---|---| | Python | 3.11 | | Azure subscription | any | | Microsoft Sentinel workspace | any supported region | | Azure App Registration | with the permissions listed below | 可选: - Azure OpenAI 资源(用于 `--llm` 富化) - VirusTotal、GreyNoise 和/或 AbuseIPDB API 密钥(用于威胁情报富化) - Microsoft Defender XDR 许可证(用于 Defender 告警关联) ## 安装 ``` # 克隆仓库 git clone https://github.com/riparino/azure-threat-lens.git cd azure-threat-lens # 安装(生产环境) pip install . # 安装开发扩展(linting、type checking、测试) pip install -e ".[dev]" ``` `threatlens` 命令被注册为控制台脚本,安装后立即可用。 ``` threatlens --help ``` ## Azure App Registration 设置 Azure Threat Lens 使用服务主体(Azure App Registration)进行身份验证。您也可以通过省略 `ATL_AZURE_CLIENT_SECRET` 并依赖 `DefaultAzureCredential` 来使用托管标识(参见下文 [身份验证](#authentication))。 ### 1. 创建 App Registration ``` # 创建应用注册 az ad app create --display-name "azure-threat-lens" # 为其创建服务主体 az ad sp create --id # 创建客户端密钥(记下该值——它只会显示一次) az ad app credential reset --id --append ``` 记录 `appId`(客户端 ID)和生成的密钥值。 ### 2. 授予 Microsoft Graph API 权限 在 Azure Portal → App registrations → 你的应用 → API permissions → Add a permission → Microsoft Graph → Application permissions: | 权限 | 用途 | |---|---| | `User.Read.All` | 解析用户身份、MFA 状态、组成员身份 | | `AuditLog.Read.All` | 读取身份调查的登录日志 | | `Directory.Read.All` | 枚举目录对象、角色和服务主体 | | `SecurityEvents.Read.All` | 读取 Defender 安全警报(可选) | 添加所有权限后,点击 **Grant admin consent**。 ### 3. 授予 Azure RBAC 角色 在适当的范围(订阅或资源组)为服务主体分配角色: ``` SP_OBJECT_ID=$(az ad sp show --id --query id -o tsv) SUBSCRIPTION_ID="" # 必需:读取 Sentinel 事件和工作区数据 az role assignment create \ --assignee $SP_OBJECT_ID \ --role "Microsoft Sentinel Reader" \ --scope "/subscriptions/$SUBSCRIPTION_ID" # 必需:读取 Azure Activity Logs az role assignment create \ --assignee $SP_OBJECT_ID \ --role "Reader" \ --scope "/subscriptions/$SUBSCRIPTION_ID" ``` **最低要求的 RBAC 角色:** | 角色 | 范围 | 用途 | |---|---|---| | `Microsoft Sentinel Reader` | 订阅或工作区 RG | 读取事件、警报、实体 | | `Reader` | 订阅 | Activity Log、Resource Graph 查询 | **用于扩展覆盖范围的可选角色:** | 角色 | 用途 | |---|---| | `Security Reader` | 读取 Defender 警报和安全态势数据 | | `Log Analytics Reader` | 针对Log Analytics 工作区的直接 KQL 查询 | ## 配置 ### 环境变量 将 `.env.example` 复制到 `.env` 并填写您的值: ``` cp .env.example .env ``` 所有环境变量均使用 `ATL_` 前缀。`.env` 文件在启动时自动加载,并已列入 `.gitignore` – 切勿提交此文件。 #### 必需变量 | 变量 | 描述 | 示例 | |---|---|---| | `ATL_AZURE_TENANT_ID` | Azure AD 租户 ID | `xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx` | | `ATL_AZURE_CLIENT_ID` | App Registration 客户端(应用程序)ID | `xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx` | | `ATL_AZURE_CLIENT_SECRET` | App Registration 客户端密钥 | `` | | `ATL_AZURE_SUBSCRIPTION_ID` | 默认 Azure 订阅 ID | `xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx` | | `ATL_SENTINEL_WORKSPACE_ID` | Sentinel 的 Log Analytics 工作区 ID | `xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx` | | `ATL_SENTINEL_WORKSPACE_NAME` | Sentinel 工作区名称 | `my-sentinel-ws` | | `ATL_SENTINEL_RESOURCE_GROUP` | 包含工作区的资源组 | `rg-security` | #### 威胁情报(可选) | 变量 | 描述 | |---|---| | `ATL_VIRUSTOTAL_API_KEY` | VirusTotal API 密钥 – 启用 IP、域名和哈希富化 | | `ATL_GREYNOISE_API_KEY` | GreyNoise API 密钥 – 启用 IP 噪声/扫描器分类 | | `ATL_ABUSEIPDB_API_KEY` | AbuseIPDB API 密钥 – 启用 IP 滥用分数查询 | 设置相应的密钥后,威胁情报提供商会自动启用。禁用的提供商将被静默跳过。 #### Azure OpenAI(可选) | 变量 | 描述 | 示例 | |---|---|---| | `ATL_LLM_ENDPOINT` | Azure OpenAI 资源端点 | `https://myresource.openai.azure.com/` | | `ATL_LLM_DEPLOYMENT` | 部署名称 | `gpt-4o` | | `ATL_LLM_API_VERSION` | API 版本(默认:`2024-02-01`) | `2024-08-01-preview` | | `ATL_LLM_MAX_TOKENS` | 每次响应的最大 token 数(默认:`4096`) | `8192` | 对 Azure OpenAI 的身份验证使用 Entra ID(相同的服务主体),而不是 API 密钥。 #### Microsoft Defender XDR(可选) | 变量 | 默认值 | 描述 | |---|---|---| | `ATL_DEFENDER_ENABLED` | `false` | 启用 Defender 告警关联 | | `ATL_DEFENDER_TENANT_ID` | 同 `ATL_AZURE_TENANT_ID` | 如果 Defender 位于不同租户,则指定租户 ID | #### 输出和日志 | 变量 | 默认值 | 选项 | |---|---|---| | `ATL_LOG_LEVEL` | `INFO` | `DEBUG`, `INFO`, `WARNING`, `ERROR` | | `ATL_LOG_FORMAT` | `console` | `console`(人类可读),`json`(结构化) | | `ATL_OUTPUT_FORMAT` | `rich` | `rich`(彩色终端),`json`,`plain` | #### 其他 | 变量 | 默认值 | 描述 | |---|---|---| | `ATL_CONFIG_FILE` | `config/default.yaml` | YAML 配置文件的路径 | | `ATL_CACHE_TTL_SECONDS` | `3600` | API 响应的内存缓存 TTL | ### YAML 配置 `config/default.yaml` 包含所有可调参数的默认值。环境变量始终具有更高的优先级。您可以使用 `ATL_CONFIG_FILE` 指向不同的文件。 关键部分: ``` sentinel: default_lookback_hours: 72 # how far back to query for related events max_incidents: 100 graph: signin_lookback_days: 30 # sign-in history window for identity investigations triage: priority_thresholds: critical: 8.0 high: 6.0 medium: 4.0 low: 0.0 ``` ### 多租户 / Azure Lighthouse 要跨多个租户查询 Sentinel 工作区,请将 `ATL_SENTINEL_WORKSPACES` 设置为 JSON 数组: ``` ATL_SENTINEL_WORKSPACES='[ { "workspace_id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "workspace_name": "customer-a-sentinel", "resource_group": "rg-security", "subscription_id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "tenant_id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "display_name": "Customer A" }, { "workspace_id": "yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy", "workspace_name": "customer-b-sentinel", "resource_group": "rg-soc", "subscription_id": "yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy", "tenant_id": "yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy", "display_name": "Customer B" } ]' ``` 设置此变量后,`triage-incident` 上的 `-w` / `--workspace` 选项接受工作区名称、ID 或显示名称。 ### 身份验证 默认情况下,工具使用 `ClientSecretCredential`(客户端 ID + 密钥)。如果未设置 `ATL_AZURE_CLIENT_SECRET`,它将回退到 `DefaultAzureCredential`,后者支持: - 托管标识(推荐用于 Azure 托管部署) - Azure CLI 凭证(`az login`) - 环境凭证 - Visual Studio Code 凭证 要使用托管标识,请省略 `ATL_AZURE_CLIENT_SECRET` 并确保托管标识具有上述相同的 RBAC 角色。 ## 快速开始 ``` # 1. 克隆并安装 git clone https://github.com/riparino/azure-threat-lens.git cd azure-threat-lens pip install . # 2. 配置凭据 cp .env.example .env # 编辑 .env 并填写 ATL_AZURE_TENANT_ID, ATL_AZURE_CLIENT_ID, # ATL_AZURE_CLIENT_SECRET, ATL_AZURE_SUBSCRIPTION_ID, # ATL_SENTINEL_WORKSPACE_ID, ATL_SENTINEL_WORKSPACE_NAME, # ATL_SENTINEL_RESOURCE_GROUP # 3. 甄别 Sentinel 事件 threatlens triage-incident 12345 # 4. 调查受损身份 threatlens investigate-identity alice@contoso.com # 5. 利用威胁情报丰富 IP 地址信息 threatlens resolve-entity 185.220.101.1 # 6. 调查 Azure 资源 threatlens investigate-resource /subscriptions/abc/resourceGroups/rg/providers/Microsoft.KeyVault/vaults/my-kv ``` ## CLI 命令 ### triage-incident 获取 Sentinel 事件,解析所有实体,运行完整的多信号分析,并生成优先级调查报告。 ``` threatlens triage-incident [OPTIONS] INCIDENT_ID ``` | 参数 / 选项 | 描述 | |---|---| | `INCIDENT_ID` | Sentinel 事件编号或 GUID | | `-w`, `--workspace` | 工作区名称或 ID(如省略则使用 `ATL_SENTINEL_WORKSPACE_NAME`) | | `--llm` / `--no-llm` | 启用 Azure OpenAI 叙述分析(默认:关闭) | **示例:** ``` # 基础甄别 threatlens triage-incident 12345 # 使用 AI 辅助分析 threatlens triage-incident 12345 --llm # 针对特定工作区(配合 Lighthouse 使用) threatlens triage-incident abc-1234-guid --workspace customer-a-sentinel --llm # 输出为 JSON 以用于流水线集成 threatlens --output json triage-incident 12345 ``` **报告部分:** - **风险等级** – `CRITICAL`、`HIGH`、`MEDIUM`、`LOW` 或 `INFORMATIONAL`,附带置信度分数 - **摘要** – 事件的段落叙述 - **关键实体** – 解析后的实体表,包含每个实体的风险指标 - **攻击假设** – 排序后的假设,附带 MITRE ATT&CK 战术映射 - **结论** – 定性(`TRUE POSITIVE`、`LIKELY TRUE POSITIVE`、`BENIGN POSITIVE`、`FALSE POSITIVE`、`UNDETERMINED`),附带严重程度和置信度 - **建议操作** – 优先级排序的补救步骤 - **调查步骤** – 分析师后续检查清单 - **LLM 分析** – 扩展叙述(当使用 `--llm` 时) ### resolve-entity 解析并富化单个 Azure 实体,利用威胁情报和上下文数据。 ``` threatlens resolve-entity IDENTIFIER ``` | 参数 | 描述 | |---|---| | `IDENTIFIER` | IP 地址、主机名、UPN、ARM 资源 ID、URL 或文件哈希(MD5/SHA-1/SHA-256) | **示例:** ``` # 丰富 IP 地址信息 threatlens resolve-entity 185.220.101.1 # 查询用户 threatlens resolve-entity alice@contoso.com # 检查 ARM 资源 threatlens resolve-entity "/subscriptions/abc/resourceGroups/rg/providers/Microsoft.KeyVault/vaults/my-kv" # 检查文件哈希 threatlens resolve-entity d41d8cd98f00b204e9800998ecf8427e ``` 私有/RFC-1918 IP 地址不会提交给外部威胁情报提供商。 ### investigate-identity 对用户身份进行深度调查:登录历史、MFA 状态、特权角色、不可能旅行检测、传统身份验证使用情况以及 Defender 告警关联。 ``` threatlens investigate-identity [OPTIONS] IDENTIFIER ``` | 参数 / 选项 | 描述 | |---|---| | `IDENTIFIER` | UPN(`user@domain`)、对象 ID 或账户名 | | `-d`, `--days` | 登录和审计日志的回溯窗口(天)(默认:`7`) | **示例:** ``` # 使用默认 7 天窗口进行调查 threatlens investigate-identity alice@contoso.com # 延长至 30 天回溯 threatlens investigate-identity alice@contoso.com --days 30 # 输出为 JSON threatlens --output json investigate-identity alice@contoso.com --days 14 ``` **检测项:** - 不可能旅行(同一账户,在不可能的时间范围内发生两次地理上相距遥远的登录) - 传统身份验证协议(SMTP、IMAP、ActiveSync、POP3) - MFA 未注册或被绕过 - 分配了高特权角色(全局管理员、特权角色管理员等) 异常登录模式(新国家、新设备、失败后成功序列) - 活跃的 Defender for Identity / Defender XDR 警报 ### investigate-resource 使用 Activity Log 数据调查 Azure 资源的异常访问模式。 ``` threatlens investigate-resource [OPTIONS] RESOURCE_ID ``` | 参数 / 选项 | 描述 | |---|---| | `RESOURCE_ID` | 完整的 ARM 资源 ID | | `-H`, `--hours` | Activity Log 分析的回溯窗口(小时)(默认:`48`) | **示例:** ``` # 调查过去 48 小时内的 Key Vault threatlens investigate-resource \ "/subscriptions/abc/resourceGroups/rg/providers/Microsoft.KeyVault/vaults/my-kv" # 针对存储账户延长至 7 天窗口 threatlens investigate-resource \ "/subscriptions/abc/resourceGroups/rg/providers/Microsoft.Storage/storageAccounts/mystorage" \ --hours 168 ``` **标记的敏感操作:** | 操作 | 描述 | |---|---| | `microsoft.keyvault/vaults/secrets/read` | 访问了 Key Vault 机密 | | `microsoft.storage/storageaccounts/listkeys/action` | 枚举了存储账户密钥 | | `microsoft.compute/virtualmachines/runcommand/action` | 执行了 VM run-command | | `microsoft.authorization/roleassignments/write` | 分配了 RBAC 角色 | | `microsoft.authorization/roleassignments/delete` | 移除了 RBAC 角色 | ### 全局标志 这些标志适用于所有命令,也可以通过环境变量设置: | 标志 | 环境变量 | 默认值 | 选项 | |---|---|---|---| | `--log-level` | `ATL_LOG_LEVEL` | `INFO` | `DEBUG`, `INFO`, `WARNING`, `ERROR` | | `--log-format` | `ATL_LOG_FORMAT` | `console` | `console`, `json` | | `-o`, `--output` | `ATL_OUTPUT_FORMAT` | `rich` | `rich`, `json`, `plain` | | `--version` | – | – | 打印版本并退出 | | `-h`, `--help` | – | – | 显示帮助 | **示例:** ``` # 调试日志 threatlens --log-level DEBUG triage-incident 12345 # 用于 SIEM 摄取的 JSON 输出 threatlens --output json --log-format json triage-incident 12345 # 纯文本输出(无 ANSI 代码) threatlens --output plain triage-incident 12345 ``` ## 威胁情报集成 在 `.env` 中设置以下任意组合的密钥以启用富化: ``` ATL_VIRUSTOTAL_API_KEY= ATL_GREYNOISE_API_KEY= ATL_ABUSEIPDB_API_KEY= ``` 富化在所有配置的提供商之间并发运行。结果被合并为加权风险评分。私有 IP 地址(RFC-1918、loopback、link-local)绝不会提交给外部提供商。 | 提供商 | 富化对象 | 信号 | |---|---|---| | VirusTotal | IPs, domains, file hashes | 恶意软件检测、社区评分 | | GreyNoise | IPs | 已知扫描器/良性噪声分类、恶意意图 | | AbuseIPDB | IPs | 社区报告的滥用置信度分数 | ## Azure OpenAI 集成 将以下内容添加到 `.env` 以启用 AI 辅助叙述分析: ``` ATL_LLM_ENDPOINT=https://.openai.azure.com/ ATL_LLM_DEPLOYMENT=gpt-4o ATL_LLM_API_VERSION=2024-02-01 # optional, a default is provided ``` 身份验证通过相同的 Entra ID 服务主体处理 — 不需要 OpenAI API 密钥。确保服务主体在 Azure OpenAI 资源上具有 **Cognitive Services OpenAI User** 角色: ``` az role assignment create \ --assignee $SP_OBJECT_ID \ --role "Cognitive Services OpenAI User" \ --scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups//providers/Microsoft.CognitiveServices/accounts/" ``` 在调用时使用 `--llm` 启用 LLM 分析: ``` threatlens triage-incident 12345 --llm ``` LLM 将接收调查过程中收集的所有结构化证据,并返回简洁的叙述和建议操作。它绝不会被用作主要信号源 — 确定性的分诊和判定引擎始终首先运行。 ## Microsoft Defender XDR 集成 ``` ATL_DEFENDER_ENABLED=true # 仅当 Defender 所在的租户与 ATL_AZURE_TENANT_ID 不同时需要: ATL_DEFENDER_TENANT_ID= ``` 启用后,Defender 警报将与身份和资源调查相关联,以提高判定置信度。服务主体需要 Defender 租户中的 **Security Reader** 角色。 ## 输出格式 ### rich(默认) 带有表格、面板和规则分隔符的彩色终端输出。最适合交互式使用。 ### json 写入 stdout 的机器可读 JSON。用于 SIEM 接收、脚本或存储调查报告: ``` threatlens --output json triage-incident 12345 | jq '.verdict.disposition' ``` ### plain 不含 ANSI 代码的紧凑 JSON。适用于管道传输到不处理 ANSI 转义序列的工具。 ## 运行测试 ``` # 安装开发依赖 pip install -e ".[dev]" # 运行所有单元测试 pytest tests/ -q # 运行并显示详细输出 pytest tests/ -v # 运行特定测试文件 pytest tests/unit/test_triage_engine.py -v # 运行覆盖率测试 pytest tests/ --cov=threatlens --cov-report=term-missing # Lint 和 type-check ruff check threatlens/ mypy threatlens/ ``` 集成测试需要真实的 Azure 凭证并已相应标记。单元测试使用模拟的 API 响应完全离线运行。 ## 安全注意事项 ### 凭证管理 - 将所有密钥存储在 `.env` 中(切勿提交此文件 — 它已在 `.gitignore` 中) - 在生产环境中,优先使用 **Azure Key Vault** 或 **托管标识** 而非客户端密钥 - 定期轮换客户端密钥和威胁情报 API 密钥 - 如果意外泄露密钥,请立即撤销凭证 ### 服务主体权限 - 遵循最小权限原则:仅授予 [Azure App Registration Setup](#azure-app-registration-setup) 中列出的角色 - 避免为服务主体分配订阅级的 `Contributor` 或 `Owner` - 在服务主体上启用 Azure AD 审计日志以检测异常使用 ### 托管标识(推荐用于 Azure 托管部署) 当在 Azure VM、App Service、Container Instance 或 AKS Pod 上运行时,请使用托管标识而不是客户端密钥。按照上述描述设置托管标识的 RBAC 角色,并从环境中省略 `ATL_AZURE_CLIENT_SECRET`。`DefaultAzureCredential` 将自动使用托管标识。 ### 网络安全 - 如果部署在防火墙后,请限制出站访问仅允许所需的 Azure API 端点 - 威胁情报 API 调用指向 `virustotal.com`、`api.greynoise.io` 和 `api.abuseipdb.com` — 如有需要请将这些加入白名单 ### 日志 - 在生产环境中使用 `ATL_LOG_FORMAT=json` 以进行结构化日志接收 - 密钥存储为 `SecretStr`,绝不会写入日志 - 在生产环境中设置 `ATL_LOG_LEVEL=WARNING` 或更高级别以减少日志量 ## 开发 ### 项目结构 ``` threatlens/ # Main package tests/ # pytest test suite config/ # YAML defaults .env.example # Environment variable template pyproject.toml # Build metadata, dependencies, tool config ``` ### 添加新的分析模块 1. 在 `threatlens/analysis/my_analysis.py` 中创建带有 `async def analyse(...)` 函数的文件 2. 在 `threatlens/core/investigation_engine.py` 的 `InvestigationConfig` 中注册它 3. 在 `tests/unit/` 中添加相应的单元测试 ### 添加新的威胁情报提供商 1. 遵循现有 `VirusTotalClient` 接口,在 `threatlens/intel/my_provider.py` 中实现该提供商 2. 在 `threatlens/intel/enricher.py` 中注册它 3. 将 API 密钥添加到 `.env.example` 和 `threatlens/utils/config.py` ### 代码风格 ``` # 自动修复 linting 问题 ruff check --fix threatlens/ # Type checking mypy threatlens/ ``` 项目目标为 Python 3.11,采用严格的 mypy 和 ruff linting(`E`、`F`、`I`、`UP`、`B`、`SIM` 规则集)。 ## 许可证 MIT License。详见 [LICENSE](LICENSE)。
标签:Azure Monitor, Azure OpenAI, Azure Resource Graph, Cloudflare, DevSecOps, GDPR, GPT, IP 地址批量处理, ISO 27001, JSONLines, Microsoft Graph, Microsoft Sentinel, MITRE ATT&CK, PE 加载器, Python CLI, SOC 工具, StruQ, Web报告查看器, 上游代理, 事件管理, 云安全态势管理, 云端安全, 人工智能安全, 前端应用, 合规性, 大语言模型蜜罐, 威胁情报, 威胁搜寻, 安全报告, 安全调查, 开发者工具, 数字化转型, 数据关联, 活动目录, 渗透测试辅助, 漏洞管理, 病毒扫描, 网络安全, 网络安全审计, 自动化分类, 身份安全, 逆向工具, 隐私保护, 零信任, 风险评分, 黄金证书