Secrets Management · Recovery Runbook
密钥管理与恢复手册(OOS 加密参数)
目标:密钥不再明文散在各机器 .env,统一进阿里云 OOS 运维编排 · 加密参数(SecretParameter)(KMS 默认密钥加密 + 多版本 + 托管,免建付费实例),应用可用 ECS 实例 RAM 角色免密拉取。本手册保证"永远进得去、密钥不会忘/不会丢"。
现状:27 项生产密钥已入 OOS 加密参数 + 已生成离线 break-glass 加密备份(2026-07-08)。
为什么不是 KMS 凭据管家? 凭据管家的 CreateSecret 需要先购买付费 KMS 实例(未开时报 UnsupportedOperation)。OOS 加密参数目标一致(同样用 KMS 主密钥加密、多版本、RAM 管控),但开箱即用、零实例费,因此采用它。
① 最终兜底:主账号(务必离线保管)
这几样丢一样就可能被锁死,必须离线保管(纸质/加密文件):
- 阿里云主账号密码 —— 用强口令,离线写下,别只在脑子里。这是最关键的一道。
- 主账号 MFA(二次验证) —— 可选。不开也能继续用本方案(靠强口令);开了更安全,但要连带保管恢复码。
- MFA 恢复码 —— 若开了 MFA:手机丢了/刷机了靠它才能进,没有它=记得密码也进不去。不开 MFA 则无此项。
主账号能恢复 OOS/RAM 的一切,是最后一道防线。
② 密钥去哪了 / 怎么拉
| 项 | 说明 |
| 存储 | 阿里云 OOS 加密参数(区域 ap-southeast-5,前缀 seahub/prod/),KMS 主密钥加密 + 多版本 + 托管。你和运维都不用记密码值。 |
| 应用怎么拿 | ECS 已挂实例 RAM 角色 beex-ecs-kms-reader(附策略 beex-oos-secret-read,只读 oos:GetSecretParameter),7 台生产机全挂;可免密从 OOS 拉,机器上不放长期 AK。 |
| 读取命令 | aliyun oos GetSecretParameter --Name seahub/prod/<名> --WithDecryption true |
| Break-glass | 3 台角色机(service/wa/webhook)全部 .env 已合并 AES-256 加密导出,存 .ai-workbench/breakglass/seahub-prod-secrets.enc.b64,口令在同目录 PASSPHRASE.txt。请把这两样挪到离线处;万一 OOS/账号都进不去能整体救回。 |
| 轮换 | 双版本、永不单步覆盖:UpdateSecretParameter 加新版本 → 应用验证连得上 → 再停用旧版本;随时可切回旧版本。 |
③ 密钥清单(27 项已入库,只列名称/用途,值在 OOS)
DB 主库口令未在 .env 明文中(走 RDS 连接串/托管),故不在这 27 项内;如需入库单独 PutSecretParameter 一条 seahub/prod/db-password。
| OOS 加密参数名 | 用途 |
| seahub/prod/redis-password | 生产 Redis 密码 |
| seahub/prod/auth-access-token-secret | 访问令牌签名密钥 |
| seahub/prod/internal-admin-token | 内部管理 token |
| seahub/prod/withdraw-admin-token | 提现审批 token |
| seahub/prod/whatsapp-access-token / meta-app-secret / verify-token | WhatsApp Cloud API |
| seahub/prod/xendit-api-key / xendit-callback-token | Xendit 支付 |
| seahub/prod/tiktok-app-key / tiktok-app-secret | TikTok |
| seahub/prod/lazada-app-key / app-secret / user-token | Lazada |
| seahub/prod/shopee-secret | Shopee |
| seahub/prod/traveloka-partnerize-api-key / application-key | Traveloka/Partnerize |
| seahub/prod/feishu-bot-app-secret / *-lark-webhook-secret ×N | 飞书/Lark 机器人 + 各告警/通知 webhook 签名 |
| seahub/prod/app-log-oss-ak / sk / access-key ×N | App 日志 OSS 上传凭证 |
27 项从生产机 /opt/seahub-x-service/.env 里 *_SECRET/*_PASSWORD/*_TOKEN/*_KEY 盘出,已一一对应入 OOS 加密参数。
④ 恢复动作(可复制命令)
取回单个密钥值
aliyun oos GetSecretParameter --RegionId ap-southeast-5 \
--Name seahub/prod/xendit-api-key --WithDecryption true
Break-glass:整体解回全部明文(仅极端情况)
# 需要离线保管的 PASSPHRASE.txt 口令
base64 -d seahub-prod-secrets.enc.b64 \
| openssl enc -d -aes-256-cbc -pbkdf2 -iter 200000 -pass pass:'<口令>'
轮换某密钥(双版本,不停机)
aliyun oos UpdateSecretParameter --RegionId ap-southeast-5 \
--Name seahub/prod/<名> --Value '<新值>' # 加新版本,旧版本仍在,可回退
⑤ 常见"进不去/忘了"场景 → 怎么办
| 场景 | 解决 |
| 忘了某个密钥的值 | 不会发生——在 OOS 加密参数里,随时 GetSecretParameter 查/回滚任意版本。 |
| 没开 MFA、担心账号安全 | 主账号用强口令并离线保管即可继续用本方案;要更稳再开 MFA。 |
| 开了 MFA 但手机丢了 | 用离线保管的 MFA 恢复码登录主账号。 |
| 子账号/RAM key 丢了 | 无所谓,用主账号恢复重建。 |
| OOS/账号都进不去(极端) | 用 break-glass 加密文件 + 离线口令整体解回明文,先把系统救活,再恢复账号。 |
| 轮换把服务弄挂 | OOS 里切回上一个版本,重启即恢复。 |