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 管控),但开箱即用、零实例费,因此采用它。

① 最终兜底:主账号(务必离线保管)

这几样丢一样就可能被锁死,必须离线保管(纸质/加密文件): 主账号能恢复 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-glass3 台角色机(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-tokenWhatsApp Cloud API
seahub/prod/xendit-api-key / xendit-callback-tokenXendit 支付
seahub/prod/tiktok-app-key / tiktok-app-secretTikTok
seahub/prod/lazada-app-key / app-secret / user-tokenLazada
seahub/prod/shopee-secretShopee
seahub/prod/traveloka-partnerize-api-key / application-keyTraveloka/Partnerize
seahub/prod/feishu-bot-app-secret / *-lark-webhook-secret ×N飞书/Lark 机器人 + 各告警/通知 webhook 签名
seahub/prod/app-log-oss-ak / sk / access-key ×NApp 日志 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 里切回上一个版本,重启即恢复。