如何将机密信息作为环境变量注入

KubernetesKubernetesBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在现代云原生环境中,安全地管理敏感信息至关重要。本教程将探讨如何在Kubernetes中作为环境变量注入机密信息,为开发者提供一种在维护应用程序安全性和运营效率的同时处理机密配置数据的强大方法。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL kubernetes(("Kubernetes")) -.-> kubernetes/BasicCommandsGroup(["Basic Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/AdvancedCommandsGroup(["Advanced Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/TroubleshootingandDebuggingCommandsGroup(["Troubleshooting and Debugging Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/ConfigurationandVersioningGroup(["Configuration and Versioning"]) kubernetes/BasicCommandsGroup -.-> kubernetes/get("Get") kubernetes/BasicCommandsGroup -.-> kubernetes/create("Create") kubernetes/BasicCommandsGroup -.-> kubernetes/set("Set") kubernetes/AdvancedCommandsGroup -.-> kubernetes/apply("Apply") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/describe("Describe") kubernetes/ConfigurationandVersioningGroup -.-> kubernetes/config("Config") subgraph Lab Skills kubernetes/get -.-> lab-419027{{"如何将机密信息作为环境变量注入"}} kubernetes/create -.-> lab-419027{{"如何将机密信息作为环境变量注入"}} kubernetes/set -.-> lab-419027{{"如何将机密信息作为环境变量注入"}} kubernetes/apply -.-> lab-419027{{"如何将机密信息作为环境变量注入"}} kubernetes/describe -.-> lab-419027{{"如何将机密信息作为环境变量注入"}} kubernetes/config -.-> lab-419027{{"如何将机密信息作为环境变量注入"}} end

Kubernetes 中的机密信息

什么是 Kubernetes 机密信息?

Kubernetes 机密信息(Kubernetes Secrets)是用于在集群中管理敏感信息的对象,如密码、OAuth 令牌、SSH 密钥和其他机密数据。与配置映射(ConfigMaps)不同,机密信息专门设计用于通过额外的安全层来处理敏感信息。

Kubernetes 机密信息的关键特性

特性 描述
编码存储 机密信息在存储时进行 base64 编码
命名空间作用域 机密信息存在于特定的 Kubernetes 命名空间中
大小限制 机密信息的最大大小为 1MB
访问控制 可以使用基于角色的访问控制(RBAC,Role-Based Access Control)进行限制

Kubernetes 机密信息的类型

graph TD A[Kubernetes 机密信息] --> B[通用机密信息] A --> C[Docker 镜像仓库机密信息] A --> D[TLS 机密信息] A --> E[服务账号令牌]

1. 通用机密信息

用于存储任意用户定义的敏感数据,如数据库凭证或 API 密钥。

2. Docker 镜像仓库机密信息

用于从容器镜像仓库拉取私有容器镜像。

3. TLS 机密信息

存储用于安全通信的 TLS/SSL 证书和私钥。

4. 服务账号令牌

自动生成的用于与 Kubernetes API 进行认证的令牌。

安全注意事项

  • 机密信息是 base64 编码的,而非加密的
  • 建议在存储时使用加密
  • 使用 RBAC 限制对机密信息的访问
  • 定期轮换机密信息

示例:创建基本机密信息

## 使用 kubectl 创建一个机密信息
kubectl create secret generic db-credentials \
  --from-literal=username=admin \
  --from-literal=password=mysecretpassword

通过了解 Kubernetes 机密信息,开发者可以在其容器化应用程序中安全地管理敏感信息,利用 LabEx 的云原生开发环境。

机密信息管理基础

理解 Kubernetes 中的机密信息管理

机密信息管理是保障容器化应用程序安全以及维护 Kubernetes 集群中敏感信息保密性的关键环节。

机密信息管理的核心原则

graph TD A[机密信息管理] --> B[加密] A --> C[访问控制] A --> D[轮换] A --> E[最小权限]

1. 机密信息创建方法

方法 描述 使用场景
kubectl create secret 基于命令行界面的机密信息创建 快速、简单的机密信息创建
YAML 清单 声明式机密信息定义 版本控制的机密信息
外部机密信息管理器 与密钥管理系统集成 企业级安全性

创建机密信息:实际示例

使用 kubectl

## 创建一个通用机密信息
kubectl create secret generic database-credentials \
  --from-literal=username=dbadmin \
  --from-literal=password=secure_password_123

## 从文件创建一个机密信息
kubectl create secret generic ssl-cert \
  --from-file=tls.crt=./server.crt \
  --from-file=tls.key=./server.key

YAML 清单方法

apiVersion: v1
kind: Secret
metadata:
  name: app-secret
type: Opaque
stringData:
  DATABASE_URL: postgresql://user:password@localhost/database

机密信息加密策略

静态加密

  • 在 Kubernetes API 服务器中启用静态加密
  • 使用特定于提供商的加密机制
  • 定期轮换加密密钥

传输中加密

  • 对所有通信使用 TLS
  • 实施网络策略
  • 利用服务网格技术

最佳实践

  1. 切勿将机密信息提交到版本控制系统
  2. 使用短期凭证
  3. 实施自动机密信息轮换
  4. 使用 RBAC 限制对机密信息的访问
  5. 审核和监控机密信息的使用情况

使用 LabEx 进行高级机密信息管理

LabEx 提供强大的环境,用于在 Kubernetes 中实践和实施安全的机密信息管理技术,帮助开发者构建企业级容器化应用程序。

潜在的安全风险

graph LR A[安全风险] --> B[未经授权的访问] A --> C[暴露的凭证] A --> D[弱加密] A --> E[不当轮换]

缓解策略

  • 实施严格的 RBAC 策略
  • 使用外部机密信息管理工具
  • 定期审核和轮换机密信息
  • 对静态和传输中的机密信息进行加密

通过掌握这些机密信息管理基础,开发者可以显著增强其 Kubernetes 部署的安全性。

作为环境变量的机密信息

机密信息注入简介

将 Kubernetes 机密信息作为环境变量注入是一种在运行时为应用程序安全地提供敏感配置的强大技术。

注入方法

graph TD A[机密信息注入方法] --> B[envFrom] A --> C[env] A --> D[卷挂载]

注入技术

1. 直接环境变量注入

apiVersion: v1
kind: Pod
metadata:
  name: secret-env-example
spec:
  containers:
    - name: app-container
      image: ubuntu:22.04
      env:
        - name: DB_USERNAME
          valueFrom:
            secretKeyRef:
              name: database-secret
              key: username
        - name: DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: database-secret
              key: password

2. 使用 envFrom 进行批量机密信息注入

apiVersion: v1
kind: Pod
metadata:
  name: bulk-secret-env
spec:
  containers:
    - name: app-container
      image: ubuntu:22.04
      envFrom:
        - secretRef:
            name: database-credentials

环境变量注入比较

方法 优点 缺点
单个 env 精确控制 手动配置
envFrom 快速批量注入 粒度较小
卷挂载 支持大型机密信息 设置更复杂

最佳实践

安全注意事项

  • 避免记录环境变量
  • 使用只读文件系统
  • 实施机密信息轮换机制

示例 Python 应用程序

import os

## 访问注入的机密信息
db_username = os.environ.get('DB_USERNAME')
db_password = os.environ.get('DB_PASSWORD')

def connect_database():
    ## 使用机密信息进行数据库连接
    connection = create_connection(
        username=db_username,
        password=db_password
    )

高级机密信息管理工作流程

graph LR A[创建机密信息] --> B[定义 Pod/部署] B --> C[作为环境变量注入] C --> D[应用程序使用机密信息] D --> E[轮换/更新机密信息]

实际演示

## 创建一个机密信息
kubectl create secret generic database-credentials \
  --from-literal=DB_USERNAME=admin \
  --from-literal=DB_PASSWORD=secure_password

## 应用 Pod 配置
kubectl apply -f secret-env-pod.yaml

LabEx 建议

LabEx 鼓励开发者实施安全的机密信息注入实践,强调在云原生环境中保护敏感配置的重要性。

要避免的常见陷阱

  1. 在源代码中硬编码机密信息
  2. 在日志中暴露机密信息
  3. 使用过于宽松的 RBAC 策略
  4. 忽视机密信息轮换

通过掌握将机密信息作为环境变量注入的方法,开发者可以创建更安全、更灵活的 Kubernetes 应用程序。

总结

通过掌握 Kubernetes 机密信息注入技术,开发者可以创建更安全、更灵活的容器化应用程序。了解如何安全地将敏感数据转换为环境变量,可确保更好的配置管理,降低安全风险,并支持可扩展、可维护的云原生部署。