jl-segurayuste/cyberhound-pro
GitHub: jl-segurayuste/cyberhound-pro
面向 Linux 中小企业的一体化安全审计与持续监控平台,集成强化检查、恶意软件扫描、容器审计、威胁情报和自动修复功能。
Stars: 1 | Forks: 0
# CyberHound Pro
**面向中小企业的审计、安全与持续监控平台**
[](https://python.org)
[](#测试)
[](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, 关系图谱, 基线检查, 子域名突变, 安全态势感知, 插件系统, 数据泄露, 无后门, 请求拦截, 逆向工具