Releases: zzmlb/secgate
v1.5.6 - 白名单 SPOF 告警 + Token 自动过期迁移
P1: Dashboard 红条新增 5 类配置风险告警
同服务暴露告警一起显示:
⚠️ 白名单 SPOF:只有 1 个 IP 受信任,该 IP 被入侵即全网沦陷⚠️ Token 无过期:历史 token 没设过期时间(本次会自动迁移)⚠️ Token <7 天过期或已过期⚠️ config.json 权限不是 600⚠️ Fail2Ban secgate-auth jail 未启用
P3: Token 自动迁移到 90 天过期
load_config() 每次启动会给没有 expires 字段的历史 token 自动设为 90 天后过期(幂等,不会覆盖已有过期时间)。这与 create_token 默认逻辑一致。
升级方式:secgate update
v1.5.5 - P0 修复 Fail2Ban filter 失效 + 收紧 rate limit
渗透测试发现的 严重安全 bug,必须升级。
🔴 P0-1: Fail2Ban secgate-auth filter 自 v1.5.1 起就没工作过
失败的 token 尝试虽然写到日志,但 filter 正则和 datepattern 冲突,never matched,从来没封过任何人。升级前你可以自查:
fail2ban-client status secgate-auth | grep 'Total failed'
# 如果是 0 但日志里有 LOGIN_FAILED → 你受影响了🔴 P0-2: 应用层 rate limit 太宽松
10 次/5 分钟 → 5 次/1 分钟。超限时也记 RATE_LIMITED 日志让 fail2ban 叠加封禁。
升级
secgate update(或按节点 curl install.sh | bash -s 1.5.5)。
v1.5.4 - 修复 nginx sites-enabled 不同步 (critical config bug)
修复一个自 v1.0.0 就存在的 关键配置 bug:
generate-nginx.py 只写入 sites-available/gateway.conf,完全没处理 sites-enabled/。在 sites-enabled 是独立文件(非 symlink)的节点上,Dashboard 新增/修改受保护端口、改白名单永远不会生效,nginx reload 是 no-op。
本次修复后会自动检测并同步:
- sites-enabled 是 symlink → 什么都不做(已自动同步)
- sites-enabled 是独立文件 →
shutil.copy2覆盖 - sites-enabled 不存在 → 创建 symlink
强烈建议所有节点升级。 你可以这样快速检查节点是否有此 bug:
diff /etc/nginx/sites-available/gateway.conf /etc/nginx/sites-enabled/gateway.conf
# 如果输出不一致 → 有 bug,升级后会自动修复升级方式:secgate update
v1.5.3 - 修复 nginx 反代吃掉 WebSocket 升级头
修复 v1.5.2 一个重要 bug:\n\ngenerate-nginx.py 默认模板的 proxy_set_header Connection ""; 会清除 WebSocket 升级头,导致:\n- noVNC (6080) 页面能打开但连不上桌面\n- Chainlit (8502) 流式响应被中断\n- 任何 SSE 长连接的业务端口被 SecGate 保护后无法工作\n\n修复方案:用 map $http_upgrade $secgate_connection_upgrade 正确传递 Upgrade/Connection 头。普通 HTTP 请求行为不变。\n\n升级方式:secgate update 或 curl ...install.sh | bash -s 1.5.3
v1.5.2 - 修复 dashboard API 路径硬编码
修复 v1.5.1 /api/iptables-health 和 /api/danger-services 硬编码了 /root/pj226/ 路径的问题,改为动态解析。对于非 master 节点(安装在 /opt/secgate/)的用户必须升级到本版本。
v1.5.1 - 6 项安全加固(审计补丁)
🔒 安全加固 (6 fixes)
继 v1.5.0 修复 iptables 自动恢复后,基于 114.66.26.139 节点被入侵事件的审计,补发安全加固补丁。
H1 - 敏感文件权限
config.json 写入时强制 0600(原 0644),保护 token + 白名单不被非 root 账号(如被入侵的业务账号)读取。secgate start 每次启动都会修正已有文件权限。
H2 - Cookie Secure flag
检测到 HTTPS(request.is_secure 或 X-Forwarded-Proto: https)时自动启用 Secure=True,纯 HTTP 部署下不影响。
M1 - Fail2Ban 集成网关认证失败
新增 filter.d/secgate-auth.conf + jail.d/secgate-auth.conf,10 分钟 5 次 token 失败 → 封禁 1 小时。secgate setup 自动部署。
M2 - 凭证轮换
新增 secgate rotate-creds 命令,一键重置 Dashboard 密码。secgate creds 显示凭证超过 180 天会提示轮换。
M3 - 白名单 IP 加固(最重要)
白名单 IP 不再从 iptables 直接 RETURN,改为走 nginx → /auth/verify → Gateway 识别白名单 bypass token。这样:
- ✅ 所有访问都有 nginx 日志
- ✅ 白名单被入侵时 Fail2Ban 能封锁异常访问
- ✅ 告别"白名单一刀切"
仅 127.0.0.0/8 和本机公网 IP 仍保留 iptables RETURN(防环回死循环)。
L1 - 危险服务红色告警条
Dashboard 顶部新增告警横幅:检测到对外暴露但未被 iptables REDIRECT 保护的 VNC/Redis/MongoDB/Docker API 等会红色置顶提示。
目的:避免"装了 SecGate 就万事大吉"的预期陷阱。114 节点就是因为 5900 虽然在配置里,但 iptables 未生效,导致直连被攻破。
升级方式
secgate update
# 或
curl -fsSL https://github.com/zzmlb/secgate/raw/main/packaging/install.sh | sudo bash -s 1.5.1v1.5.0 - 修复 iptables 防护自动恢复
🔒 安全修复 (Critical)
修复了一个 严重安全缺陷:iptables 的 GATEWAY_AUTH 链在服务重启或系统重启后不会自动重建,导致本应被 Token 认证保护的端口(VNC/noVNC/数据库等)静默暴露到公网。
已知受影响:
- 服务重启 / 系统重启 / iptables flush 后,防护规则丢失
- Dashboard 仍显示"已保护",但实际公网可直连原始端口
- 攻击者可绕过 Nginx token 认证层直接访问业务服务
修复内容 (P0-P3)
| 优先级 | 修复 |
|---|---|
| P0 | secgate start/restart 启动前自动执行 setup-iptables.sh |
| P1 | setup-iptables.sh 末尾持久化到 /etc/iptables/rules.v4 |
| P2 | 新增 secgate-iptables-check.timer 每 5 分钟自动巡检 + 自愈 |
| P3 | Dashboard 顶部健康灯(绿/黄/红),点击可查看详情并一键修复 |
其他改进
- Token scope 改用指纹存 cookie,删除 Token 后立即撤销 session
- UI:多端口选择改为单个"全选/反选"toggle 按钮
升级方式
curl -fsSL https://github.com/zzmlb/secgate/raw/main/packaging/install.sh | sudo bash -s 1.5.0
# 或
secgate update升级后会自动:
- 重建 iptables 防护链
- 持久化规则到磁盘
- 启用每 5 分钟健康检查 timer
- 安装 iptables-persistent(开机自动恢复)
v1.4.0
What's New
WAF 防护子标签页
- 安全看板新增 WAF 防护 子标签页,展示 Nginx 403 拦截统计
- 支持攻击类型分类:恶意扫描器 UA、漏洞探测、SQL 注入、XSS、路径遍历、命令注入
- 拦截趋势折线图(天/时维度切换)、攻击类型分布饼图
- Top 10 攻击 IP(含地理位置)、最近 50 条拦截日志详情
- 统计卡片:总拦截数、攻击 IP 数、WAF 规则数、攻击类型数
WAF Nginx 规则生成
generate-nginx.py新增 WAF 规则:恶意 UA 拦截 + 恶意路径拦截,共 88 条规则
改进
- 异常请求检测模块排除已被 WAF 拦截的 403 请求,避免重复展示
- WAF 数据采集使用 120s TTL 缓存,避免频繁扫描日志文件
安全加固
- 所有前端渲染均使用 escHtml 转义(包括修复已有的 renderFWTopIPs XSS 漏洞)
- recent_blocks 内存上界保护,防止大量 403 日志导致内存溢出
- API 响应中不暴露 User-Agent 原始值
v1.3.9
What's New
- AI 助手会话持久化: 同一聊天窗口内的消息现在共享上下文,AI 能记住之前的对话内容
- 利用 Claude CLI
--resume机制实现 - 刷新页面或重新打开自动创建新会话
- resume 失败时自动降级为新会话
- 利用 Claude CLI