什么是秘密?
Source: Dev.to
1. 什么是 secret?
secret 是任何必须防止未授权访问的敏感信息。
示例
- API 密钥
- 访问令牌
- 数据库密码
- 私钥(
.pem) - Confluent Cloud 凭证
- Terraform 后端凭证
- OAuth 令牌
- SSH 密钥
目标: 让 secret 在静止时加密、在传输时加密,且永不以明文形式存储(例如在仓库、日志或制品中)。
2. 为什么 secret 管理至关重要
高级 DevOps 工程师必须防止:
- 凭证泄漏
- 未授权访问
- 意外提交到 Git
- 在 Terraform、Kubernetes、Docker 或 CI/CD 流水线中硬编码
secret 泄漏的后果
- 环境被攻破
- 数据泄露
- 未经授权的 AWS 使用导致数千美元费用
- 仓库被接管
这就是为什么要使用安全的 secret 存储 而不是普通文件。
3. DevOps 必须了解的 secret 存储选项
| 工具 | 使用场景 | 优势 | 劣势 |
|---|---|---|---|
| GitHub Secrets | GitHub CI/CD | 使用简便,已加密 | 不适用于运行时应用 |
| AWS Secrets Manager | 在 AWS 上运行的应用 | 自动轮换,IAM 集成 | 大规模使用成本高 |
| AWS SSM Parameter Store | AWS Systems Manager | 比 Secrets Manager 更便宜 | 本身不支持轮换 |
| HashiCorp Vault | 企业多云环境 | 最安全,支持动态 secret | 管理复杂 |
4. GitHub Secrets — 仅用于 CI/CD
使用位置
- GitHub Actions CI/CD 流水线
存储内容
- AWS access key + secret key
- Docker registry token
- Terraform Cloud token
- Confluent Cloud 凭证
- 任意部署 API 密钥
工作原理
- GitHub 使用 libsodium 对 secret 进行加密。
- 只有在 你的仓库 中运行的 GitHub Actions 能访问。
- 对于 fork 的 PR 不可用。
高级 DevOps 的安全规则
- 切勿在此存放应用的数据库密码。
- 切勿存放长期有效的 AWS 密钥(推荐使用 OIDC)。
- 每 90 天轮换一次密钥。
- 给仓库最小化的访问权限。
- 避免存放复杂的 JSON —— 使用 AWS Parameter Store 替代。
GitHub Secrets 不 替代的内容
- AWS Secrets Manager
- HashiCorp Vault
- Kubernetes Secrets
- 应用运行时的 secret
GitHub Secrets 仅用于 CI/CD。
5. AWS Secrets Manager — 生产级 secret 存储
使用位置
- AWS 上的生产微服务。
特性
- 自动轮换(通过 Lambda)
- 版本历史
- 通过 IAM 实现多账户访问
- 跨区域复制
- 内置 KMS 加密
典型使用场景
- RDS 主密码
- Confluent API secret
- Stripe 密钥
- OAuth 令牌
- ECS 任务的 DB 凭证
通过 IAM 访问
ecsTaskExecutionRole:
can access secret: arn:aws:secretsmanager:...
代码示例(ECS 任务环境变量)
{
"name": "DB_PASSWORD",
"valueFrom": "arn:aws:secretsmanager:us-east-2:xxx:secret:db_pass"
}
何时选择 Secrets Manager
- 需要 轮换。
- 需要 严格审计。
- 管理 跨账户 应用。
6. AWS SSM Parameter Store
概述
- 存储 SecureString 参数。
成本
- $0(Standard 层,Secrets Manager 约 $0.40/secret/月)。
适用场景
- 开发 / QA / 非关键 secret。
使用案例
- 微服务配置值
- 非轮换 token
- S3 bucket 名称
- 功能开关
不推荐用于
- 生产数据库密码(不支持轮换)。
7. HashiCorp Vault — 最先进的系统
为什么使用 Vault
- 支持 AWS、GCP、Azure、Kubernetes、本地。
- 动态 secret(临时 DB 凭证)。
- 加密即服务(Transit)。
- PKI 证书生成。
- 细粒度访问策略。
- 审计日志。
- 可本地部署或使用 HCP Vault Cloud。
动态 secret 示例
Vault 可以生成一个 PostgreSQL 用户名/密码,其特点是:
- 有效期 1 小时
- 之后自动删除
非常适合短生命周期的 CI/CD 任务和高安全环境(银行、医疗、金融科技)。
知名用户
- Uber
- Stripe
- Goldman Sachs
- Netflix
8. Kubernetes Secrets(可选,但 DevOps 必须了解)
存储方式
- 存放在 etcd 中(生产环境使用 KMS 加密)。
用途
- API 密钥
- DB 密码
- TLS 证书
挂载方式
- 环境变量
- 文件
9. Terraform 与 Secrets — 高级知识
不 存放 secret 的位置
- Git 仓库
.tf文件或模块- Terraform 状态文件
必须 传递 secret 的方式
terraform.tfvars(仅本地)- CI/CD 环境变量
- AWS SSM Parameter Store
- AWS Secrets Manager
示例 不良 代码(请勿使用)
password = "MySecret123"
更佳实践
password = var.db_password
推荐的最佳实践
password = data.aws_secretsmanager_secret_version.db_password.secret_string
10. 实际 CI/CD 流水线中的 secret 流向
- 在 AWS Secrets Manager 中存储 secret。
- EC2/ECS/Lambda 通过 IAM 角色访问这些 secret。
- GitHub Actions 仅存储:
- AWS Access Key
- AWS Secret Key
- Confluent API key
- Terraform 部署基础设施,引用 secret 的 ARN。
- 应用通过 AWS SDK 使用 IAM 角色权限检索 secret。
11. 禁止做的事(高级 DevOps 知识)
- ❌ 绝不在 GitHub 仓库中存放 secret。
- ❌ 绝不在 Slack 或 Teams 中存放 secret。
- ❌ 绝不在 Docker 镜像中存放 secret。
- ❌ 绝不在 YAML 文件中存放 secret。
- ❌ 绝不在 Terraform 状态中存放 secret。
- ❌ 绝不在代码注释中存放 secret。
- ❌ 绝不在 CI 日志中回显 secret。
- ❌ 绝不通过电子邮件发送 secret。
如果 secret 泄漏,立即轮换。
12. 面试级解释(可直接使用)
“在我的流水线中,GitHub Secrets 仅用于 CI/CD 凭证。
对于应用运行时的 secret,我根据是否需要轮换,使用 AWS Secrets Manager 或 SSM Parameter Store。
我通过在运行时从 secret 存储中获取值,避免在 Terraform 中硬编码 secret。
在企业多云环境下,我将 HashiCorp Vault 与 AWS IAM 和 Kubernetes Service Account 集成,实现安全认证和动态 secret。
所有 secret 均使用 KMS 加密,且绝不在日志中泄露。”
Secrets 流向 — 高层次示意图
┌──────────────────────────┐
│ Developer Machine │
│ (Push Git Changes) │
└─────────────┬────────────┘
│
▼
┌────────────────────────┐
│ GitHub Repository │
└─────────────┬──────────┘
│
▼
┌──────────────────────────────┐
│ GitHub Actions Runner │
│ (CI/CD Workflow Execution) │
└──────────────┬────────────────┘
SECRETS ENTER HERE FROM GITHUB →│
▼
┌───────────────────────────────────────────────────────────────────────────────┐
│ GitHub Secrets Storage │
│ - AWS_ACCESS_KEY_ID │
│ - AWS_SECRET_ACCESS_KEY │
└───────────────────────────────────────────────────────────────────────────────┘