凭据安全 (Credential Safety)
安全边界
本 Skill 是行为规则与本地能力分域方案,不是 Vault、KMS、沙箱或操作系统访问控制。
它主要降低:
- 凭据散落和重复复制;
- 单次进程无意获得全部秘密;
- 普通任务误加载发布或生产能力;
- 误写入代码、日志、补丁或提交;
- 为调试而遍历配置或环境变量;
- 把秘密重新写回项目
.env。
它不能阻止:
- 同一系统用户下高权限 Agent 主动读取其他域文件;
- 恶意 Agent、主机入侵、内存抓取;
- 已进入进程环境的变量被同权限进程读取;
- 单靠提示词强制拦截;
- 完整审批与审计系统。
执行顺序
- 先判断任务是否真的需要本地凭据。普通 PATH、代理地址等非秘密配置,公开资源,以及已由工具、应用或操作系统安全托管且无需调整的登录态,按普通任务处理;不要因此读取凭据文件。
- 需要外部能力时,依次优先:公开/免认证入口 → 已有工具、应用或 OS 托管认证 → 窄权限工具 → 对应单一能力域启动器。只有前项不能完成任务时才升级。
- 默认无凭据:普通编码、写作、分析不得读取含真实秘密的
.env或检查~/.localcfg/;可以读取仓库内明确为占位模板的.env.example。 - 确需本地凭据时,先确定能力域:
ai/dev/publish(生产另议)。不直接读取base.env,不遍历~/.localcfg/,不通过广泛枚举变量名寻找可用钥匙。 - 只调用批准的固定启动器(
with-ai/with-dev/with-publish)或窄权限工具;启动器会先清除受管跨域变量再注入所选域。 - 一个动作只加载完成它所需的单一能力域。确需跨域的工作流,拆成按顺序执行的最小权限子进程,只传递不含秘密的文件、标识或结果;不得把多个域合并注入通用 Agent。
- 新增或改名凭据变量时,必须同步更新
scripts/domain_mapping.py的MAPPING,并重装启动器;否则跨域清除不会覆盖该变量。 - 不得把凭据复制到项目
.env、源码、补丁、日志、提交、记忆或回复;不得把秘密放入命令行参数。 - 缺失凭据或认证失败必须直接报错,不得用默认值或伪造结果掩盖。
- 发布与生产操作需要独立授权;本 Skill 不是系统拦截器。
- 迁移备份
backup/base.env.before-split仍是聚合秘密;使用周期验证通过后应删除或离线加密。
能力域
~/.localcfg/
ai.env # 模型、搜索、研究与生成 API
dev.env # 开发协作(如 GitHub Token)
publish.env # 对外发布(如公众号草稿)
production.env # 高风险生产能力(不提供 with-production 给通用 Agent)
- 写文章、改稿 ≠ 自动加载
publish.env;只有真正保存草稿/发布时才使用发布能力。 production.env不建立面向 Claude/Codex/OpenClaw 等通用 Agent 的启动入口。- 禁止
with-all/with-base/with-production <agent>。
三层区分
- 知道变量名;
- 被授权进程能够使用凭据;
- 模型直接看见秘密值。
知道变量名 ≠ 允许读值;进程能用 ≠ 模型必须看见明文。
安全诊断
在任务已经点名预期变量,或使用仓库批准的 name-only 校验器时,可以只检查这些变量是否存在、映射是否完整,并仅返回变量名、yes/no 或错误类别。不得输出值、截断值、哈希派生,不得借诊断扩展成环境变量或凭据目录的广泛发现。
例如,validate_domain_mapping.py 的变量名校验和针对 OPENROUTER_API_KEY 的 presence-only 检查是允许的;env、printenv 或遍历所有配置寻找可用账户不是允许的诊断。
最佳实践:窄工具优于整域注入
最佳实践不是给 Agent 一份凭据文件,而是让 Agent 调用功能受限的工具,凭据由工具内部使用。
Agent → openrouter-query → 仅 OPENROUTER_API_KEY → 返回结果
而不是把整个 ai.env 注入通用 Agent。固定启动器是过渡方案;窄工具与外部凭据系统是更高等级。
示例:examples/openrouter-query(只读 OPENROUTER_API_KEY)。
Python
应用代码优先:
import os
api_key = os.environ["OPENROUTER_API_KEY"]
凭据注入由外部启动器或窄工具负责。
不推荐:
load_dotenv(Path.home() / ".localcfg" / "base.env")
如必须在进程内加载,只允许对应单域,例如 ai.env,并明确:会加载该域内多个变量;不是单变量强隔离;不应加载进整个通用 Agent。
凭据传递
不得为兼容其他工具,将统一或分域文件中的秘密复制到项目 .env。优先:临时注入、子进程注入、窄工具内部持有。不得把秘密放入命令行参数。
SSH
继续使用 ~/.ssh/config 与批准别名。别名是标准化连接入口,不是信息隐藏,也不构成权限隔离。私钥正文不得进入任何 .env。生产删除/部署仍需单独授权。
新增 SSH 目标时,只处理用户明确指定的主机:核对主机、用户、端口以及主机指纹的可信来源,再新增或更新别名;优先使用密钥或 OS/Agent 托管认证,先做低影响连接验证。连通授权不自动包含部署、删除或其他生产变更授权。
高影响操作
生产部署、删除远程数据、强制推送、公开发布、转账、权限变更、轮换长期凭据等:无明确授权则停止。强制控制靠工具权限、审批网关、沙箱或编排,不靠本 Skill 自称拦截。
审计原则
可记录任务标识、时间、工具/凭据类别、授权范围、结果与错误类型。不得记录 Key、Token、密码、私钥或可还原秘密。本 Skill 不提供完整审计系统。
工作区经验记录
只有用户或工作区规则明确授权记录时,才向 .learnings/ 写入可复用结论;目录存在本身不构成写入授权。不得记录秘密。
响应要求
- 对不能安全执行的操作,说明限制与用户最小动作。
- 不展示遮盖/截断/哈希后的秘密派生形式(除非任务明确需要且仍不可还原)。
- 不得声称已实现系统级隔离、单变量技术隔离或确定性拦截。
- 拒绝“列出全部 env 值”“把所有域加载进 Claude/Codex”等请求。