前言
Secret 可以用來保存密碼、密鑰等敏感資訊,避免密鑰直接放在 Pod 的YAML定義檔案或容器鏡像中導致的泄露問題,
密鑰使用 Base64 編碼形式存盤于 Secret 物件中,Pod 掛載后自動解碼為明文,
更新歷史
- 20200702 - 初稿 - 左程立
- 原文地址 - https://blog.zuolinux.com/2020/07/02/about-secret.html
通過 kubectl 創建 Secret
創建用戶名/密碼檔案
echo -n 'username' > ./username.txt
echo -n 'password' > ./password.txt
寫入 Secret 物件中
# kubectl create secret generic db-info --from-file=./username.txt --from-file=./password.txt
secret/db-info created
檢查 Secret
# kubectl get secret
NAME TYPE DATA AGE
db-info Opaque 2 106s
查看剛寫入的 db-info 的詳細資訊
# kubectl describe secret db-info
Name: db-info
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque
Data
=https://www.cnblogs.com/zuolinux/p/===
username.txt: 8 bytes
password.txt: 8 bytes
查看密鑰的值
# kubectl get secret db-info -o yaml
通過 YAML 創建 Secret
先將要保存的值進行 Base64 編碼
# echo -n 'username' | base64
dXNlcm5hbWU=
# echo -n 'password' | base64
cGFzc3dvcmQ=
cat secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: base64編碼
password: base64編碼
創建 secret
# kubectl apply -f secret.yaml
secret/mysecret created
查看
# kubectl get secret
NAME TYPE DATA AGE
mysecret Opaque 2 2m5s
查看密鑰的值
# kubectl get secret mysecret -o yaml
編輯 secret
kubectl edit secrets mysecret
在 Pod 中使用 Secret
- 將 Secret 以卷的形式掛載到 Pod 中
- 卷中每一個檔案名對應 Secret 中的一個 key 名稱
- Secret 的值以 base64 解碼后明文形式存盤于卷檔案中
- 支持實時動態更新
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mypod
image: redis
volumeMounts:
- name: foo
mountPath: "/etc/foo"
readOnly: true
volumes:
- name: foo
secret:
secretName: mysecret
以上示例中,
將名為 mysecret 的 secret 物件映射為卷,卷名為 foo,
將名為 foo 的卷掛載到 Pod 中的路徑 /etc/foo 下面,
mysecret 中username/password兩個key,分別映射為檔案,
多個 Pod 可以共享一個卷,
可以進入 Pod 中查看這兩個檔案內容
# kubectl exec -it mypod -- ls /etc/foo/
password username
# kubectl exec -it mypod -- cat /etc/foo/username
admin
# kubectl exec -it mypod -- cat /etc/foo/password
password
結束語
Secret 物件將重要性高的秘鑰和 Pod 進行了解耦處理,
它有如下特點:
- Secret 物件需先于參考它的 Pod 創建,
- Secret 物件和參考它的 Pod 必須位于同一命名空間,
- Secret 物件單個大小限制為 1M,
- Secret 物件中資料以純文本的方式存盤在 etcd 中,
- 除了以卷形式掛載外,還可以環境變數形式用于 Pod 中,
- 使用環境變數形式的問題是,secret無法動態實時更新,
官方安全建議:
- 管理員應該為集群資料開啟靜態加密(v1.13 以上版本),
- 管理員應該限制只有 admin 用戶能訪問 etcd,
- API 服務器中的 Secret 資料位于 etcd 使用的磁盤上;應該在不再使用時擦除/粉碎 etcd 使用的磁盤,
- 如果 etcd 運行在集群內,管理員應該確保 etcd 之間的通信使用 SSL/TLS 進行加密,
- secret 的YAML中包含的 base64 編碼為可逆編碼,不要將其加入代碼庫或公開,
- 防止應用程式讀取 secret 中資料后寫入日志導致泄露,
- 所有可以運行該 Pod 的用戶均可讀取到掛載卷中的 secret 值,
- 任何節點的 root 用戶都可以通過模擬 kubelet 來讀取 API 服務器中的任何 Secret, 僅向實際需要 Secret 的節點發送 Secret 資料才能限制節點的 root 賬號漏洞的影響, 該功能還在計劃中,
聯系我
微信公眾號:zuolinux_com

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/78500.html
標籤:其他
