痛点:.env 文件在生产环境的致命缺陷
运维工程师大概都经历过这些场景:
- 新人入职,前辈把
.env文件通过 Slack/钉钉明文发一份过来 - 某个 API Key 轮换,需要逐台服务器手动更新
.env,漏改一台就是 P0 事故 - 审计要求追溯"谁在什么时间修改了哪个密钥",
.env文件毫无审计能力 - 多环境(dev/staging/prod)密钥靠命名约定(
.env.prod)区分,一旦复制错误直接打到生产数据库
.env 是开发阶段的便利工具,但它从来不是为生产环境设计的密钥管理方案。当团队规模超过 5 人、服务超过 10 个时,散落的 .env 文件就是一颗定时炸弹。
方案:Infisical — 开源密钥管理的现代解法
Infisical 是一个开源(MIT License)的端到端加密密钥管理平台,核心目标是让团队彻底告别 .env 文件散落各处的混乱状态。它提供:
- 集中管理:所有密钥存储在一个加密的中心平台,按项目/环境组织
- 端到端加密:密钥在客户端加密后才上传,服务端无法读取明文
- 多环境支持:dev / staging / prod 环境天然隔离,一键切换
- 审计日志:每次读取、修改、删除都有完整的 audit trail
- 原生 CI/CD 集成:GitHub Actions、GitLab CI、Kubernetes Operator 等开箱即用
- 自托管:可完全部署在自己的基础设施上,数据不出内网
对比 HashiCorp Vault,Infisical 的核心优势在于上手成本极低——Vault 的学习曲线和运维复杂度让很多中小团队望而却步,而 Infisical 5 分钟就能跑起来。
实操:从零部署 Infisical 并集成到生产环境
第一步:Docker Compose 自托管部署
# 克隆官方仓库
git clone https://github.com/Infisical/infisical.git
cd infisical
# 使用官方 docker-compose 启动
cp .env.example .env
# 编辑 .env,设置 ENCRYPTION_KEY 和 AUTH_SECRET
openssl rand -hex 16 # 生成 ENCRYPTION_KEY
openssl rand -hex 16 # 生成 AUTH_SECRET
docker compose -f docker-compose.prod.yml up -d
服务默认监听 http://localhost:8080,首次访问会引导创建管理员账户。
第二步:CLI 工具集成到部署流程
# 安装 Infisical CLI
curl -1sLf 'https://dl.cloudsmith.io/public/infisical/infisical-cli/setup.deb.sh' | sudo bash
sudo apt-get install infisical
# 登录(Machine Identity 方式,适合 CI/CD)
export INFISICAL_TOKEN=$(infisical login --method=universal-auth \
--client-id=YOUR_CLIENT_ID \
--client-secret=YOUR_CLIENT_SECRET \
--plain)
# 注入密钥并启动应用(替代 source .env && ./app)
infisical run --env=prod --path=/myapp -- ./start-server.sh
infisical run 的核心逻辑:从平台拉取指定环境的密钥,注入为环境变量,然后启动子进程。应用代码零修改,只需要从环境变量读取即可。
第三步:Kubernetes Operator 自动同步
# 安装 Infisical Secrets Operator
helm repo add infisical https://dl.cloudsmith.io/public/infisical/helm-charts/helm/charts/
helm install infisical-secrets-operator infisical/secrets-operator \
--namespace infisical-system --create-namespace
---
# InfisicalSecret CRD:自动将密钥同步为 K8s Secret
apiVersion: secrets.infisical.com/v1alpha1
kind: InfisicalSecret
metadata:
name: myapp-secrets
namespace: production
spec:
hostAPI: https://infisical.internal.company.com/api
authentication:
universalAuth:
secretsScope:
projectSlug: myapp
envSlug: prod
secretsPath: /
credentialsRef:
secretName: infisical-machine-identity
secretNamespace: infisical-system
managedSecretReference:
secretName: myapp-env
secretNamespace: production
secretType: Opaque
resyncInterval: 60 # 每60秒同步一次
密钥在 Infisical 平台修改后,Operator 自动同步到 K8s Secret,Pod 通过 envFrom 引用即可,无需重新部署。
第四步:GitHub Actions 集成
# .github/workflows/deploy.yml
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: Infisical/secrets-action@v1
with:
client-id: ${{ secrets.INFISICAL_CLIENT_ID }}
client-secret: ${{ secrets.INFISICAL_CLIENT_SECRET }}
project-slug: myapp
env-slug: prod
- name: Deploy with secrets
run: |
# 密钥已自动注入为环境变量
echo "DB connected to: $DB_HOST"
./deploy.sh
避坑指南
1. 自托管务必配置持久化存储
Infisical 依赖 PostgreSQL 和 Redis。Docker Compose 默认使用本地 volume,生产环境必须挂载到持久化存储(EBS/NFS),并配置定期备份:
# 备份 PostgreSQL 数据
docker exec infisical-db pg_dump -U infisical > backup_$(date +%Y%m%d).sql
2. Machine Identity 权限最小化
为 CI/CD 和 Kubernetes Operator 创建的 Machine Identity,务必限制:
- 环境范围:只授权需要的环境(如 prod),不要给 *
- 路径范围:按微服务路径隔离(/payment-service、/user-service)
- IP 绑定:绑定 CI Runner / 集群出口 IP,防止 token 泄漏后被滥用
3. 密钥轮换别忘了版本回滚能力
Infisical 支持密钥版本历史(Secret Versioning),轮换前确认: - 旧版本保留期设置合理(建议 7 天) - 有回滚 Playbook:如果新密钥导致服务异常,能在 30 秒内 revert
.env vs Infisical vs Vault 对比
| 维度 | .env 文件 | Infisical | HashiCorp Vault |
|---|---|---|---|
| 部署复杂度 | 零 | 低(Docker Compose 5分钟) | 高(需要 Consul/HA 配置) |
| 加密方式 | 无 | 端到端加密 | 服务端加密 |
| 审计日志 | 无 | 完整 | 完整 |
| 动态密钥 | 不支持 | 不支持 | 支持(数据库动态凭证) |
| 学习曲线 | 几乎为零 | 30 分钟上手 | 1-2 周 |
| 适用规模 | 1-3 人小项目 | 5-100 人团队 | 大型企业/强合规场景 |
| 开源协议 | — | MIT | BSL(非开源) |
选型建议:
- 如果你需要动态密钥(如数据库临时凭证自动过期),选 Vault
- 如果你需要快速落地、团队易用、替代 .env 混乱现状,选 Infisical
- 如果你是个人项目或 3 人以下团队,.env + .gitignore 暂时够用
总结
Infisical 解决的核心问题是密钥管理的最后一公里——不是每个团队都需要 Vault 那样的重量级方案,但每个团队都不应该继续用 .env 文件在 IM 里传来传去。
落地建议: 1. 先在非核心项目试点,验证 CLI 注入和 K8s Operator 的稳定性 2. 制定迁移计划:按环境逐步迁移,prod 最后切换 3. 配合 RBAC 策略,确保开发者只能访问 dev 环境密钥,prod 密钥仅 CI/CD 和运维可读
一个密钥管理的基本原则:密钥应该像水管里的水,只在需要的时候流到需要的地方,而不是装在瓶子里到处传递。