Timikana/rootwarden
GitHub: Timikana/rootwarden
基于 Docker 部署的 Linux 服务器 DevSecOps 集中管理平台,集成了系统运维、安全审计与 CVE 漏洞扫描功能。
Stars: 1 | Forks: 0
[🇬🇧 English version](README.en.md)
# 🔐 RootWarden v1.13.0
## 功能特性
### 服务器管理
- **SSH 密钥** — 批量部署、密钥时效追踪(超过 90 天告警)
- **Linux 更新** — 实时流式 APT update/upgrade,如无 sudo 则回退到 `su -c`
- **iptables 防火墙** — 从数据库查看、编辑、备份/恢复规则
- **Fail2ban** — 服务检测(SSH/FTP/Apache/Nginx/Mail)、启用 jails、封禁/解封 IP、自动安装
- **systemd 服务** — 启动、停止、重启 Linux 服务。journalctl 日志、自动分类、受保护服务
- **SSH 审计** — 扫描 sshd_config、安全评分(A-F)、一键修复、配置编辑器、备份/恢复、指令 ON/OFF 切换、重载 sshd
- **多代理监控** — 通过 SSH 部署和配置监控代理。支持 Zabbix Agent 2、Centreon Monitoring Agent、Prometheus Node Exporter 和 Telegraf。按平台进行全局配置、按服务器进行覆盖、远程配置编辑器、备份/恢复、多代理徽章、一键扫描所有代理
- **自定义标签** — 为服务器打标签(web、数据库、生产、dmz 等)并按标签过滤
### CVE 漏洞扫描
- **OpenCVE** — 支持 cloud(app.opencve.io)和 on-prem v2(Bearer token)
- **实时流式处理** — JSON-lines、逐包进度显示
- **过滤器** — 按严重程度(CRITICAL/HIGH/MEDIUM)和年份过滤
- **CSV 导出** — 每台服务器一键下载
- **全局概览** — 页面顶部显示整体状态
### 安全与合规
- **Ed25519 平台密钥对** — 无密码 SSH 认证、渐进式迁移、删除数据库中的机密信息
- **rootwarden 服务账户** — 专用的 Linux 用户,配置 sudoers NOPASSWD:ALL,无需密码
- **邮件重置密码** — 登录页提供“忘记密码”链接、1 小时有效期 token、PHPMailer
- **安全启动(start.sh)** — 自动对 .env 执行 chmod 600、检测默认机密、在 Docker 日志中隐藏密码
- **force_password_change** — 首次登录时强制修改密码(superadmin 和新用户)
- **首次启动安全加固** — install.sh 生成密码,而非在数据库中硬编码
- **双重加密** — libsodium (sodium:) + AES-256-CBC (aes:),PHP ↔ Python 兼容
- **HKDF 密钥派生** — 为密码(rootwarden-aes)和 TOTP 机密(rootwarden-totp)派生不同的密钥
- **数据库中 TOTP 加密** — 2FA 机密加密(Sodium/AES),向后兼容纯文本
- **2FA TOTP** — 强制多因素身份认证
- **RBAC** — 3 种角色(user、admin、superadmin)+ 14 个细粒度权限
- **DB-verified 认证** — checkAuth/checkPermission 在每次请求时查询数据库,session 仅作为 UI 缓存
- **防提权** — 所有管理端点上的自我编辑保护,SA 不可修改,最后一个 SA 受保护
- **统一的 CSRF** — checkCsrfToken() 支持 POST body、header X-CSRF-TOKEN、body JSON(时序安全)
- **SSH 双重认证** — 密钥对模式(sudo NOPASSWD)+ 密码模式(通过临时脚本 su -c),自动检测
- **密码过期** — 按用户可配置(Global/Exempt/30-365天)
- **会话超时** — 不活动后自动注销(可配置)
- **审计日志** — 记录所有管理操作,支持 CSV 导出和筛选
- **登录历史** — 追踪所有尝试(IP、user-agent、状态)
- **合规报告** — 可打印 HTML + 带 SHA-256 哈希的 CSV
- **条款与隐私** — 包含 GDPR(访问/更正/删除/可携带权)的专业页面
- **自动数据库备份** — 压缩 mysqldump,可配置保留策略
- **本地编译 Tailwind** — 无 unsafe-eval 的 CSP,不使用外部 CDN
- **Docker 隔离网络** — 数据库仅位于内部网络,无互联网访问
- **MySQL 权限受限** — 应用程序用户不使用 ALL PRIVILEGES(SELECT/INSERT/UPDATE/DELETE + 迁移)
- **修复 28+ 安全漏洞(3 次审计)** — SQLi、CSRF、XSS、时序攻击等
### 通知
- **Webhooks** — Slack、Teams、Discord、通用(严重 CVE、服务器离线、部署)
- **邮件** — CVE 报告 HTML、用户欢迎邮件(SMTP)
### 仪表盘
- **安全告警** — 未启用 2FA 的用户、旧 SSH 密钥、离线服务器、严重 CVE
- **服务器状态** — 每台服务器的 OS 版本、状态、CVE、最近检查时间
- **快捷方式** — 根据权限快速访问模块
## 技术栈
| 组件 | 技术 |
|-----------|------------|
| Frontend | PHP 8.2 + Apache, Tailwind CSS (本地编译), htmx 2.0.4, vanilla JS |
| Backend API | Python 3.11, Flask, Hypercorn (ASGI) |
| Base de données | MySQL 9.1 |
| Conteneurisation | Docker Compose |
| Reseau Docker | Dual (内部 + 外部) |
| Chiffrement | libsodium (PyNaCl) + AES-256-CBC |
| Proxy API | PHP → Python (消除 CORS,隐藏 API_KEY) |
| i18n | 1424 个 FR/EN 键值,每种语言 19 个模块 |
| Tests | pytest (139 个测试), ruff (Python linter), php -l (PHP lint) |
| CI/CD | GitHub Actions (lint → test → build Docker) |
## 安装
### 前置条件
- Docker + Docker Compose
### 快速开始
```
git clone https://github.com/Timikana/rootwarden.git
cd rootwarden
cp srv-docker.env.example srv-docker.env
# 编辑 srv-docker.env :生成唯一密钥 (openssl rand -hex 32)
chmod 600 srv-docker.env
./start.sh -d
```
### 访问
- 界面:**https://localhost:8443**
- superadmin 账户:首次启动时自动生成密码。
请查看:`docker exec cat /var/www/html/.first_run_credentials`
首次登录时必须更改密码。
### 预生产环境(可选)
```
# 添加一个 Debian 测试服务器 + mock OpenCVE
docker-compose --profile preprod up -d
```
### 关键环境变量
| 变量 | 描述 |
|----------|------------|
| `SECRET_KEY` | AES/Sodium 加密密钥(64 字符 hex) |
| `API_KEY` | frontend → backend 认证 |
| `OPENCVE_URL` | OpenCVE URL(cloud 或 on-prem) |
| `OPENCVE_TOKEN` | OpenCVE v2 on-prem 的 Bearer token |
| `WEBHOOK_URL` | Slack/Teams/Discord Webhook URL |
| `SESSION_TIMEOUT` | 会话超时(分钟,默认 30) |
| `SSL_MODE` | auto / custom / disabled |
| `INIT_SUPERADMIN_PASSWORD` | superadmin 初始密码(空 = 自动生成,推荐) |
完整列表请参见 `srv-docker.env.example`。
## 迁移
```
# 检查迁移状态
docker exec gestion_ssh_key_python python /app/db_migrate.py --status
# 应用待处理的迁移
docker exec gestion_ssh_key_python python /app/db_migrate.py
```
## 文档
完整的技术文档可在应用内访问:**https://localhost:8443/documentation.php**
参考文件:
- `ARCHITECTURE.md` — 所有文件、数据库表、数据流的图谱
- `CHANGELOG.md` — 版本历史(语义化版本控制)
## 生产环境安全加固
### 部署前检查清单
1. **唯一机密** — 使用 `openssl rand -hex 32` 生成所有密钥
2. **start.sh** — 使用 `./start.sh` 代替 `docker-compose up`(自动 chmod + 机密验证)
3. **文件权限** — `chmod 600 srv-docker.env`(在 Linux 上通过 start.sh 自动完成)
4. **删除初始凭据** — 首次登录后:
docker exec rm /var/www/html/.first_run_credentials
5. **清空 INIT_SUPERADMIN_PASSWORD** — 安装后在 srv-docker.env 中删除该值
6. **SSL** — 使用 SSL_MODE=custom 并提供您自己的证书(Let's Encrypt、企业证书)
7. **主机访问** — 将 Docker 服务器的 SSH 访问权限限制为仅限基础架构管理员
8. **备份** — 启用 BACKUP_ENABLED=true 并设置适当的保留策略
9. **监控** — 配置 webhooks(Slack/Teams)以接收 CVE 和服务器离线告警
## 常见问题 / 故障排除
### 在 `docker-compose down -v` 后无法登录
`down -v` 会删除卷(数据库)。重新启动时,`init.sql` 会使用无效的占位符创建账户。
必须运行 `install.sh` 来生成真正的密码。如果 `www/.installed` 标志仍然存在(bind mount),请将其删除:
```
rm -f www/.installed
./start.sh -d
docker exec cat /var/www/html/.first_run_credentials
```
凭据将位于 `.first_run_credentials` 文件中。如果您在 `srv-docker.env` 中定义了 `INIT_SUPERADMIN_PASSWORD`,则以该密码为准。
始终使用 `start.sh` 代替 `docker-compose up` 以利用安全检查。
### Python 容器无法启动(unhealthy / FileNotFoundError SSL)
后端 SSL 证书在启动时自动生成。如果在 `git pull` 后错误仍然存在,则 Docker 镜像缓存了旧代码:
```
docker compose down
docker compose build --no-cache python
docker compose up -d
```
### Python 容器在 `git pull` / `git reset --hard` 后崩溃
在历史记录重写(`filter-repo`、`rebase`)之后,本地 Docker 镜像已过时。必须 **rebuild**:
```
docker compose build --no-cache
docker compose up -d
```
简单的 `up -d` 会重用缓存的镜像 — 它不会检测到复制文件(Dockerfile 中的 `COPY`)中的更改。
### 默认密码不起作用
密码不再在 `init.sql` 中硬编码。它们在首次启动时由 `install.sh` 生成。使用 `start.sh` 启动并查看初始凭据:
```
docker exec cat /var/www/html/.first_run_credentials
```
如果文件不存在,则 `install.sh` 未运行(存在 `.installed` 标志或数据库连接错误)。删除标志并重新启动:
```
rm -f www/.installed
docker compose restart php
```
### 在 CVE 扫描/更新期间导航被阻塞
此问题已在 v1.9.1 中修复(`api_proxy.php` 中的 `session_write_close()`)。
如果您使用的是较早的版本,请更新。
### CVE 扫描返回 0 个漏洞,但实际上存在
检查 **CVSS 阈值**:每台服务器的下拉菜单(Scanner 按钮旁边)可能与全局阈值不同。阈值 `9+`(CRITICAL)会过滤掉所有 HIGH 和 MEDIUM 的 CVE。将其降低到 `0+` 以查看所有内容。
还要检查您的浏览器是否未使用缓存的 JS(Ctrl+Shift+R)。
### `docker compose down -v` — 会发生什么?
| 标志 `-v` | 数据库数据 | SSH 密钥对 | 会话 | 密码 |
|-----------|-------------|-------------|----------|-----------|
| 不带 `-v` | 保留 | 保留 | 保留 | 保留 |
| 带 `-v` | **删除** | **删除** | 删除 | 由 install.sh 通过 start.sh 重新生成 |
**切勿在生产环境中使用 `-v`**,除非您想从头开始。
在 `down -v` 之后,使用 `./start.sh -d` 重新启动以重新生成凭据。
## 许可证
MIT
*RootWarden v1.12.0 — 2026-04-11*
标签:Centreon, CISA项目, DevSecOps, Docker, Fail2ban, ffuf, iptables, IT资产管理, libpcap, Linux管理, OpenCVE, PE 加载器, PHP8.2, Python3.11, sshd_config, SSH管理, systemd, Telegraf, Zabbix, 上游代理, 动态API解析, 安全合规, 安全防御评估, 容器化部署, 批量部署, 服务器管理, 服务编排, 监控部署, 系统加固, 网络代理, 自动化运维, 请求拦截, 防火墙管理