K8S實戰(十三)| Secret 對象

前言

Secret 能夠用來保存密碼、密鑰等敏感信息,避免密鑰直接放在 Pod 的YAML定義文件或容器鏡像中致使的泄露問題。html

密鑰使用 Base64 編碼形式存儲於 Secret 對象中,Pod 掛載後自動解碼爲明文。linux

更新歷史

經過 kubectl 建立 Secret

建立用戶名/密碼文件redis

echo -n 'username' > ./username.txt
echo -n 'password' > ./password.txt

寫入 Secret 對象中api

# 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
====
username.txt:  8 bytes
password.txt:  8 bytes

查看密鑰的值微信

# kubectl get secret db-info -o yaml

經過 YAML 建立 Secret

先將要保存的值進行 Base64 編碼app

# 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

  1. 將 Secret 以卷的形式掛載到 Pod 中
  2. 卷中每個文件名對應 Secret 中的一個 key 名稱
  3. Secret 的值以 base64 解碼後明文形式存儲於卷文件中
  4. 支持實時動態更新
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 進行了解耦處理。

它有以下特色:

  1. Secret 對象需先於引用它的 Pod 建立。
  2. Secret 對象和引用它的 Pod 必須位於同一命名空間。
  3. Secret 對象單個大小限制爲 1M。
  4. Secret 對象中數據以純文本的方式存儲在 etcd 中。
  5. 除了以卷形式掛載外,還能夠環境變量形式用於 Pod 中。
  6. 使用環境變量形式的問題是,secret沒法動態實時更新。

官方安全建議:

  1. 管理員應該爲集羣數據開啓靜態加密(v1.13 以上版本)。
  2. 管理員應該限制只有 admin 用戶能訪問 etcd。
  3. API 服務器中的 Secret 數據位於 etcd 使用的磁盤上;應該在再也不使用時擦除/粉碎 etcd 使用的磁盤。
  4. 若是 etcd 運行在集羣內,管理員應該確保 etcd 之間的通訊使用 SSL/TLS 進行加密。
  5. secret 的YAML中包含的 base64 編碼爲可逆編碼,不要將其加入代碼庫或公開。
  6. 防止應用程序讀取 secret 中數據後寫入日誌致使泄露。
  7. 全部能夠運行該 Pod 的用戶都可讀取到掛載卷中的 secret 值。
  8. 任何節點的 root 用戶均可以經過模擬 kubelet 來讀取 API 服務器中的任何 Secret。 僅向實際須要 Secret 的節點發送 Secret 數據才能限制節點的 root 帳號漏洞的影響, 該功能還在計劃中。

聯繫我

微信公衆號:zuolinux_com

微信掃碼關注

相關文章
相關標籤/搜索