每當 pod 需要存取一些機密資料時,可以透過 secret 取得,今天將討論權限以及如何取得。
kubectl create secret
的指令建立,此時建立時可以直接將原來的密碼寫上kubectl create -f
的方式建立,會需要將密碼轉為 base64因為 secrets 是 base64 編碼,所以在密碼的的儲存上會建議做以下防護:
(1) 對 Secrets 啟用靜態加密
(2) 透過 RBAC 規則限制訪問secret的最小權限
(3) 限制只能透過特定的 container 訪問
(4) 使用外部的 secret store 如 AWS 的 Secrets Mangaer
注意:如果是pem檔在encode時會需要加上-w 0
或者,tls配置可以參考以下方式建立
kubectl create secret tls my-tls-secret \
--cert=path/to/cert/file \
--key=path/to/key/file
# Env 形式
apiVersion: v1
kind: Pod
metadata:
name: envfrom-secret
spec:
containers:
- name: envars-test-container
image: nginx
envFrom:
- secretRef:
name: test-secret
# volumes 形式
apiVersion: v1
kind: Pod
metadata:
name: secret-dotfiles-pod
spec:
volumes:
- name: secret-volume
secret:
secretName: dotfile-secret
containers:
- name: dotfile-test-container
image: registry.k8s.io/busybox
volumeMounts:
- name: secret-volume
readOnly: true
mountPath: "/etc/secret-volume"
# Point to the internal API server hostname
APISERVER=https://kubernetes.default.svc
# Read this Pod's namespace
NAMESPACE=$(cat ${SERVICEACCOUNT}/namespace)
# Read the ServiceAccount bearer token
TOKEN=$(cat ${SERVICEACCOUNT}/token)
# Reference the internal certificate authority (CA)
CACERT=${SERVICEACCOUNT}/ca.crt
# Explore the API with TOKEN
curl --cacert ${CACERT} --header "Authorization: Bearer ${TOKEN}" -X GET ${APISERVER}/api
(3) 也可以透過 ETCD 取得
ETCDCTL_API=3 etcdctl \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
get /registry/secrets/default/secret1 | hexdump -C
參考資料
https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/