* LICENSE —— MIT
* THIRD-PARTY-NOTICES —— 依赖清单、再分发合规说明(含随仓库分发的
Apache ECharts 5.6.0 / Apache-2.0)与自查清单
* CONTRIBUTING.md —— 开发环境、五层验证、必须遵守的不变量、提交规范
* SECURITY.md —— 漏洞私有报告渠道、已有措施、已知非目标
* CODE_OF_CONDUCT.md —— 改编自 Contributor Covenant 2.1
* .github/ —— Bug 报告 / 功能建议表单 + PR 模板
* .editorconfig —— 与 .gitattributes 保持一致
* 全部 Python / Shell 源文件加 SPDX-License-Identifier: MIT 头
* README 增加「开源与许可」章节与许可标识
68 行
3.5 KiB
Markdown
68 行
3.5 KiB
Markdown
# 安全策略(Security Policy)
|
||
|
||
## 支持范围
|
||
|
||
本项目按「自托管、局域网内使用」的定位开发。安全修复只针对当前主分支与最新发布版本。
|
||
|
||
| 版本 | 是否接受安全修复 |
|
||
|---|---|
|
||
| `1.1.x`(当前) | ✅ |
|
||
| `< 1.1` | ❌ 请先升级 |
|
||
|
||
## 如何报告漏洞
|
||
|
||
**请不要在公开 Issue 里贴出可直接利用的细节**(含真实 Cookie、`secret_key`、可复现的绕过步骤)。
|
||
|
||
请通过以下任一私有渠道联系维护者:
|
||
|
||
<!-- TODO(维护者):首次公开发布前,把下面这行替换为真实可达的安全联系邮箱 -->
|
||
- 邮件:`<安全联系邮箱>`(占位,待维护者补全)
|
||
- 或通过代码托管平台(Gitea)的站内私信联系仓库管理员
|
||
|
||
请在报告里尽量包含:
|
||
|
||
1. 受影响的版本 / 提交号
|
||
2. 复现步骤与最小复现(可脱敏)
|
||
3. 影响范围(能读到什么、能改到什么)
|
||
4. 如果有,你建议的修复方向
|
||
|
||
我们会在 **7 天内**确认收到,并在修复发布后于 CHANGELOG 里致谢(除非你希望匿名)。
|
||
|
||
## 设计上已有的安全措施
|
||
|
||
理解这些边界,有助于你判断某个现象是「设计如此」还是「真的漏洞」:
|
||
|
||
| 项 | 做法 | 位置 |
|
||
|---|---|---|
|
||
| 全站鉴权 | 每个页面都有 `@login_required`,每个 `/api/*` 未登录返回 401 JSON | `workbuddy_portal/security.py`、`web/views.py` |
|
||
| CSRF | 所有写请求必须带 `X-CSRF-Token`,页面注入 `window.WB_CSRF`,服务端统一拦截 | `security.check_csrf` |
|
||
| 会话签名 | Flask `secret_key` 由 `data/instance.json` 持有,首次启动随机生成 | `workbuddy_portal/config.py` |
|
||
| 口令存储 | 加盐哈希,不存明文 | `security.hash_password` |
|
||
| 凭据脱敏 | 云端 **Cookie 是账号凭证**:入库后页面与接口**都不回传全文**,只给「N 字符,结尾 …xxxx」 | `config.SECRET_KEYS`、`web/views.py` |
|
||
| 开放重定向 | 登录后的 `next` 只允许站内相对路径 | `web/views.py` |
|
||
| TLS 校验 | 默认开启,**不提供「关掉校验」的快捷开关**(Cookie 不该裸奔) | `settings.ssl_verify` |
|
||
| 容器权限 | 运行层非 root(uid/gid 1000 `app`) | `Dockerfile` |
|
||
|
||
**绝不入库**:`data/instance.json`(含 `secret_key`)、`data/usage.sqlite`、`logs/*`、`.env`。
|
||
`.gitignore` 已覆盖;改动忽略规则后请用 `git check-ignore -v <file>` 逐条复核。
|
||
|
||
## 已知的**非**目标(部署方需自行处理)
|
||
|
||
本项目刻意不做下面这些,请按你的环境补齐:
|
||
|
||
- **没有多租户与细粒度权限**:登录用户即为管理员,能改配置、能看全部数据。
|
||
- **没有限流与账号锁定**:公网暴露前请置于反向代理的 rate limit 之后。
|
||
- **没有强制 HTTPS**:请由反向代理(nginx/Caddy)终止 TLS。
|
||
- **没有备份机制**:备份策略需要你自己定(见 `docs/DEPLOYMENT.md`)。
|
||
- **不建议直接暴露到公网**:设计前提是局域网或 VPN 内使用。
|
||
- **Cookie 的获取方式由使用者负责**:手动从浏览器复制。请勿把该 Cookie 分享给他人,
|
||
它的权限等同于你的账号;轮换后记得在「配置管理」页更新。
|
||
|
||
## 部署前的最小检查清单
|
||
|
||
- [ ] 已修改默认管理员口令(`WB_ADMIN_PASSWORD`),不再是 `admin123`
|
||
- [ ] `data/` 与 `logs/` 目录的权限只对服务账号可读写
|
||
- [ ] 前面有反向代理并启用了 HTTPS
|
||
- [ ] 确认 `data/instance.json` 没有被提交到任何仓库
|
||
- [ ] 已规划备份(SQLite 库是唯一正本)
|