使用Kubernetes Secrets存储Azure DevOps凭证

将Azure DevOps的PAT(Personal Access Token)或其他凭证存储为Kubernetes Secret,确保敏感信息不被暴露在Pod定义或环境变量中。通过kubectl命令行工具创建Secret:

kubectl create secret generic azure-devops-cred \
  --from-literal=username=<your-username> \
  --from-literal=password=<your-pat>

集成Secret到Pod或Deployment

在Pod或Deployment的YAML配置中,通过volume挂载或环境变量引用Secret。推荐使用volume挂载方式,减少敏感信息在容器环境中的暴露风险:

env:
- name: AZURE_DEVOPS_USERNAME
  valueFrom:
    secretKeyRef:
      name: azure-devops-cred
      key: username
- name: AZURE_DEVOPS_PASSWORD
  valueFrom:
    secretKeyRef:
      name: azure-devops-cred
      key: password

使用外部Secret管理工具

对于更复杂的场景,考虑使用外部工具如Azure Key Vault或HashiCorp Vault集成Kubernetes。通过CSI (Container Storage Interface)驱动将Azure Key Vault中的Secret动态注入到Pod中:

volumes:
- name: secrets-store
  csi:
    driver: secrets-store.csi.k8s.io
    readOnly: true
    volumeAttributes:
      secretProviderClass: "azure-devops-cred"

限制Secret的访问权限

通过Kubernetes RBAC(Role-Based Access Control)限制哪些ServiceAccount或用户能够访问包含Azure DevOps凭证的Secret。创建Role和RoleBinding确保最小权限原则:

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: secret-reader
rules:
- apiGroups: [""]
  resources: ["secrets"]
  resourceNames: ["azure-devops-cred"]
  verbs: ["get"]

定期轮换Secret

建立自动化流程定期轮换Azure DevOps的PAT或其他凭证。结合Kubernetes的CronJob和Azure DevOps API实现自动更新Secret:

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: rotate-azure-devops-secret
spec:
  schedule: "0 0 * * 0"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: rotate-secret
            image: your-rotation-script-image
          restartPolicy: OnFailure

监控和审计Secret访问

启用Kubernetes审计日志并集成到SIEM工具中,监控对包含Azure DevOps凭证的Secret的访问。通过工具如Falco或Aqua Security检测异常访问模式:

kubectl get --raw /api/v1/namespaces/default/secrets/azure-devops-cred | jq

加密静态Secret数据

启用Kubernetes的静态数据加密功能,确保etcd中存储的Secret数据被加密。配置EncryptionConfiguration使用Azure Key Vault作为KMS提供者:

apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
- resources:
  - secrets
  providers:
  - kms:
      name: azure-keyvault
      endpoint: unix:///opt/azurekms.socket
      cachesize: 10

使用Sealed Secrets进行GitOps

在GitOps工作流中,使用Sealed Secrets工具将加密后的Secret存储在版本控制系统中。Sealed Secrets只能由目标集群解密,确保凭证安全:

kubeseal --format=yaml < secret.yaml > sealedsecret.yaml

更多推荐