秘訣是什麼?
Kubernetes 機密是允許您存儲和管理敏感信息的對象。機密可以包含諸如 SSH 密鑰、OAuth 數據或其他用戶憑據(如密碼)之類的數據。它們通常以 Kubernetes 原生的方式存儲在集群中。 秘密對象使您可以更好地控制敏感數據的使用方式。它還降低了將數據暴露給未經授權的第三方的風險。
筆記
默認情況下,任何有權訪問 Kubernetes API 或 etcd(底層數據存儲)的人都可以看到秘密。 創建 Secrets 資源時,API 服務器以 base64 編碼格式將數據存儲在 etcd 中。 Base64 不是加密。 為了安全使用 Secrets,現在調整最小推薦值。
- 為機密啟用靜態加密。
- 快速啟用或重新配置限制讀取和寫入機密的 RBAC 規則。請注意,任何有權創建 Pod 的人都可以隱式使用機密。
為什麼要保守秘密?
默認情況下,Kubernetes 通常是不安全的。所有 Pod 都使用 CAP_NET_RAW 權限級別。默認情況下將原始數據包注入網絡的能力對於某些啟動任務來說是一種有用且有效的工具。但是,強烈建議不要在配置後啟用此狀態,因為任何 Pod 都可以打開原始套接字。
將這些默認設置保留得比必要的時間長,可能會使攻擊者劫持單個 pod 並在整個 Kubernetes 集群中註入惡意數據包。應立即使用機密的第一個特權級別,然後更改以鎖定係統。
快的 etcd 搜索 它暴露了數千個可公開訪問的 etcd 服務器,突出了提高安全性的必要性。 etcd 是一個開源的分佈式鍵值存儲,用於存儲和管理 Kubernetes 配置數據、狀態數據和元數據。
秘密如何運作?
Secret 可以作為卷掛載,也可以作為環境變量暴露給 Kubernetes Pod 中的容器。有兩種類型的秘密:
- 內置秘密:Kubernetes 服務帳戶會自動創建一個秘密並使用您的 API 憑證將其附加到容器中。如果出現其他安全問題,可以覆蓋或禁用此方法。
- 自定義秘密:在這裡您可以定義敏感或私人數據並創建秘密來存儲它。
這些機密可以放置在 YAML 文件或其他指定位置,並用於驗證訪問、確定權限級別或用於其他身份驗證目的。
如何保守秘密
通過假設會發生洩露來開始保護您的秘密的過程。這個概念是零信任安全的基本原則之一。此外,TLS 加密必須用於傳輸中的所有機密。這種編碼應該在應用層完成。
與密碼一樣,定期更改密碼是個好主意。使用隔離將機密與所有其他對象分開只會進一步減少攻擊面。最後,您可以通過在所有訪問門戶、日誌和其他服務網關中採用合理的審計實踐來提高安全性。這些步驟提供了更精細的安全控制流程來保護您的機密。
用於檢索秘密的三種方法可以分類如下:
- 公然攻擊: 黑客、入侵者或其他入侵者經常掃描或操縱對集群的訪問以獲取信息。
- 意外暴露:秘密可能會從存儲在存儲桶或存儲庫中的文件中意外洩露。
- 權限配置錯誤注意:如果權限設置得太低,或者如果組用戶被授予額外權限,則可能會出現安全問題。
信封加密
信封加密是 Kubernetes 如何在另一個密鑰下加密一個密鑰。 它位於 Kubernetes API 和 etcd 服務器之間,對傳輸中的數據進行加密,因此未加密的信息不會存儲在 etcd 中。 在 Kubernetes 1.7 中,此功能內置於核心 Kubernetes 系統中。
Kubernetes 使用的另一個工具是密封的秘密。 密封的秘密 用於管理將敏感信息部署到 Kubernetes 集群的開源工具。它還將機密安全地存儲在 Git 存儲庫中,從而能夠集成到 CI/CD 管道中。
創建秘密
您可以使用以下方法之一創建 Secret 對象:
自動地
您可以使用 kubectl create secret 命令。這是創建秘密的格式。
[email protected] [~]# kubectl create secret (type) (name) (data)
- 類型:該類型被定義為通用 TLS 或 docker-registry 元素。
- 姓名: 這是秘密的名字。
- 數據:這是目錄路徑或鍵值對。
手動的
可以通過多種方式手動創建秘密。 您可以將機密信息添加到 JSON 或 YAML 文件並使用 kubectl apply 命令。此調用將文件中包含的對象定義為 Secrets。然後使用以下命令部署對象:
[email protected] [~]# kubectl create -f filename.yaml
此外,您可以使用以下標誌 –from-file 或 –from-env-file 從一個或多個文件生成機密。 使用 –from-file 標誌創建 Secret 時,文件的全部內容將成為 Secret。 如果 Secret 值包含多個鍵值對,請改用 –from-env-file 標誌。您可以使用這些標誌傳遞單個文件或多個文件。
[email protected] [~]# kubectl create secret type name --from-file /path/to/file --from-file /path/to/file2
可以以這種格式使用包含多個文件的目錄。
[email protected] [~]# kubectl create secret type name --from-file /path/to/directory.
以下命令分別創建一個包含兩個文件(user.txt 和 pass.txt)的 Secret。以下命令根據這些文件中的數據設置密鑰。
[email protected] [~]# kubectl create secret generic authme --from-file ./user.txt --from-file ./pass.txt
定制
最後,您可以使用 Secret 創建一個。 定制此工具是通過 kustomization 文件在 Kubernetes 中自定義對象的獨立方式。這允許用戶自定義原始 YAML 文件,同時保持原始 YAML 文件完整。
編輯秘密
您可以使用以下命令編輯您當前的 Secret:
[email protected] [~]#kubectl edit secrets authme
此命令打開默認配置編輯器。這允許您更新數據字段中包含的 base64 編碼的 Secret 參數。
使用秘密
要使用 Secret,您的 Pod 需要對其進行引用。 Pod 以三種方式使用秘密:
- 作為包含文件或作為駐留在一個或多個容器中的已安裝卷。
- 作為容器中的環境變量。
- 如果你使用 kubelet 拉取 pod 的鏡像。
注意:Secret 對象的名稱必須是您的完全限定域名 (FQDN) 的子域。
Secret 也可以在系統的各個部分中使用,而無需將它們直接暴露給 Pod。關於如何使用秘密的完整說明將在另一篇文章中介紹,因此我將在此停止。
結論是

機密是包含敏感數據的對象,例如密碼、SSH 密鑰、OAuth 令牌。將這些秘密存儲在 Secrets 中是一種比將這些秘密存儲在 Pod 定義或容器映像中更安全和靈活的方法。 使用 Secrets 的主要目的是確保集群安全,同時為需要訪問的用戶和服務提供輕鬆訪問。
CTA
Microsoft 的解決方案團隊由知識淵博且經驗豐富的託管顧問組成,他們對本文中討論的技術有著深刻的理解。如果您對此信息有任何疑問,我們可以 24/7 全天候回答有關本文的任何問題。
了解如何通過由 VMware 和 NetApp 提供支持的託管雲或私有云來利用這些優勢。如果您使用的是完全託管的 VPS 服務器、雲專用服務器、私有父服務器或專用服務器所有者,並且想對這些平台中的任何一個進行更改,請致電 800.580.4985 或聊天或開票以了解如何操作。 !