Skip to content

[security] 收敛 systemd 部署脚本对凭证默认明文落盘的行为 #163

@liujuanjuan1984

Description

@liujuanjuan1984
  • 🔍 发现的问题 / 原始需求描述

当前 systemd 部署脚本仍会默认把 GH_TOKEN 写入 opencode.env、把 A2A_BEARER_TOKEN 写入 a2a.env、把 provider keys 写入 opencode.secret.env。虽然权限是 600 root:root,但这仍属于长期凭证明文落盘的默认路径。

这会带来几个问题:

  • 公开开源仓库会向运维方传递“默认写盘是推荐做法”的错误信号。
  • 长期有效 token/key 落盘会扩大误用、备份泄露、主机侧取证暴露的风险面。
  • GH_TOKEN / A2A_BEARER_TOKEN 被混入普通 env 文件,也不利于 secret/non-secret 边界清晰化。

相关文件:

  • /home/juanjuan/opencode-a2a-serve/scripts/deploy/setup_instance.sh

  • /home/juanjuan/opencode-a2a-serve/scripts/deploy/install_units.sh

  • /home/juanjuan/opencode-a2a-serve/scripts/deploy.sh

  • 🛠️ 建议实施方案

建议采用“默认不持久化,显式 opt-in 才写盘”的路径:

  1. 拆分 non-secret 与 secret env files:
    • opencode.env / a2a.env 仅保留非敏感配置
    • opencode.auth.env 单独承载 GH_TOKEN
    • a2a.secret.env 单独承载 A2A_BEARER_TOKEN
    • opencode.secret.env 继续承载 provider keys
  2. 新增显式开关,例如 ENABLE_SECRET_PERSISTENCE=true
    • 未开启时,部署脚本不写入上述 secret files
    • 仅生成 root-only *.example 模板,并要求运维方自行预置 runtime secret files
  3. systemd unit 改为加载拆分后的 secret files,而不是把 secret 混在普通 env 文件里。
  4. README / deploy 文档更新为两种路径:
    • 默认 secure path:预置 root-only secret files
    • 显式 opt-in path:允许部署脚本代写 secret files,并明确风险

核心逻辑/伪代码:

if ENABLE_SECRET_PERSISTENCE == true:
    write root-only secret env files
else:
    create example templates only
    require operator-provisioned runtime secret files before starting services

验收要求:

  • 默认部署流程不再无提示地把长期凭证明文写盘。
  • secret / non-secret 文件边界清晰。
  • 现有需要持久化的运维场景,仍可通过显式开关完成。

附加快照:

  • 发现时代码快照:95e51873f6ed9ba00813d1a214063c3faece272c

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions