jl-segurayuste/cyberhound-pro

GitHub: jl-segurayuste/cyberhound-pro

面向 Linux 中小企业的一体化安全审计与持续监控平台,集成强化检查、恶意软件扫描、容器审计、威胁情报和自动修复功能。

Stars: 1 | Forks: 0

# CyberHound Pro **面向中小企业的审计、安全与持续监控平台** [![Python 3.12](https://img.shields.io/badge/python-3.12-blue.svg)](https://python.org) [![测试](https://img.shields.io/badge/tests-522%20passed-green.svg)](#测试) [![License: AGPL v3](https://img.shields.io/badge/License-AGPL_v3-blue.svg)](LICENSE) ## 目录 - [它是做什么的?](#qué-hace) - [系统要求](#requisitos) - [快速安装](#instalación-rápida) - [功能](#funcionalidades) - [架构](#arquitectura) - [强化检查](#checks-de-hardening-26-checks) - [Docker 和 Kubernetes 检查](#checks-docker-y-kubernetes) - [REST API 和 WebSocket](#api-rest-y-websocket) - [已实现的安全机制](#seguridad-implementada) - [SIEM — 外部集成](#siem--integración-externa) - [配置](#configuración) - [测试](#tests) - [路线图](#roadmap) ## 它是做什么的? CyberHound Pro 是一款专为没有专职安全团队的 Linux 环境设计的一体化网络安全工具: | 模块 | 描述 | |--------|-------------| | **🔍 强化审计** | 26 项配置检查与自动修复 | | **📡 网络扫描** | 网络发现、操作系统检测、通过 nmap 发现 CVE | | **🖥️ SSH 审计** | 并行远程审计多台主机 | | **🦠 恶意软件扫描** | YARA、哈希值 (VT/MalwareBazaar)、auditd、cron、webshell | | **🐳 Docker + K8s** | 7 项 Docker 检查 + 11 项 Kubernetes 检查 | | **📝 代码审计** | bandit, shellcheck, eslint + 密钥检测 | | **🌐 情报** | Shodan, VirusTotal, AbuseIPDB, GreyNoise, HIBP | | **📊 评分** | 结合暴露因素的 0-100 上下文评分 | | **📡 监控** | 实时活动面板与自动告警 | | **🛡 SIEM** | Wazuh, Elasticsearch, Splunk HEC | ## 系统要求 ### 系统环境 - **操作系统**: Linux x86_64 (Ubuntu 22.04/24.04, Debian 12/13, RHEL/Rocky/Alma 9+)。 - **Python**: 3.12+(仅用于手动安装;使用 Docker 则不需要)。 - **权限**: 多个扫描器和自动修复需要 `root`/`sudo` 权限 (nmap 操作系统检测、`auditd`、eBPF 监控、强化修复)。Web 界面可以在非 root 权限下运行。 - **网络**: 需要连接互联网以获取可选的数据源(CVE、Nuclei 模板、 威胁情报)。在隔离环境中也可运行,但覆盖范围会降低。 ### 硬件环境 | | 最低配置 | 推荐配置 | |---|---|---| | **CPU** | 2 vCPU | 4+ vCPU | | **内存** | 2 GB | 8 GB | | **磁盘** | 3 GB | 15+ GB SSD | - 基础占用(应用 + SQLite 数据库 + 日志):约 1 GB。 - **Nuclei 模板**:额外占用约 1.5 GB(如果您使用该扫描器)。 - 对 **恶意软件(基于文件系统的 YARA)** 的扫描以及包含所有模板的 **Nuclei** 扫描 是消耗 CPU/内存最多的操作;如果频繁使用,请增加资源。对于个人实验室/小型企业,2 vCPU / 4 GB / 10 GB 的配置已经绰绰有余。 ## 快速安装 ### Docker(推荐) ``` git clone https://github.com/jl-segurayuste/cyberhound-pro.git cd cyberhound-pro cp .env.example .env nano .env # Cambiar CH_PASSWORD docker compose up -d # 打开 https://localhost:8443 ``` ### 手动安装(Linux) ``` git clone https://github.com/jl-segurayuste/cyberhound-pro.git cd cyberhound-pro chmod +x install.sh && ./install.sh sudo cyberhound web --port 8443 ``` **修改密码:** ``` sudo cyberhound setup ``` ## 功能 ### 实时活动面板 侧边栏会实时显示检测到的每一项发现,包含: - 严重程度图标(🔴 严重、🟠 高危、🟡 中危、🔵 低危) - 每个活动扫描的动画进度条 - 实时计数器(严重、高危、中危) - 出现严重发现时自动展开 - 定期监控网络中的新设备(每 15 分钟) ### 并行扫描 您可以同时执行多个分析任务: - 在运行网络扫描的同时启动 Docker 扫描 - 在后台进行恶意软件扫描的同时查看审计结果 - 每个扫描都有独立的进度条 ### 上下文评分 (0-100) 分数不是简单的扣分——它会综合考虑以下因素: | 因素 | 影响 | |--------|---------| | 类别 | `docker/escape` ×2.0, `ssh` ×1.5, `updates` ×0.7 | | 暴露面 | 面向互联网 +40%,Web 服务器 +20% | | 可自动修复 | 惩罚 -25%(风险是可控的) | | 累积效应 | 同类型的第十次发现权重减少 ×0.8^9 | | 加分项 | 如果 SSH 配置良好 +2 分,如果防火墙正常 +2 分 | 评级:**A** (≥90) · **B** (≥75) · **C** (≥60) · **D** (≥40) · **F** (<40) ### 自动修复 带有 ⚡ 标记的发现可以通过点击进行修复,无论是在本地还是通过 SSH 在远程主机上: | 类别 | 修复示例 | |-----------|------------------| | SSH | PermitRootLogin no, PasswordAuthentication no, MaxAuthTries 4 | | 防火墙 | ufw enable, systemctl enable --now firewalld | | Kernel | sysctl -w + 持久化到 /etc/sysctl.d/ | | Auth | pam_faillock, login.defs policy | | 系统 | 屏蔽 ctrl-alt-del,黑名单 USB,关闭 core dumps | | Banners | 创建 /etc/issue, /etc/issue.net, /etc/motd | | NTP | apt install chrony + enable | | OpenSSH CVE | apt upgrade openssh-server | ## 架构 ``` cyberhound/ ├── __main__.py # CLI: web / setup / version ├── pyproject.toml # v6.1.0, deps, pytest config │ ├── core/ │ ├── models.py # Finding, HostResult, ScanReport │ ├── config.py # YAML + env vars + validate() eager │ ├── auth.py # JWT HS256 + rate limiting + CSRF │ ├── security.py # RateLimiter, InputValidator, TLSManager, CSRF │ ├── logging.py # JSON estructurado + journald + SecurityAuditLogger │ ├── executor.py # Comandos async + ThreadPoolExecutor │ ├── database.py # SQLite WAL: scans, findings, assets, suppressions, users │ ├── scheduler.py # Loop asyncio: audit 02:00, malware lun 03:00, network 04:00 │ ├── notifications.py # Email SMTP+TLS + webhooks Slack/Teams │ ├── scoring.py # Motor de scoring contextual (5 factores) │ └── siem.py # Wazuh UDP/API + Elasticsearch + Splunk HEC │ ├── scanners/ │ ├── hardening.py # 26 checks + HardeningFixer (todos los fixes) │ ├── malware.py # YARA + MalwareBazaar/VT + auditd + cron + webshells │ ├── network.py # nmap XML, OS detection, CVEs, risk level │ ├── ssh_audit.py # asyncssh, SFTP para script remoto, whitelist fixes │ ├── docker_scan.py # 7 checks Docker + integración K8s │ ├── kubernetes_scan.py # 11 checks Kubernetes via kubectl │ ├── code.py # bandit + shellcheck + eslint │ ├── secrets.py # gitleaks → trufflehog → semgrep → regex │ ├── intel.py # Shodan, VT, AbuseIPDB, GreyNoise, OTX, HIBP │ ├── nuclei_scan.py # motor Nuclei (ProjectDiscovery) → Finding normalizado │ └── reports.py # HTML + Ansible playbook │ ├── api/ │ └── server.py # aiohttp + WebSocket streaming + 25+ endpoints REST │ └── ui/static/ ├── index.html # SPA — 9 secciones + panel de actividad ├── style.css # Dark theme corporativo └── app.js # WebSocket, dashboard, scoring, actividad en tiempo real ``` ## 强化检查(26 项检查) ### SSH (`/etc/ssh/sshd_config`) | ID | 检查内容 | 修复 | |----|---------|-----| | `ssh_PermitRootLogin` | PermitRootLogin yes | ✅ | | `ssh_PasswordAuthentication` | PasswordAuthentication yes | ✅ | | `ssh_PermitEmptyPasswords` | PermitEmptyPasswords yes | ✅ | | `ssh_X11Forwarding` | X11Forwarding yes | ✅ | | `ssh_MaxAuthTries` | MaxAuthTries > 4 | ✅ | | `ssh_protocol1` | Protocol 1 处于活动状态 | ✅ | ### 防火墙 | ID | 检查内容 | 修复 | |----|---------|-----| | `fw_ufw_inactive` | 已安装 UFW 但未激活 | ✅ | | `fw_firewalld_inactive` | firewalld 未激活 | ✅ | | `fw_none` | 未检测到防火墙 | ❌ 手动 | ### Kernel (`/proc/sys/`) 10 项参数:ASLR, SYN cookies, IP forwarding, ICMP redirects, source routing, log martians, rp_filter, dmesg_restrict, perf_event_paranoid, IPv6。全部支持通过 sysctl + 持久化进行自动修复。 ### 身份验证与密码 | ID | 检查内容 | 修复 | |----|---------|-----| | `no_pam_faillock` | 未配置 pam_faillock | ✅ | | `login_defs_PASS_MAX_DAYS` | > 90 天 | ✅ | | `login_defs_PASS_MIN_DAYS` | < 1 天 | ✅ | | `login_defs_PASS_WARN_AGE` | < 7 天警告 | ✅ | | `login_defs_LOGIN_RETRIES` | > 5 次重试 | ✅ | ### 通用系统 | ID | 检查内容 | 修复 | |----|---------|-----| | `check_umask` | /etc/profile 中的 umask 为 022 | ✅ | | `no_ntp` | 没有活动的 NTP/chrony | ✅ | | `no_banner_*` | 登录 banners 为空 | ✅ | | `empty_password_*` | /etc/shadow 中存在无密码账户 | ✅ 锁定 | | `duplicate_uid0_*` | 非 root 账户具有 UID 0 | ❌ 手动 | | `tmp_*_noexec` | /tmp 缺少 noexec/nosuid | ❌ 手动 | | `tmp_no_sticky_bit` | /tmp 缺少 sticky bit | ✅ | | `svc_listen_all_*` | 数据库/缓存服务监听在 0.0.0.0 | ❌ 手动 | | `openssh_cve_*` | OpenSSH 版本存在已知 CVE | ✅ apt upgrade | | `ww_*` | 全局可写文件 | ✅ chmod o-w | | `log_perm_*` | 所有人可读的日志 | ✅ chmod o-r | | `no_auditd` | 未安装/启用 auditd | ✅ | | `no_aide` | 未安装 AIDE | ✅ | | `apparmor_inactive` | AppArmor 未启用 | ✅ | | `core_dumps_enabled` | 启用了 Core dumps | ✅ | | `usb_storage_enabled` | 未屏蔽 USB storage | ✅ | | `ctrlaltdel_enabled` | 启用了 Ctrl+Alt+Del | ✅ | | `no_unattended_upgrades` | 未配置自动更新 | ✅ | ## Docker 和 Kubernetes 检查 ### Docker(7 项检查) | 检查项 | 严重程度 | 描述 | |-------|-----------|-------------| | `containers_root` | High | 容器未指定 runAsUser 或 User | | `privileged` | Critical | 容器具有 `--privileged` 权限 | | `docker_socket` | Critical | 挂载了 `/var/run/docker.sock` | | `env_secrets` | High | 环境变量中存在凭证 | | `dangerous_mounts` | Critical | 挂载了主机路径,如 `/etc`, `/proc`, `/` | | `old_images` | Medium | 超过 90 天未更新的镜像 | | `images_cve` | Critical/High | 镜像中存在 CVE(需要 Trivy) | ### Kubernetes(通过 kubectl 进行 11 项检查) | 检查项 | 严重程度 | 描述 | |-------|-----------|-------------| | `pods_as_root` | High | Pod 未设置 `runAsNonRoot: true` | | `privileged_pods` | Critical | 容器设置了 `privileged: true` | | `rbac_wildcards` | Critical | ClusterRole 拥有 `*` 权限 | | `automount_service_account` | Medium | 未禁用 ServiceAccount Token 挂载 | | `no_network_policy` | High | Namespaces 缺少 NetworkPolicy | | `no_resource_limits` | Medium | 容器没有 CPU/内存限制 | | `latest_image_tag` | Low | 镜像使用了 `:latest` 标签 | | `env_secrets` | High | 环境变量中硬编码了密钥 | | `dangerous_hostpath` | Critical | HostPath 包含危险的主机路径 | | `kubernetes_version` | High | K8s 版本存在已知 CVE | | `pod_security_standards` | Medium | Namespaces 缺少 Pod Security Admission | ## REST API 和 WebSocket ### 主要 Endpoints | 方法 | 路径 | 描述 | |--------|------|-------------| | `GET/POST` | `/login` | 身份验证 | | `GET` | `/ws` | 扫描的 WebSocket 流 | | `GET` | `/health` | 健康检查 | | `GET` | `/api/dashboard` | 仪表盘统计信息 | | `GET` | `/api/history` | 扫描历史记录 | | `GET` | `/api/history/{id}/compare` | 扫描结果对比 | | `GET` | `/api/score/trend` | 30 天评分趋势 | | `GET` | `/api/score/detail` | 上下文评分明细 | | `GET/POST` | `/api/assets` | 设备清单 | | `POST` | `/api/assets/{ip}/authorize` | 授权/拒绝设备 | | `GET/POST/DELETE` | `/api/suppressions` | 误报管理 | | `GET/POST/PATCH/DELETE` | `/api/users` | 用户管理 | | `GET/POST` | `/api/scheduler/{name}/run` | 任务调度器 | | `POST` | `/api/fix/local` | 应用本地修复 | | `POST` | `/api/fix/remote` | 通过 SSH 应用远程修复| `POST` | `/api/report/{html\|ansible}` | 生成报告 | | `GET/POST` | `/api/config/keys` | API 密钥 | | `GET/POST` | `/api/config/notifications` | 配置通知 | | `GET/POST` | `/api/config/siem` | 配置 SIEM | | `POST` | `/api/config/siem/test` | SIEM 连接测试 | ### 可用的 WebSocket 任务 ``` { "task": "audit" } { "task": "malware", "skip": ["hash"], "yara_rules": "/ruta/" } { "task": "network", "networks": "192.168.1.0/24", "ssh_audit": true } { "task": "ssh", "hosts": "192.168.1.10,192.168.1.20", "ssh_key": "/ruta" } { "task": "docker", "scan_images_cve": true, "scan_k8s": true } { "task": "code", "path": "/var/www/html" } { "task": "intel", "target": "1.2.3.4", "modules": ["shodan","virustotal"] } ``` ## 已实现的安全机制 ### 身份验证与会话 - **JWT HS256**,密钥持久化在 `config.yaml` 中(权限 600) - **Cookie** 采用 `httponly` + `SameSite=Strict` + `Secure`(根据 TLS 动态调整) - **速率限制**:5 次尝试/15分钟 → 锁定 15分钟/1小时/24小时(指数级) - **速率限制** 永远不会阻止 localhost - **CSRF**:在 POST 表单中使用 double-submit cookie;`/api/*` 豁免(使用 JWT) - **JWT 过期**:重定向到登录页并清除无效的 cookie ### 自动 TLS - 首次启动时生成 RSA 4096 自签名证书 - 强制使用 TLS 1.2+,仅使用现代加密算法 (ECDHE+AES-GCM, ChaCha20) - 支持外部证书(兼容 Let's Encrypt) ### 输入验证 - `InputValidator.ws_message()`:任务白名单,阻止路径遍历 - 使用 `ipaddress.ip_address()` 验证 IP(不使用正则——避免误报) - CIDR 最大为 /16(不允许 /8 或更大) - 每次扫描最多 50 台主机,每次请求最多 5 个网络 ### HTTP 头 `X-Content-Type-Options`, `X-Frame-Options: DENY`, `X-XSS-Protection`, `CSP`, `Cache-Control: no-store` ### 审计日志 `/var/log/cyberhound/security_audit.log`:记录登录、应用的修复、启动的扫描 ## SIEM — 外部集成 将发现结果实时自动发送至: ### Wazuh - **UDP socket**(活动代理,端口 1514) - Wazuh Manager 的 **REST API**(可选) - 兼容 Wazuh 自定义解码器的格式 ### Elasticsearch / ELK - 直接索引到配置的索引中 - 身份验证:API Key 或用户名/密码 - 默认索引:`cyberhound-findings` ### Splunk HEC - HTTP Event Collector - Token、index 和 sourcetype 均可配置 通过 UI 进行**配置**:⚙️ Config → 🛡 SIEM ## 配置 `~/.cyberhound/config.yaml`(或使用 sudo 时为 `/root/.cyberhound/config.yaml`): ``` auth: mode: jwt username: admin password_hash: "sha256hex" # cyberhound setup secret: "hex32chars" # persistido automáticamente token_ttl_hours: 8 server: host: "0.0.0.0" port: 8443 tls_cert: null # null = auto-firmado tls_key: null scan: ssh_key_path: "~/.ssh/id_ed25519" ssh_default_user: root ssh_concurrency: 5 max_ww_files: 200 scheduler: enabled: true audit_hour: 2 # audit diario 02:00 malware_day: 0 # malware los lunes (0=lunes) malware_hour: 3 network_hour: 4 notifications: email_enabled: false smtp_host: smtp.gmail.com min_level: warning # info | warning | critical siem: wazuh_enabled: false elk_enabled: false splunk_enabled: false min_severity: medium ``` ### 环境变量(Docker) | 变量 | 描述 | |----------|-------------| | `CH_PASSWORD` | 访问密码 | | `CH_USERNAME` | 用户名(默认:admin) | | `SHODAN_API_KEY` | Shodan 的 API key | | `VT_API_KEY` | VirusTotal 的 API key | | `CH_SMTP_PASSWORD` | SMTP 密码(不在 YAML 中) | | `CH_WAZUH_PASS` | Wazuh API 密码 | | `CH_ELK_API_KEY` | Elasticsearch API key | | `CH_SPLUNK_TOKEN` | Splunk HEC Token | ## 测试 **195 项测试**分布在 7 个文件中: ``` # 运行所有 tests pytest tests/ -v # 包含覆盖率 pytest tests/ --cov=cyberhound --cov-report=term-missing ``` | 文件 | 测试数 | 覆盖范围 | |---------|-------|-----------| | `test_security.py` | 45 | RateLimiter, InputValidator, TLS | | `test_database.py` | 40 | 扫描、资产、抑制、用户、统计 | | `test_hardening.py` | 22 | 单项检查 + HardeningFixer | | `test_scheduler.py` | 13 | 调度器、条目、run_now | | `test_scoring.py` | 25 | 评分引擎、上下文、评级 | | `test_config.py` | 22 | 及时验证、保存/重载 | | `test_docker_k8s.py` | 28 | Docker 和 Kubernetes 检查 | ## 推荐的系统工具 | 工具 | 用途 | 安装方式 | |-------------|---------|-------------| | `nmap` | 网络扫描,操作系统检测,CVE | `sudo apt install nmap` | | `nuclei` | 基于模板的扫描器(CVE、暴露面) | [github.com/projectdiscovery/nuclei](https://github.com/projectdiscovery/nuclei/releases) + `nuclei -update-templates` | | `arp-scan` | 局域网发现 | `sudo apt install arp-scan` | | `kubectl` | Kubernetes 扫描 | [kubernetes.io/docs](https://kubernetes.io/docs/tasks/tools/) | | `trivy` | Docker 镜像中的 CVE | [aquasecurity.github.io](https://aquasecurity.github.io/trivy/) | | `gitleaks` | 代码中的密钥 | [github.com/gitleaks](https://github.com/gitleaks/gitleaks/releases) | | `shellcheck` | Bash 分析 | `sudo apt install shellcheck` | | `bandit` | Python 分析 | `pip install bandit` | | `semgrep` | 多语言分析 | `pip install semgrep` | | `auditd` | 内核日志 | `sudo apt install auditd` | ## 路线图 ### ✅ v6.3 已实现 — 完整功能 | 领域 | 模块 | 详情 | |------|--------|---------| | 审计 | `hardening.py` | 26 项检查 + 自动修复 | | 网络 | `network.py` | nmap、操作系统检测、网络 CVE | | SSH | `ssh_audit.py` | 并行远程审计、SFTP | | 恶意软件 | `malware.py` | YARA 流式处理 O(1)、VT、webshell | | Docker | `docker_scan.py` | 7 项配置检查 | | Kubernetes | `kubernetes_scan.py` | 通过 kubectl 进行 11 项检查 | | Docker 镜像 | `docker_image_scan.py` | 层中的密钥、SUID、EOL | | 运行时 | `runtime_scan.py` | 进程、差异对比、网络、实时 CPU | | 服务 | `services_audit.py` | nginx, apache, mysql, pg, redis, mongodb | | TLS/SSL | `tls_scan.py` | 过期检查、自签名、弱协议/签名/密钥 | | Web 头 | `web_headers.py` | HSTS、CSP、X-Frame、不安全的 cookie、信息泄露 | | DNS 安全 | `dns_security.py` | SPF, DMARC, DKIM, DNSSEC, CAA | | 代码 | `code.py` | bandit、shellcheck、eslint、密钥 | | 情报 | `intel.py` | Shodan, VT, AbuseIPDB, GreyNoise, HIBP | | LDAP/AD | `ldap_audit.py` | 6 项检查:AS-REP、域管理员、策略 | | 评分 | `scoring.py` | 5 个因素、A-F 评级、暴露面 | | PDF | `pdf_report.py` | fpdf2 + 报告中的 ENS/ISO 合规性 | | 合规性 | `compliance.py` | ENS, ISO 27001, PCI-DSS, CIS Controls v8 | | SBOM | `sbom.py` | CycloneDX 1.4, SPDX 2.3,扫描间的差异对比 | | 隔离区 | `quarantine.py` | XOR 加密 + 基于 SHA-256 验证的恢复 | | 监控 | `ebpf_monitor.py` | eBPF/auditd:12 种模式,14 个文件 | | 2FA | `totp.py` | TOTP RFC 6238、恢复代码 | | 授权 | `licensing.py` | community/starter/professional/enterprise | | 代理 | `agent.py` | 带有心跳的多服务器支持 | | 多租户 | `multitenancy.py` | TenantStore、中间件、每个租户的 API key | | OpenAPI | `openapi.py` | Spec 3.0.3 + Swagger UI 位于 /api/docs | | Ansible | `ansible_integration.py` | 自动生成 Playbooks + AWX/Tower API | | 数据库 | `database.py` + `database_pg.py` | SQLite WAL + PostgreSQL asyncpg | | SIEM | `siem.py` + `wazuh/` | Wazuh(解码器+规则)、ELK、Splunk | | 推送 | WS `/ws/push` | 无需轮询的实时通知 | | CSS | `style.css` | 响应式支持移动端/平板/打印 | | 测试 | `tests/` | **355 项 pytest 测试** | ### 🔜 未来版本规划 - **实时合规性** — 当某项检查降低了法规框架的评分时发出告警 - **与工单系统集成** — 根据严重发现自动创建 Jira/ServiceNow 工单 - **ML 评分** — 利用历史数据训练模型,以更智能地确定优先级 - **原生移动应用** — iOS/Android 平台,支持真实的推送通知 - **YARA 规则市场** — 支持自动更新的集中式规则库 - **导出到 Elastic Security** — 事件时间线和关联规则 ## 许可证 AGPL-3.0 License — 见 [LICENSE](LICENSE)。Copyright © 2026 José Luis Segura Yuste. *致力于让中小企业也能轻松享有网络安全*
标签:CTI, Python, 关系图谱, 基线检查, 子域名突变, 安全态势感知, 插件系统, 数据泄露, 无后门, 请求拦截, 逆向工具