跳到主要内容

密钥治理与依赖供应链

自动化系统通常拥有 SSH、Kubernetes、镜像仓库和 CI 的高权限。代码正确不代表系统安全;凭据来源、最小权限、依赖来源和审计同样属于运维实现的一部分。

1. 密钥传递顺序

优先级从高到低:

  1. 工作负载身份或短期令牌,例如 Kubernetes ServiceAccount、OIDC、云 IAM;
  2. Vault 等密钥系统按运行身份动态签发,并支持轮换与审计;
  3. 由 systemd credential、Kubernetes Secret volume 或 CI protected variable 注入的只读文件;
  4. 受限环境变量,仅用于无法使用前述机制的场景。

环境变量会被子进程继承,也可能被调试工具、崩溃转储或错误日志暴露;它不是“天然安全”的秘密容器。无论采用哪种方式,都不应把密钥打印、序列化到任务 payload 或提交到仓库。

2. 从受限文件读取密钥

# src/ops_tool/secrets.py
from pathlib import Path


def read_secret(path: str) -> str:
"""读取由部署平台挂载的 secret 文件,并拒绝空内容。"""
secret_path = Path(path)
if not secret_path.is_file():
raise RuntimeError(f"密钥文件不存在: {secret_path}")
value = secret_path.read_text(encoding="utf-8").strip()
if not value:
raise RuntimeError(f"密钥文件为空: {secret_path}")
return value


# 只在启动阶段读取一次;日志中只记录 secret 来源名称,不记录值。
api_token = read_secret("/run/secrets/ops_api_token")

文件应属于专用服务账号,权限通常为 04000440。轮换时需要明确应用是热加载、定期刷新还是滚动重启;不要假设文件更新后所有 SDK 都会自动使用新值。

3. 最小权限与分离身份

自动化用途身份与权限边界
资产巡检只读 API / SSH 仅允许固定只读命令
Kubernetes 重启指定 namespace 内 Deployment 的 getpatch,无 Secret 读取权限
镜像同步源仓库 pull、目标仓库 push,不授予 delete 或项目管理员
Webhook 接收仅入队;实际变更由另一个 worker 身份执行
CI 发布短期受保护 Token,只能向目标环境部署指定制品

不要以 cluster-admin、Docker socket 全权限、共享 root SSH key 或一个万能 API Key 作为“部署方便”的代价。权限被滥用时,明确身份与最小范围决定了爆炸半径。

4. 依赖与制品控制

# CI 中按锁文件安装,避免每次解析到不同版本。
uv sync --locked --all-groups

# 检查已安装依赖的公开漏洞;结果需要结合可利用性修复。
uv run pip-audit

# 生成依赖清单,保存为构建产物以支持追溯。
uv export --locked --format requirements-txt > requirements.lock.txt

pip-audit 需要单独安装为开发依赖。对于受控网络,使用经审查的私有 PyPI 镜像并记录包的来源与哈希;不要让生产构建直接依赖任意公共镜像或未固定的 Git URL。

Python 服务容器同样需要扫描基础镜像和系统包,并保留 SBOM、构建提交 SHA、依赖锁文件和镜像 digest 的关联关系。

5. 泄露响应流程

发现 Token、私钥或密码进入仓库、日志或工单后,应将其视作已泄露:

  1. 立即吊销或轮换凭据,不能只删除文本;
  2. 审计该凭据近期调用、来源 IP 和变更记录;
  3. 清理仓库历史、CI 变量、日志索引和缓存副本;
  4. 修复注入路径与日志脱敏规则,并加入泄露扫描;
  5. 复盘为何凭据具有过大权限或缺乏到期时间。

密钥扫描应在本地 pre-commit、CI 和制品发布链路中启用。扫描命中要能安全处置,避免把真实密钥再次写进失败日志。

6. 上线前检查

  1. 每个组件有独立身份和最小权限,写操作与只读操作不共用凭据;
  2. 密钥不在源码、镜像层、日志、队列任务或命令行参数中;
  3. 密钥具备轮换、过期、吊销和审计路径;
  4. uv.lock、漏洞扫描和镜像/SBOM 证据进入发布产物;
  5. 已演练一次泄露后的吊销、重发与审计流程。