Kubernetes(k8s) 中的 Secrets 如何用于存储敏感数据?

问题浏览数Icon
9
问题创建时间Icon
2025-04-29 01:56:00
回答 | 共 3 个
作者头像
echoowl09

Kubernetes Secrets 是用于安全存储敏感数据(如密码、令牌、密钥)的核心资源。其核心价值在于将敏感信息与容器镜像及部署配置分离,通过以下机制保障安全性:1. 数据以 base64 编码存储,避免明文暴露;2. 支持通过 RBAC 精确控制访问权限;3. 支持挂载为卷或环境变量供 Pod 使用。建议配合加密存储后端(如 AWS KMS、Azure Key Vault)实现静态加密,并通过 Secret 自动轮换策略增强动态安全。生产环境中应避免直接暴露 Secret 内容到日志或调试工具,优先使用文件挂载而非环境变量以减少泄露风险。

作者头像
shanshui66
  1. 创建Secret:使用kubectl create secret generic <name> --from-literal=<key>=<value>或编写YAML文件(需将敏感数据base64编码后填入data字段)。
  2. 挂载到Pod:在Pod配置的volumes中引用Secret,通过volumeMounts将Secret作为文件挂载到容器指定路径,或通过env.valueFrom.secretKeyRef注入为环境变量。
  3. 权限控制:通过RBAC限制ServiceAccount对Secret的访问权限(get/list),避免未授权访问。
  4. 安全强化:启用etcd加密、限制Secret的命名空间隔离,避免明文存储或版本库泄露。
作者头像
baojian88

作为技术支持工程师,Kubernetes Secrets 的敏感数据存储方案通常遵循以下步骤:

  1. 创建 Secret

    • 使用 kubectl create secret generic 命令或 YAML 文件定义 Secret。例如:
      kubectl create secret generic my-secret --from-literal=username=admin --from-literal=password=123456
    • 或通过 base64 编码手动生成 YAML:
      apiVersion: v1
      kind: Secret
      metadata:
      name: my-secret
      type: Opaque
      data:
      username: YWRtaW4=  # base64 编码值
      password: MTIzNDU2
  2. 挂载 Secret 到 Pod

    • 在 Pod 配置中通过 Volume 或环境变量引用 Secret:
      volumes:
      - name: secret-volume
       secret:
         secretName: my-secret
      containers:
      - env:
         - name: DB_PASSWORD
           valueFrom:
             secretKeyRef:
               name: my-secret
               key: password
  3. 启用静态加密(可选)

    • 在 API Server 配置中启用 EncryptionConfiguration,使用 AES-CBC 或 KMS 提供商加密 etcd 中的 Secret 数据。
  4. 限制访问权限

    • 通过 RBAC 限制 ServiceAccount 对 Secret 的访问:
      apiVersion: rbac.authorization.k8s.io/v1
      kind: Role
      metadata:
      namespace: default
      name: secret-reader
      rules:
      - resources: ["secrets"]
      verbs: ["get"]
      resourceNames: ["my-secret"]
  5. 定期轮换与监控

    • 使用 kubectl rollout restart 更新 Secret 后重启相关 Pod,并集成监控工具(如 Prometheus)检测异常访问。

注意:避免在日志/代码中明文暴露 Secret,优先使用 Volume 挂载而非环境变量。