---
date: 2026-05-06
tags: [ops, env, audit, security, pr-review]
---

# 验证 env 变量改名"保留原值"：对比 .env.bak.* 历史

## 场景

PR review 标记某个 env 变量改名（如 `AUDIT_SECRET_KEY → AUDIT_HMAC_SECRET`），
要求合并前确认"PRD 已改名 + **保留原值**"，否则签名/HMAC 链类用途会断。

## 方法

不要只 `grep AUDIT_HMAC_SECRET` 当前 `.env.pro` 看到值就放行。
要做两件事：

1. **当前值不是代码 fallback 默认**：
   ```bash
   grep "fallback\|default" backend/src/.../<service>.ts  # 找代码默认值
   ssh prd 'grep ^VAR= /srv/apps/.../.env.pro'             # 对比
   ```
2. **当前值跟历史 .env.bak.* 一致**（链一致性靠这个）：
   ```bash
   ssh prd 'ls .env.pro.bak.* | tail -3 | while read f; do
     echo "[$f]"; grep ^VAR= "$f"
   done'
   ```
   值在改名前后**没变** → HMAC 链/签名一致 → 合并安全。

## 反模式：误把"保留原值"当成"已配置真实值"

在最近一次检查里发现 PRD 的 `AUDIT_HMAC_SECRET` 当前值就是 `.env.example`
的模板占位符（`your-secure-hmac-secret-key-change-in-production-min-32-chars`），
但历史备份里**就是这个值**——所以"保留原值"成立，HMAC 链不会断，本次合并安全。

但这同时暴露了一个**独立的安全问题**：PRD 的 secret 一直就是模板默认。
应该:
- 单独开 hotfix 生成真实随机 secret（注意密钥切换点的历史 verify 兼容）
- 把 `hash-chain.service.ts` 的 fallback 改成启动 throw（fail-fast），
  避免未来再悄悄跑公开默认

## 关键约定

- "改名+保留值" ≠ "值是好的"。前者只保证 chain 不断，后者是另一维度的检查
- 任何 AI review flag "**生产 env 必须 X**" 的改动，至少做：值检查 + 历史 .bak 对比 + 与代码 fallback 对比
