sgtsilver/loxprox

GitHub: sgtsilver/loxprox

一个专为 Loxone 迷你服务器设计的多层安全网关,包含反向代理、WAF、IDS、防火墙和监控,解决其缺乏 TLS、速率限制和审计日志等安全缺陷。

Stars: 1 | Forks: 0

**语言:** 德语 · [English](README.en.md) # LoxProx — 针对 Loxone 迷你服务器的安全网关 [![许可证:非商业用途](https://img.shields.io/badge/License-Non--Commercial-red.svg)](#授权) [![验证:A-](https://img.shields.io/badge/Validation-A--_brightgreen)]() [![Debian 12](https://img.shields.io/badge/Debian-12-A81D33?logo=debian)]() [![CIS 强化](https://img.shields.io/badge/CIS-Hardened-blue)]() [![Shellcheck](https://img.shields.io/badge/Shellcheck-passing-brightgreen)]() ## 关于项目 **规则:** 人工智能提出建议。人工智能之间相互质疑。任何代码进入最终版本,不是因为它来自某个模型,而是因为交叉验证没有被攻破 *并且* 人类系统管理员的直觉判断“是的,这才是真正的防御基础设施的方式”。一个听起来很聪明的建议,如果无法通过两个过滤器中的任何一个,就会被剔除——无论它来自哪个模型。 这是一个 **基于人工智能、由人类策划的基础设施安全加固** 的实验。多个 AI 协同工作,但没有一个单独担任架构师;人类拥有否决权和运营责任。 ## 问题 第一代 Loxone 迷你服务器是 **第一代硬件**,具备以下特点: - ❌ 迷你服务器本身不支持 HTTPS/TLS(CPU 太弱,无法处理 SSL)—— 从 v1.5.0 起,网关可以可选地在 `:1080` 端口对外侧终止 TLS,并保护其后的迷你服务器 - ❌ 没有原生的速率限制 - ❌ 没有基于 IP 的访问控制 - ❌ 没有审计日志 - ❌ 没有针对 Web/API 访问的多因素认证 - ❌ 配置 XML 中的密码是加密的,而不是哈希的 - ⚠️ 固件更新非常缓慢;上一个已知的安全补丁是 2020 年(云 DNS 漏洞 CVE-2020-27488)。新的安全功能(TLS、远程连接、信任)仅从第二代开始提供。 这是一个 **需要在网络层面保护的遗留设备** 的典型定义。 这个网关的存在,是因为迷你服务器自身无法保护自己。 ## 架构 ``` Internet ──► Router:1080 ──► Security-Gateway:1080 ──► Loxone:80 │ ├── nginx (Proxy, Rate Limits, Header) ├── CrowdSec (IDS, CAPI-Blocks, AppSec WAF) ├── nftables (Input DROP, erlaubt :1080 + SSH) ├── AppArmor (nginx-Profil aktiv) ├── auditd (Config-Änderungs-Überwachung) └── Discord-Alerts (Echtzeit-Benachrichtigungen) LAN (192.168.x.0/24) ──────► Loxone:80 (direkt, am Gateway vorbei) ``` **设计原则:** 局域网设备直接访问迷你服务器。只有互联网流量通过网关。这意味着:局域网设备保持不受影响,网关可以专注于外部威胁。 ## 项目结构 ``` loxprox/ ├── deploy.sh # ★ HAUPT-DEPLOY-SCRIPT — auf der Ziel-VM laufen lassen ├── detect-loxone.sh # ★ AUTO-ERKENNUNG deines Miniservers ├── test-gateway.sh # ★ VALIDIERUNGS-SUITE — 50+ automatisierte Checks ├── progressive-ban.py # CrowdSec Progressive-Ban-Eskalator (Cron, 15 Min) ├── set-static-ip.sh # Netzwerk-Vorkonfiguration der VM ├── CONFIGURATION-GUIDE.md # ★ Erklärt jede Einstellung in deploy.sh ├── .env.example # Konfigurations-Template ├── README.md # Diese Datei (Deutsch) ├── README.en.md # English version ├── SECURITY.md # Bedrohungsmodell, Incident Response, Härtung ├── VALIDATION-REPORT.html # Unabhängiges Security-Audit (Frameworks 2026) ├── LICENSE # Non-Commercial ├── CONTRIBUTING.md # Beitrags-Richtlinien ├── CHANGELOG.md # Versionshistorie ├── phase1-hardening.md # Proxmox-Firewall + Loxone-Härtung ├── phase2-gateway/ │ ├── nginx-loxone.conf # nginx Reverse-Proxy-Config (Referenz) │ ├── crowdsec-acquis.yaml # CrowdSec Log-Quellen (Referenz) │ └── sysctls.conf # Kernel-Tuning (Referenz) ├── phase3-cutover.md # Router- und Firewall-Umstellung ├── phase4-monitoring.md # Monitoring, Log-Rotation, Tuning ├── security-monitoring/ │ ├── discord-alert.sh # Discord-Webhook-Dispatcher │ ├── gateway-monitor.sh # Security-Monitor (60-Sek-Zyklus) │ ├── network-watchdog.sh # Selbstheilender Netzwerk-Watchdog │ ├── network-watchdog.service # systemd-Service (root) │ ├── network-watchdog.timer # systemd-Timer (60 s) │ ├── gateway-backup.sh # Config-Backup-Script │ ├── geoip-block.sh # GeoIP-Blocking (optional) │ ├── loxprox-monitor.service # systemd-Service │ └── loxprox-monitor.timer # systemd-Timer (60 s) └── assets/ # Diagramme, Screenshots ``` ## 快速开始 1. **创建一个 Debian 12 虚拟机**(至少 1 vCPU、1 GB 内存、5 GB 磁盘——推荐:2 vCPU、2 GB 内存)。 2. **设置静态 IP:** 将 `set-static-ip.sh` 复制到目标虚拟机并执行。 3. **复制 `deploy.sh`**、`detect-loxone.sh` 和 `.env.example` 到目标虚拟机。 4. **找到你的 Loxone:** `chmod +x detect-loxone.sh && ./detect-loxone.sh` - 扫描你的网络,并提供精确的 IP、MAC、固件版本以及相应的配置值。 5. **配置:** 创建你的每个主机的配置: ```bash sudo install -d -m 0750 /etc/loxprox sudo cp deploy.conf.example /etc/loxprox/deploy.conf sudo $EDITOR /etc/loxprox/deploy.conf # 填写 [REQUIRED] 的值 ``` `deploy.sh` 在启动时从此文件读取值——不再从脚本本身读取(参见 v1.5.0)。不确定?请阅读 `CONFIGURATION-GUIDE.md`。 6. **部署:** `chmod +x deploy.sh && sudo ./deploy.sh` 7. **验证:** `sudo bash test-gateway.sh`(50 多项自动化检查) 8. **切换:** 按照 `phase3-cutover.md` 切换路由器转发。 9. **监控:** 按照 `phase4-monitoring.md` 进行调优和观察。 部署脚本是 **幂等的** 并且可安全升级:`git pull && sudo bash deploy.sh` 就足够了。操作员对 `/etc/nginx/sites-available/loxone` 的调整(例如 WebSocket 块)会在每次重新部署时保留。 ## 部署内容 | 层级 | 组件 | 用途 | |------|------|------| | 1 | **nftables** | 默认丢弃入站流量;仅允许来自局域网的 SSH;`:1080` 对互联网开放 | | 2 | **nginx** | 反向代理,10 req/s 速率限制,连接上限,安全头部,慢速攻击超时 | | 3 | **CrowdSec** | IDS,解析 nginx 和 SSH 日志;CAPI 社区源(约 26000 个已知恶意 IP) | | 4 | **防火墙连接器** | 获取 CrowdSec 的阻断决策 → 动态设置到 nftables 中 | | 5 | **AppSec WAF** | 虚拟补丁(200 多个针对特定 CVE 的规则);在每个请求转发前进行检查 | | 6 | **AppArmor** | 激活 nginx 配置文件 | | 7 | **auditd** | 监控对 nginx、crowdsec、nftables、ssh、sudoers 的配置更改 | | 8 | **unattended-upgrades** | 凌晨 03:00 自动重启以应用内核补丁 | | 9 | **安全监控器** | 60 秒循环:CrowdSec 阻断、nginx 错误、认证尝试、资源警报 → 发送到 Discord | | 10 | **网络看门狗** | 自愈监控器:检测网络故障(dhclient 死亡螺旋、路由损坏)并通过服务重启或系统重启自动修复 | | 11 | **日志轮转** | 保留 14 天的 nginx 日志 | | 12 | **配置备份** | 每日自动备份到 `/root/loxprox-backups/` | ## 硬件要求 ### 最低配置(经过测试的配置) | 资源 | 最低 | 推荐 | |-------|-----|------| | CPU | 1 vCPU | **2 vCPU** | | 内存 | **1 GB** | **2 GB** | | 磁盘 | 5 GB | 10 GB | | 操作系统 | Debian 12 (Bookworm) 64-bit | Debian 12 | 参考安装运行在 **1 vCPU、1 GB 内存的 Proxmox 虚拟机** 上,正常运行时约为 **~850 MB RSS**。堆栈本身(nginx + CrowdSec + AppSec + 连接器)在空闲时消耗 100–150 MB;剩余部分由 Debian 基础和页面缓存占用。 **为什么推荐 2 vCPU / 2 GB?** CrowdSec 的漏桶内存与同时活动的攻击者 IP 数量成正比——256 个 IP 约 150 MB,15000 个 IP 约 1.2–1.5 GB([来源](https://www.crowdsec.net/blog/how-to-process-billions-daily-events-with-crowdsec))。广泛分散的扫描(大量唯一源 IP)情况下,内存需求相应增长。AppSec WAF 每个请求大约消耗 **5 ms / 50 mc CPU** 使用启用的虚拟补丁规则集([来源](https://docs.crowdsec.net/docs/appsec/benchmark/))——第二个 vCPU 允许内核保持 nginx 对合法用户的响应性,同时连接器在攻击的前 30–60 秒内追赶并将攻击者丢弃在 nftables 级别。对于纯家庭自动化流量,1 vCPU / 1 GB 运行良好;推荐配置是在攻击情况下起到关键作用的储备。 ### Raspberry Pi 该堆栈 **足够轻量**,可在家居自动化环境中部署在 Raspberry Pi 上。 | 型号 | 架构 | 内存 | 兼容性 | 备注 | |------|------|------|--------|------| | **Pi 5** | ARMv8 (64-bit) | 2–8 GB | ✅ 完全兼容 | 性能过剩。运行毫无压力。 | | **Pi 4** | ARMv8 (64-bit) | 1–8 GB | ✅ 完全兼容 | 理想选择。CrowdSec 提供官方 ARM64 包。 | | **Pi 3** | ARMv8 (64-bit) | 1 GB | ✅ 完全兼容 | 很好的匹配。建议使用 64 位 Raspberry Pi OS。 | | **Pi 2** | ARMv7 (32-bit) | 1 GB | ⚠️ 部分兼容 | CrowdSec 官方要求 64 位。社区报告在使用 64 位内核或手动 ARMv7 构建时成功。未经测试,不建议用于生产。 | | **Pi 1 / Zero (初代)** | ARMv6 | 512 MB | ❌ 不兼容 | CrowdSec 无 ARMv6 二进制文件。 | | **Pi Zero 2 W** | ARMv8 (64-bit) | 512 MB | ⚠️ 勉强可用 | 可使用 64 位操作系统,但 512 MB 内存较紧张。可能需要交换空间和减少场景。 | **在 Pi 上使用类似堆栈的对比项目:** - [CrowdSec on Raspberry Pi 3 with DietPi](https://it-security.dnit.fr/en/crowdsec-installation-on-rpi3-with-dietpi-raspberry-os/) — 自 2021 年起在 Pi 3 上使用 CrowdSec + nftables - [Home Assistant community](https://community.learnlinux.tv/t/reverse-proxy-for-home-automation/4325) — 在 Pi 4 上运行 18 个以上 Docker 容器(包括 nginx 反向代理),CPU 约 18%,内存 2.5 GB - [CrowdSec + Nginx on Raspberry Pi](https://www.polimetro.com/en/How-to-protect-your-Raspberry-Pi-with-CrowdSec/) — 2025 年针对 Pi 3/4/5 的全面指南 - [CrowdSec Firewall Bouncer on low-end VPS](https://github.com/crowdsecurity/crowdsec/issues/3641) — 2 核、2 GB 内存的 OpenCloudOS,带 nginx + ModSecurity + CrowdSec **Pi 上的资源估算:** | 服务 | 内存(典型值) | |------|--------------| | nginx(1 个工作进程) | ~5–10 MB | | CrowdSec 代理 | ~30–50 MB | | CrowdSec 防火墙连接器 | ~10–20 MB | | AppSec WAF | ~20–40 MB | | 操作系统开销 | ~100–200 MB | | **总计** | **~165–320 MB** | Pi 3 或 Pi 4 可轻松胜任。Pi 2 可能使用 64 位内核或源码编译运行,但明确推荐 Pi 3+。 ## 抵御的威胁 | 威胁 | 缓解措施 | |------|----------| | 互联网扫描 / 侦察 | nftables 默认丢弃 + CrowdSec CAPI | | 针对 Web 界面的暴力破解 | nginx 速率限制 + CrowdSec `http-generic-bf` | | 应用层 DDoS | nginx 连接限制、超时、CrowdSec | | 凭证填充 | 速率限制 + CrowdSec `http-cve` | | 利用 Loxone CVE | AppSec WAF(200 多个虚拟补丁) | | SSH 暴力破解 | CrowdSec `ssh-bf` + nftables 源地址限制 | | Slowloris / Slow-Read | 激进的 nginx 超时设置(10–15 秒) | | 配置篡改 | auditd + AppArmor | **未涵盖的威胁:** 大流量 DDoS(线路饱和)。一个 1–2 Gbps 的网关无法应对填充管道的攻击。这需要 ISP 清理或云服务。 ## 配置 所有开关都在 `deploy.sh` 顶部: ``` LOXONE_IP="192.168.1.100" # IP deines Miniservers GATEWAY_IP="192.168.1.50" # statische IP dieses Gateways LAN_SUBNET="192.168.1.0/24" # LAN, das SSH erreichen darf SSH_ALLOWED_SUBNETS=("192.168.1.0/24" "10.0.0.0/24") RATE_LIMIT_REQ_PER_SEC="10" RATE_LIMIT_BURST="100" ENABLE_APPSEC="true" APPSEC_MODE="enforce" # "monitor" oder "enforce" ``` Discord 告警是可选的。在配置区域设置 `DISCORD_WEBHOOK_URL`,或留空以跳过。 ## 测试 部署后运行验证套件: ``` sudo bash test-gateway.sh ``` 它将执行 **50 多项自动化检查** —— 服务、防火墙、代理、CrowdSec、AppSec、监控、内核加固和备份。它还会添加一个测试封禁,然后移除它,以检查完整的阻断链。 ## 运维 ``` # 检查所有组件 sudo bash test-gateway.sh # 查看 CrowdSec Blocks sudo cscli decisions list # AppSec 指标 sudo cscli metrics | grep -A3 Appsec # Live-nginx 访问日志 sudo tail -f /var/log/nginx/loxone-access.log # 手动封锁 IP sudo cscli decisions add --ip 1.2.3.4 --duration 4h --reason "manual" # 解除 IP 封锁 sudo cscli decisions delete --ip 1.2.3.4 # Network Watchdog 状态 sudo systemctl status network-watchdog.timer sudo journalctl -u network-watchdog -f # 禁用/启用 Network Watchdog sudo systemctl stop network-watchdog.timer sudo systemctl enable --now network-watchdog.timer # 重新运行 Deploy (idempotent) sudo bash deploy.sh ``` 完整的事件响应剧本位于 `SECURITY.md`。 ## 授权 **仅限非商业用途** —— 请参见 [LICENSE](LICENSE)。 该软件可自由用于个人、学术、研究和非商业目的,允许修改和再分发。商业使用——直接或间接、全部或部分——明确禁止。 ## 致谢 - [CrowdSec](https://www.crowdsec.net/) —— 协作式 IDS/WAF 引擎,使得社区驱动的阻断成为可能 - [Loxone](https://www.loxone.com/) —— 本网关所保护的家居自动化平台(尽管他们不再修补第一代) - 家居自动化社区 —— 如此清晰地记录了第一代的限制,以至于 AI 能够围绕它构建解决方案
标签:AI辅助, CIS加固, Debian, Elastic, Loxone, Loxone Miniserver, Shell脚本, Streamlit, TLS终止, WAF, 人工审核, 反向代理, 多因素认证, 安全网关, 实验性项目, 应用安全, 时间线生成, 智能家居, 网络层防护, 老旧设备安全, 访问控制, 防火墙