46 lines
3.2 KiB
Markdown
46 lines
3.2 KiB
Markdown
# Plane CE 加固草稿(docs/plane-hardening/)
|
||||
|
|
|
|||
|
|
> **状态:草稿,未应用、未提交。** 对应追踪:Plane vps 项目条目(2026-09-03,**记录源**;Linear W1N-277 已取消,Linear 自 2026-09-03 起不再作为记录源)。
|
|||
|
|
> 线上实例:`plane.chans.xyz`(synapse K3s,ns `plane`,release `plane-app` = chart `plane-ce-1.8.0` / app `v1.4.1`)。
|
|||
|
|
> 依据:2026-09-03 只读核查(13 条审查意见中 11 条属实、#3 基本属实、#9 指标归属错误)+ 上游 chart 模板逐条核对。
|
|||
|
|
|
|||
|
|
## 文件
|
|||
|
|
|
|||
|
|
| 文件 | 内容 |
|
|||
|
|
|------|------|
|
|||
|
|
| `values.hardened.yaml` | 可选硬化 values(external secrets 引用、requireExplicitSecrets、minio pin、上传限额对齐);含 HTTP→HTTPS `extraObjects` 示例 |
|
|||
|
|
| `secrets.yaml.example` | 6 组外部 Secret 结构占位(只含 key 名,真实值仅存宿主机) |
|
|||
|
|
| `backup/plane-backup.yaml` | **PostgreSQL 备份 CronJob**(pg_dump `-Fc`,hostPath `/var/backups/plane`;MinIO 已按实际用量剔除) |
|
|||
|
|
| `backup/README.md` | 备份方案说明(排程/容量/保留/还原/阻塞) |
|
|||
|
|
|
|||
|
|
## 应用顺序(每步先 diff 后执行,全部需用户逐项确认)
|
|||
|
|
|
|||
|
|
### 现在就值得做:DB 备份(P0,见 backup/)
|
|||
|
|
`plane-backup.yaml` 部署 + 手动触发验证一次即可;88 MB 库每日快照几乎零成本。
|
|||
|
|
|
|||
|
|
### 可选(顺手做一次,不是必须)
|
|||
|
|
- **Phase A 密钥外部化**(零行为变化、无停机,约 15 分钟):按 `secrets.yaml.example`
|
|||
|
|
在宿主机建 6 个 Secret(值先复制当前集群),用 `values.hardened.yaml` 跑
|
|||
|
|
`helm diff upgrade` → `helm upgrade`;验证后删除 chart 生成的旧 Secret。
|
|||
|
|
价值:默认密钥不再落在 chart 公开常量上,作为保险。
|
|||
|
|
- **MCP API Key 轮换**:若审查对话出过你的环境,Plane 后台重生成 + 更新
|
|||
|
|
`/home/windy/plane-k3s/mcp/mcp.env`(0600)+ 重启 Cursor MCP。
|
|||
|
|
- **/god-mode IP 白名单**:若在意管理后台被公网爆破。chart 1.8.0 的 IngressRoute
|
|||
|
|
不支持给单条路由追加 middleware → 需 post-renderer 或 upgrade 后 `kubectl patch`
|
|||
|
|
(升级会覆盖,需固化);源 IP 清单待提供。
|
|||
|
|
|
|||
|
|
### 明确暂缓/跳过(个人单节点,等出现症状再处理)
|
|||
|
|
- SECRET_KEY 等轮换(Phase B):等真要配 SMTP/OAuth 前再做(避免旧密文不可解)。
|
|||
|
|
- NetworkPolicy、有状态组件 resources limits(chart 无 values 开关,需 post-render/patch)、
|
|||
|
|
HTTP→HTTPS(草稿已给 `extraObjects` 示例)、metrics-server/Sentry。
|
|||
|
|
|
|||
|
|
## 关键限制(chart 1.8.0 模板已核对)
|
|||
|
|
- `external_secrets.*_existingSecret` 设置后,对应 Secret **必须**包含模板所需全部 key
|
|||
|
|
(缺失不自动补),见 `secrets.yaml.example` 注释。
|
|||
|
|
- `app_keys_existingSecret` 的 envFrom 在所有 workload 上**最后注入**(后置生效),
|
|||
|
|
保证 app/live 共享密钥一致——不要在其后再放同名 key 的 Secret。
|
|||
|
|
- `DATABASE_URL`/`AMQP_URL`/`REDIS_URL` 是 chart 生成的派生 URL,内嵌明文密码;
|
|||
|
|
外部化后轮换 DB/队列密码时必须同步更新 `plane-app-env`。
|
|||
|
|
- minio 的 `MINIO_ROOT_*` 与 `AWS_*` 同源于一个 Secret;升级时 bucket Job 会重跑
|
|||
|
|
(需 admin 权限凭据)——换 svcacct 前先确认权限覆盖该 Job。
|