如何将机密信息注入 Kubernetes Pod

KubernetesKubernetesBeginner
立即练习

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

简介

在现代云原生应用程序中,安全地管理诸如凭证和配置数据等敏感信息至关重要。本教程提供了关于向Kubernetes Pod注入机密信息的全面指导,帮助开发人员和DevOps专业人员在容器化环境中实施强大的安全策略来管理机密信息。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL kubernetes(("Kubernetes")) -.-> kubernetes/AdvancedCommandsGroup(["Advanced Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/TroubleshootingandDebuggingCommandsGroup(["Troubleshooting and Debugging Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/ConfigurationandVersioningGroup(["Configuration and Versioning"]) kubernetes(("Kubernetes")) -.-> kubernetes/BasicCommandsGroup(["Basic Commands"]) kubernetes/BasicCommandsGroup -.-> kubernetes/create("Create") kubernetes/AdvancedCommandsGroup -.-> kubernetes/apply("Apply") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/describe("Describe") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/exec("Exec") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/logs("Logs") kubernetes/ConfigurationandVersioningGroup -.-> kubernetes/config("Config") subgraph Lab Skills kubernetes/create -.-> lab-419028{{"如何将机密信息注入 Kubernetes Pod"}} kubernetes/apply -.-> lab-419028{{"如何将机密信息注入 Kubernetes Pod"}} kubernetes/describe -.-> lab-419028{{"如何将机密信息注入 Kubernetes Pod"}} kubernetes/exec -.-> lab-419028{{"如何将机密信息注入 Kubernetes Pod"}} kubernetes/logs -.-> lab-419028{{"如何将机密信息注入 Kubernetes Pod"}} kubernetes/config -.-> lab-419028{{"如何将机密信息注入 Kubernetes Pod"}} end

Kubernetes 中的机密信息

什么是 Kubernetes 机密信息?

Kubernetes 机密信息是用于帮助管理敏感信息的对象,如密码、OAuth 令牌、SSH 密钥及其他机密数据。它们提供了一种将敏感配置数据与 Pod 和容器定义分离的方式,增强了应用程序部署中的安全性和灵活性。

Kubernetes 机密信息的类型

Kubernetes 支持多种类型的机密信息,以适应不同的用例:

机密信息类型 描述 常见用例
Opaque 默认机密信息类型 通用键值对
Docker Registry 存储容器镜像仓库的凭证 拉取私有镜像
TLS 存储 TLS 证书 HTTPS 配置
Service Account 认证令牌 集群访问管理

机密信息管理工作流程

graph TD A[创建敏感数据] --> B[对数据进行编码] B --> C[创建 Kubernetes 机密信息] C --> D[在 Pod 中挂载机密信息] D --> E[在容器中访问机密信息]

关键特性

  • 机密信息是按命名空间作用域的
  • 数据采用 base64 编码
  • 可以手动或自动创建
  • 支持多种使用方式

示例:创建基本机密信息

## 从文字值创建机密信息
kubectl create secret generic db-credentials \
  --from-literal=username=admin \
  --from-literal=password=mysecretpassword

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

安全注意事项

  • 机密信息存储在 etcd 中,并且可以在静止时进行加密
  • 建议使用 RBAC 来限制对机密信息的访问
  • 对于高级场景,考虑使用外部机密信息管理工具

LabEx 建议

为了实际操作 Kubernetes 机密信息,LabEx 提供了交互式环境,使你能够在安全、可控的环境中试验机密信息的创建和管理。

注入方法

机密信息注入技术概述

Kubernetes 提供了多种将机密信息注入 Pod 的方法,每种方法都有其独特的用例和优势。

1. 环境变量

基本环境变量注入

apiVersion: v1
kind: Pod
metadata:
  name: secret-env-pod
spec:
  containers:
    - name: myapp
      image: ubuntu:22.04
      env:
        - name: DB_USERNAME
          valueFrom:
            secretKeyRef:
              name: db-credentials
              key: username

2. 卷挂载

将机密信息挂载为文件

apiVersion: v1
kind: Pod
metadata:
  name: secret-volume-pod
spec:
  containers:
    - name: myapp
      image: ubuntu:22.04
      volumeMounts:
        - name: secret-volume
          mountPath: "/etc/secrets"
          readOnly: true
  volumes:
    - name: secret-volume
      secret:
        secretName: db-credentials

注入方法比较

方法 优点 缺点
环境变量 简单、快速 仅限于小数据
卷挂载 支持大文件 需要更多配置
projected 卷 灵活、多源 更复杂

3. projected 卷

高级机密信息投影

apiVersion: v1
kind: Pod
metadata:
  name: projected-secrets-pod
spec:
  containers:
    - name: myapp
      image: ubuntu:22.04
      volumeMounts:
        - name: projected-secrets
          mountPath: "/projected-secrets"
  volumes:
    - name: projected-secrets
      projected:
        sources:
          - secret:
              name: db-credentials
          - secret:
              name: ssl-certs

机密信息注入工作流程

graph TD A[创建 Kubernetes 机密信息] --> B{注入方法} B --> |环境变量| C[直接注入到 Pod 环境] B --> |卷挂载| D[基于文件的机密信息] B --> |projected 卷| E[多个机密信息源]

最佳实践

  • 对于较大的机密信息使用卷挂载
  • 尽量减少机密信息暴露
  • 定期轮换机密信息
  • 使用 RBAC 控制对机密信息的访问

LabEx 提示

LabEx 提供交互式实验,以便在真实的 Kubernetes 环境中练习不同的机密信息注入技术。

安全最佳实践

Kubernetes 机密信息安全框架

1. 静态加密

对存储在 etcd 中的机密信息实施加密:

## 启用静态加密
sudo vi /etc/kubernetes/manifests/encryption-config.yaml
apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
- resources:
- secrets
providers:
- aescbc:
keys:
- name: key1
secret: ${ENCRYPTION_KEY}

2. 访问控制策略

RBAC 机密信息管理

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
rules:
  - apiGroups: [""]
    resources: ["secrets"]
    verbs: ["get", "list"]

机密信息安全矩阵

安全维度 建议 实施级别
加密 使用 AES - 256 集群级别
访问控制 最小化 RBAC 命名空间级别
机密信息轮换 自动轮换 应用程序级别

3. 机密信息管理工作流程

graph TD A[创建机密信息] --> B{验证} B --> |通过| C[加密] C --> D[应用 RBAC] D --> E[定期轮换] E --> F[审计日志记录]

4. 外部机密信息管理

集成外部机密信息管理器

  • HashiCorp Vault
  • AWS 机密信息管理器
  • Azure 密钥保管库

5. 运行时安全实践

容器级保护

  • 避免在容器镜像中嵌入机密信息
  • 使用短期凭证
  • 实施最小权限原则

高级机密信息处理

## 自动机密信息轮换脚本
#!/bin/bash
CURRENT_SECRET=$(kubectl get secret db-credentials -o jsonpath='{.data.password}' | base64 -d)
NEW_SECRET=$(openssl rand -base64 32)
kubectl create secret generic db-credentials-new --from-literal=password=$NEW_SECRET

监控与审计

跟踪机密信息访问

  • 启用 Kubernetes 审计日志记录
  • 实施实时机密信息访问监控
  • 使用安全工具进行全面跟踪

LabEx 安全建议

LabEx 提供全面的实验,以便在可控环境中实践和验证 Kubernetes 机密信息安全配置。

关键要点

  • 对静态机密信息进行加密
  • 实施严格的 RBAC
  • 定期轮换机密信息
  • 使用外部机密信息管理工具
  • 持续监控和审计机密信息访问

总结

在 Kubernetes 中理解并实施恰当的机密信息注入技术对于维护应用程序安全至关重要。通过利用 Kubernetes 原生的机密信息管理功能并遵循最佳实践,团队能够在确保容器化应用程序无缝部署和配置的同时,有效地保护敏感数据。