Orangewarrior/kraken-ui
GitHub: Orangewarrior/kraken-ui
Kraken UI 是一个用 Rust 编写的安全加固型 Web 管理面板,用于操作和监控 KrakenWAF 部署,提供实时攻击监控、规则管理和多角色访问控制。
Stars: 0 | Forks: 0
# Kraken UI
**当前版本:0.19.0**
Kraken UI 是一个小型且经过安全强化的 Web 应用程序,用于操作 KrakenWAF 部署:管理操作员、实时监控被拦截的攻击,以及通过纯 TLS 控制台读取实时的 WAF 指标。它使用 Rust 编写,并结合了 [Axum](https://github.com/tokio-rs/axum)、[Askama](https://github.com/askama-rs/askama) 和 [SeaORM](https://www.sea-ql.org/SeaORM/),不携带任何 CDN 资源,也不运行任何内联 JavaScript。
- **默认安全。** 强制使用 TLS,session 和 CSRF cookies 使用 `__Host-` 前缀,严格的 Content-Security-Policy 禁止内联脚本和样式。登录受速率限制并经过时间均衡处理,session 可持久化且可撤销,使用 SQLite 或 Redis 的 GCRA 请求限制保护每一个路由。
- **密码的深度防御。** Argon2id 哈希(兼容 libsodium)封装在带有基于用户的 AAD 的 XChaCha20-Poly1305 信封中,因此哈希值永远无法重放到另一个账户;明文保存在 `Zeroizing` 中。
- **可选的双因素认证。** 任何操作员都可以使用 TOTP 验证器应用和一次性恢复代码保护其账户。密钥和代码密封在与密码相同的基于用户的信封中。请参阅 [docs/mfa.md](docs/mfa.md)。
- **可审计。** 认证和操作员管理事件会写入专门的 `audit.jsonl`,并且 WAF 指标通道会绑定到您配置的证书,并使用 KrakenWAF 的共享 bearer token 进行身份验证。
- **实时规则管理。** 管理员和操作员可以在运行时通过 **Rule management → CMC rules** 菜单启用或禁用 KrakenWAF CMC 检测模块。UI 代理到 KrakenWAF 的规则管理 API,并使用基于请求的 *Rorschach* token(一种时间窗口化的 BLAKE2b-256 密钥 MAC)对每个请求进行身份验证,因此浏览器永远不会持有密钥。在 **Rule management → Regex rules** 中,他们还可以在语法高亮编辑器中查看和替换 regex 和关键字规则文件(`body_regex`, `path_regex`, `header_regex`, `vectorscan_list`, `scanners`)的内容;每次提交在到达 WAF 之前都会验证其规则结构。请参阅 [docs/rule-management.md](docs/rule-management.md)。
- **管理员控制的稳定更新。** 管理员可以从 Updates 菜单下载、验证、编译并安装最新发布的 Kraken UI 版本。运行时数据库和本地配置保持不变。
- **依赖树中无意外。** 每个传递性许可证例外都被固定在 `deny.toml` 中,并且 CI 在每次推送时都会运行 Clippy、Semgrep、CodeQL、cargo-audit、cargo-deny 和 OSV Scanner。
## 为什么选择 Kraken UI?
大多数管理面板依赖于大量的 JavaScript 和宽松的安全态势。Kraken UI 采取了相反的方法:最小且合理的攻击面、浏览器中没有第三方运行时,以及失效即关闭的安全控制。如果安全头文件有拼写错误,服务器将拒绝启动。如果未配置加密密钥,它将无法启动。如果不满足密码策略,则永远不会创建该账户。
如果您运行 KrakenWAF 并且想要一个可以端到端推理的控制台,它是一个很好的选择。
## 快速开始
您需要 **Rust 1.95 或更高版本**(2024 edition)和用于生成密钥的 OpenSSL。`rust-toolchain.toml` 固定了经过测试的编译器。
**1. 配置 `conf/setup.yaml`**,包含您的证书、私钥、TLS 地址、UI 自身的数据库以及 KrakenWAF 警报数据库:
```
cert-ca: certs/ca.pem
key: certs/key.pem
listen: "127.0.0.1:3443"
db-ui: db/kraken-ui.sqlite
db-waf-alerts: "../KrakenWAF/logs/db/vulns_alert.db"
waf-endpoint: "https://127.0.0.1:4343"
waf-cert-ca: "../KrakenWAF/certs/cert.pem"
log-dir: log
session-timeout-minutes: 30
```
**2. 检查 `conf/ratelimit.yaml`。** 默认设置启用了本地的 `axum-governor` GCRA 以及持久化的 SQLite 状态(位于 `db/kraken-ui-ratelimit.sqlite`)。同一个文件还控制持续速率、突发、基于 IP 的并发、TLS 握手超时和接受的请求超时。Redis 可以协调多个副本,并且需要 TLS 以及基于文件优先的 ACL 凭据。请参阅 [Rate limiting](docs/rate-limiting.md)。
**3. 提供一个 32 字节的 XChaCha20-Poly1305 密钥**(格式为 Base64)。对于本地开发,使用环境变量即可:
```
export KRAKEN_UI_PASSWORD_KEY="$(openssl rand -base64 32)"
export KRAKEN_UI_PASSWORD_KEY_ID='primary-v1'
```
**4. 提供 KrakenWAF 可观测性 bearer token。** KrakenWAF 在端口 `4343` 上的专用监听器和 Kraken UI 必须解析为相同的值:
```
export BEARER_PASSWORD="$(openssl rand -hex 32)"
```
解析顺序为 `BEARER_PASSWORD_FILE`、`/run/secrets/krakenwaf/BEARER_PASSWORD`,然后是 `BEARER_PASSWORD`。当两个服务运行在同一主机上时,它们可以读取相同的挂载密钥或 systemd 凭据。有关文件、systemd 和故障排除的示例,请参阅 [WAF bearer authentication](docs/waf-bearer-auth.md)。
对于生产环境中的 UI 加密密钥,建议使用权限为 `0600` 的文件(应用程序拒绝可被组或其他用户读取的密钥文件):
```
openssl rand -base64 32 > /secure/path/kraken-ui-password.key
chmod 600 /secure/path/kraken-ui-password.key
export KRAKEN_UI_PASSWORD_KEY_FILE=/secure/path/kraken-ui-password.key
```
在生产环境中,还需要设置一个**稳定的会话签名密钥**(≥ 64 字节,Base64),以便 session 在重启后依然存在并能在副本间进行验证:
```
export KRAKEN_UI_SESSION_KEY="$(openssl rand -base64 64)"
```
**5. 创建第一个管理员**并运行应用程序:
```
export KRAKEN_UI_ADMIN_PASSWORD='Use-A-Unique!Strong9Password'
export KRAKEN_UI_ADMIN_EMAIL='admin@example.invalid'
cargo run
```
初始用户名为 `admin`。密码使用 Argon2id 进行哈希处理,静态加密且绝不写入日志。
不想将密码放在环境中?当 operators 表为空时,您可以从 localhost 引导一次。一旦存在任何操作员,该端点将返回 `410 Gone`。
Release 构建**需要** bootstrap token,因此请设置一个并在请求中发送(debug 构建中它是可选的):
```
export KRAKEN_UI_FIRST_TIME_TOKEN="$(openssl rand -hex 32)"
curl --cacert certs/ca.pem \
--data-urlencode 'username=admin' \
--data-urlencode 'email=admin@example.invalid' \
--data-urlencode 'user_type=admin' \
--data-urlencode 'password=Use-A-Unique!Strong9Password' \
--data-urlencode "token=$KRAKEN_UI_FIRST_TIME_TOKEN" \
https://127.0.0.1:3443/kraken_ui/auth/first_time
```
然后在 `https://host:port/kraken_ui/login` 登录。
## 内部详情
| 区域 | Endpoints |
|-------------|-----------|
| Dashboard | `/kraken_ui/auth/admin_panel`, `/kraken_ui/auth/dashboard` |
| Operators | `/kraken_ui/auth/insert_user`, `/delete_user`, `/edit_user`, `/show_user_table` |
| 监控 | `/kraken_ui/auth/show_attacks`, `/kraken_ui/auth/view_waf_request/?id=` |
| 规则管理 | `/kraken_ui/auth/rule_management/cmc`, `/kraken_ui/auth/api/rule_management/cmc`, `/kraken_ui/auth/rule_management/cmc/update`, `/kraken_ui/auth/rule_management/regex`, `/kraken_ui/auth/rule_management/regex/edit`, `/kraken_ui/auth/rule_management/regex/update` |
| 账户 | `/kraken_ui/auth/update_password`, `/kraken_ui/auth/mfa` |
| 更新 | `/kraken_ui/auth/update_kraken_ui` (仅限管理员) |
| 双因素 | `/kraken_ui/auth/mfa_challenge`, `/kraken_ui/auth/mfa_verify` (登录挑战) |
### 角色
| 角色 | 可以登录 | 可见内容 |
|------|-------------|------|
| `admin` | 是 | 所有内容:dashboard、攻击、单次攻击详情视图(**包括明文的敏感参数值**)、完整的 ACL 菜单、Updates、Rule management 以及自助账户设置。 |
| `operator` | 是 | 与管理员相同的 dashboard、攻击表、攻击详情视图、**Rule management** 和账户设置——但**没有** ACL 和 Updates 菜单,并且攻击详情视图中的**敏感参数值会被掩码**。 |
| `auditor` | 是 | 只读。Dashboard、攻击监控器(表格和单次攻击详情视图,其中**敏感参数值会被掩码**)及其自身的账户设置(更改密码、管理双因素)以及登出——**没有** Rule management、ACL 或 Updates。 |
侧边栏在 `src/view/templates/admin_sidebar.html` 中定义一次;ACL 和 Updates 部分仅在控制器传递 `show_acl = true`(管理员)时才会渲染,而 Rule management 部分仅在传递 `show_rule_management = true`(管理员和操作员,绝不包含审计员)时才会渲染。
### 单次攻击详情视图
点击攻击表中的 **ID** 或 **client IP** 列会在新标签页中打开 `view_waf_request`。它显示了完整的发现结果——标题、颜色编码的严重程度、CWE、描述、参考、人类可读的时间戳、规则匹配、client IP、URI 和全路径证据——最后是浅色主题、语法高亮的代码框中的 WAF `request_payload`。该 payload 通过模板默认的 HTML 转义进行渲染——从未经过 Ammonia 清理,因此保留了攻击者的确切字节——并且通过仅构建 DOM 节点(不使用 `innerHTML`)在客户端进行高亮处理,因此它在严格的 CSP 下保持惰性。
捕获的请求/响应证据——URI、全路径证据和匹配的 payload——通常带有凭据(`password=…`, `token=…`, `senha=…`)。只有**管理员**能看到这些字节的明文:对于操作员或审计员,任何以众所周知的秘密命名的参数值(涵盖多种语言)在页面渲染之前都会被替换为 `+++++`。请参阅 [docs/sensitive-data-redaction.md](docs/sensitive-data-redaction.md)。
## 截图
控制台快速导览——纯 TLS、无 CDN 资源且无内联 JavaScript。
### 安全控制台登录
强化的登录:`__Host-` session 和 CSRF cookies,受速率限制和时间均衡的认证,以及在前端和后端都强制执行的最少 14 个字符的密码策略。

### WAF 可观测性 Dashboard
来自 KrakenWAF 的实时 HTTPS 指标和 SQLite 聚合:已检查和已拦截的请求、平均延迟、每个 CMC 模块的检测、每个模块的拦截,以及主要的拦截国家和 IP——全部以本地 SVG 绘制成图表。

### 单次攻击详情视图
通过点击攻击的 **ID** 或 **client IP** 从攻击表中打开:包含颜色编码的严重程度、CWE、描述、规则匹配、URI 以及经过 HTML 转义和语法高亮的请求/响应 payload 的完整发现。

## 项目布局
```
src/
├── routes/ # endpoint declarations
├── controllers/ # HTTP handlers: CSRF, sessions, rendering, pagination
├── models/ # SeaORM entities, repositories and the session store
├── services/ # password crypto, WAF metrics and rule-management boundaries
├── security/ # sanitisation, password policy, headers, CSRF, rate limiting
├── middleware/ # auth, global security headers and the per-IP rate limiter
└── view/ # Askama templates and local assets
```
如需了解更宏观的视角,请参阅 [`docs/`](docs/) 目录:
- [架构](docs/architecture.md) — 各个组件是如何组合在一起的。
- [可视化架构](docs/visual-architecture.md) — 可编辑的 draw.io 图表,包含 SQLite 和 Redis GCRA 部署、HTTP 处理和 KrakenWAF 集成。
- [WAF bearer authentication](docs/waf-bearer-auth.md) — 共享 token 加载、端口 `4343`、systemd 和故障排除。
- [规则管理](docs/rule-management.md) — CMC 控制平面、Rorschach token、共享密钥和 `rorschach_keygen` 工具。
- [源码更新](docs/source-updates.md) — 仅限管理员的稳定版本更新、保留的文件、构建要求和恢复。
- [安全性](docs/security.md) — 安全控制及其存在的原因。
- [敏感数据脱敏](docs/sensitive-data-redaction.md) — 攻击详情视图中非管理员的敏感参数值是如何被掩码的。
- [安全审查](docs/security-review.md) — 常见发现及其状态。
- [数据库与 ACL](docs/database.md) — schema、sessions 和路由。
- [双因素认证](docs/mfa.md) — TOTP 注册、登录和恢复。
- [运维操作](docs/operations.md) — 配置、环境变量、日志和限制。
- [依赖许可证](docs/dependency-licenses.md) — 许可证策略。
## 构建和测试
```
cargo fmt --check
cargo test
cargo clippy --all-targets -- -D warnings
```
这三项测试必须在合并更改之前通过——它们正是 CI 所运行的。
## 安全
发现了漏洞?请**不要**公开提 issue。请私下给维护者发送电子邮件,以便我们在披露之前修复它。威胁模型和实施的控制措施记录在 [docs/security.md](docs/security.md) 中,而已知缺失的持续审查记录在 [docs/security-review.md](docs/security-review.md) 中。
## 许可证
Kraken UI 基于 [MIT](LICENSE) 许可证发布。
标签:AppImage, Rust, WAF, Web安全, Web应用防火墙, Web管理界面, 可视化界面, 安全测试工具, 搜索引擎查询, 网络流量审计, 蓝队分析, 运维管理系统, 通知系统