什么是秘密?

发布: (2025年12月2日 GMT+8 08:52)
7 min read
原文: Dev.to

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 SecretsGitHub CI/CD使用简便,已加密不适用于运行时应用
AWS Secrets Manager在 AWS 上运行的应用自动轮换,IAM 集成大规模使用成本高
AWS SSM Parameter StoreAWS 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 流向

  1. 在 AWS Secrets Manager 中存储 secret。
  2. EC2/ECS/Lambda 通过 IAM 角色访问这些 secret。
  3. GitHub Actions 仅存储:
    • AWS Access Key
    • AWS Secret Key
    • Confluent API key
  4. Terraform 部署基础设施,引用 secret 的 ARN。
  5. 应用通过 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                                                     │
   └───────────────────────────────────────────────────────────────────────────────┘
Back to Blog

相关文章

阅读更多 »

切换账户

@blink_c5eb0afe3975https://dev.to/blink_c5eb0afe3975 正如大家所知,我正重新开始记录我的进展,我认为最好在一个不同的…

Strands 代理 + Agent Core AWS

入门指南:Amazon Bedrock AgentCore 目录 - 前置要求(requisitos‑previos) - 工具包安装(instalación‑del‑toolkit) - 创建…