K8S Secret 介绍

2020-07-21 container

在 K8S 中通过 configmap 保存了常用配置,但是因为是明文保存会导致安全问题,对于敏感信息可以通过 Secret 保存。

简介

通过 Secret 对象来保存数据量较小的敏感信息,例如密码、OAuth 令牌和 SSH 密钥等,默认只采用 Base64 进行加密,所以只要能访问 API 或者 ETCD 的用户都可以访问。

所以,如果要使用,建议为 Secret 启用静态加密;启用 RBAC 规则来限制对 Secret 的读写操作。但需要注意,任何被允许创建 Pod 的人都默认地具有读取 Secret 的权限。

针对不同的使用场景,K8S 提供的 Secret 包含了多种类型:

  • Opaque 实际就是透明,如果用户没有加密,那么保存的就是明文。
----- 生成Base64编码,在YAML文件中使用
# echo -n 'my-app' | base64
# echo -n '39528$vdg7Jb' | base64

----- 这里的数据必须用Base64编码,否则会报错
# vim secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: test-secret
data:
  username: bXktYXBw
  password: Mzk1MjgkdmRnN0pi
----- 也可以使用命令行添加
# kubectl create secret generic test-secret --from-literal='username=my-app' \
   --from-literal='password=39528$vdg7Jb'

----- 直接查看ETCD保存数据,实际上是明文保存,可以通过 ETCDCTL_API=3 设置API版本
# etcdctl --endpoints=http://127.0.0.1:2379 get /registry/secrets/default/test-secret | hexdump -C

----- 启动一个Pod进行验证
# vim pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: secret-test-pod
spec:
  containers:
  - image: alpine:latest
    name: alpine-app
    imagePullPolicy: Never
    command: ["/bin/sleep", "10000"]
    env:
    - name: SECRET_USERNAME
      valueFrom:
        secretKeyRef:
          name: test-secret
          key: username
    volumeMounts:
    - mountPath: /etc/secret
      name: secret-volume
  volumes:
    - name: secret-volume
      secret:
        secretName: test-secret

----- 可以验证输出
# kubectl exec -it secret-test-pod -- /bin/sh
#/ cat /etc/secret/username
#/ cat /etc/secret/password