更新时间:2024-01-04 GMT+08:00

密钥Secret安全配置

当前CCE已为secret资源配置了静态加密,用户创建的secret在CCE的集群的etcd里会被加密存储。当前secret主要有环境变量和文件挂载两种使用方式。不论使用哪种方式,CCE传递给用户的仍然是用户配置时的数据。因此建议:

  1. 用户不应在日志中对相关敏感信息进行记录;
  2. 通过文件挂载的方式secret时,默认在容器内映射的文件权限为0644,建议为其配置更严格的权限,例如:
    apiversion: v1
    kind: Pod
    metadata:
      name: mypod
    spec:
      containers:
      - name: mypod
        image: redis
        volumeMounts:
        - name: foo
          mountPath: "/etc/foo"
      volumes:
      - name: foo
        secret:
          secretName: mysecret
          defaultMode: 256

    其中“defaultMode: 256”,256为10进制,对应八进制的0400权限。

  3. 使用文件挂载的方式时,通过配置secret的文件名实现文件在容器中“隐藏”的效果:
    apiVersion: v1
    kind: Secret
    metadata:
      name: dotfile-secret
    data:
      .secret-file: dmFsdWUtMg0KDQo=
    ---
    apiVersion: v1
    kind: Pod
    metadata:
      name: secret-dotfiles-pod
    spec:
      volumes:
      - name: secret-volume
        secret:
          secretName: dotfile-secret
      containers:
      - name: dotfile-test-container
        image: k8s.gcr.io/busybox
        command:
        - ls
        - "-1"
        - "/etc/secret-volume"
        volumeMounts:
        - name: secret-volume
          readOnly: true
          mountPath: "/etc/secret-volume"

    这样.secret-file目录在/etc/secret-volume/路径下通过“ls -l”查看不到,但可以通过“ls -al”查看到。

  4. 用户应在创建secret前自行加密敏感信息,使用时解密。

使用Bound ServiceAccount Token访问集群

基于Secret的ServiceAccount Token由于token不支持设置过期时间、不支持自动刷新,并且由于存放在secret中,pod被删除后token仍然存在secret中,一旦泄露可能导致安全风险。1.23版本以及以上版本CCE集群推荐使用Bound Servcie Account Token,该方式支持设置过期时间,并且和pod生命周期一致,可减少凭据泄露风险。例如:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: security-token-example
  namespace: security-example
spec:
  replicas: 1
  selector:
    matchLabels:
      app: security-token-example
      label: security-token-example
  template:
    metadata:
      annotations:
        seccomp.security.alpha.kubernetes.io/pod: runtime/default
      labels:
        app: security-token-example
        label: security-token-example
    spec:
      serviceAccountName: test-sa
      containers:
        - image: ...
          imagePullPolicy: Always
          name: security-token-example
      volumes:
        - name: test-projected
          projected:
            defaultMode: 420
            sources:
              - serviceAccountToken:
                  expirationSeconds: 1800
                  path: token
              - configMap:
                  items:
                    - key: ca.crt
                      path: ca.crt
                  name: kube-root-ca.crt
              - downwardAPI:
                  items:
                    - fieldRef:
                        apiVersion: v1
                        fieldPath: metadata.namespace
                      path: namespace

具体可参考:https://kubernetes.io/docs/reference/access-authn-authz/service-accounts-admin/