什么是 kubeconfig 文件?
kubeconfig 文件是 Kubernetes 的配置文件,用于存儲集群的訪問憑證、API Server 的地址和認證信息,允許用戶和 kubectl 等工具與 Kubernetes 集群進行交互。它通常包含多個集群的配置,支持通過上下文(context)切換不同的集群、用戶和命名空間。kubeconfig 文件的典型路徑是 ~/.kube/config,但也可以通過 KUBECONFIG 環境變量指定其他路徑。
組成部分
- clusters: 存儲 Kubernetes 集群的信息,包括集群的 API 服務器地址和 CA 證書。
- users: 存儲與集群進行交互的用戶信息,包括認證憑證(如用戶名、密碼、Bearer token 或證書)。
- contexts: 定義了一個上下文,關聯了特定的集群、用戶和命名空間,用戶通過上下文來決定連接哪個集群。
- current-context: 指定當前使用的上下文。
泄露風險
如果 kubeconfig 文件被泄露,攻擊者可以使用其中的信息訪問 Kubernetes 集群。具體風險包括:
- 非法訪問集群:攻擊者可以用泄露的 kubeconfig 文件直接連接到集群,執行任意操作,甚至獲取敏感數據。
- 數據泄露:集群中可能存儲了大量敏感數據(如私密配置、數據庫憑證等),攻擊者一旦訪問成功,可能會竊取數據。
- 權限濫用:如果文件中包含管理員權限,攻擊者可以完全控制集群,修改配置,甚至刪除資源。
常見的泄露途徑
1. 版本控制系統(VCS)
- 錯誤提交:開發人員不小心將
kubeconfig
文件提交到 GitHub、GitLab 或其他公共代碼庫。 - 未配置
.gitignore
:如果沒有正確設置.gitignore
文件,kubeconfig
文件可能會被誤提交到版本控制系統,導致泄露。 - 歷史記錄泄露:即使文件已刪除或更改,如果歷史提交記錄中包含了該文件,它仍然可以通過版本控制系統恢復。
2. 不當的文件權限
- 操作系統權限配置不當:如果
kubeconfig
文件的權限過于寬松(如 777),非授權用戶或程序也可以訪問該文件。 - 誤共享文件:將
kubeconfig
文件存儲在共享文件夾或公共目錄中,導致文件被其他用戶訪問。
3. 開發環境泄露
- 不安全的開發機器:如果開發人員在未加密的本地計算機上存儲
kubeconfig
文件且機器遭到入侵,攻擊者可以獲取該文件。 - 共享開發環境:如果開發環境被多個開發人員共享,并且沒有進行嚴格的訪問控制,
kubeconfig
文件也可能被其他人訪問。
4. 云平臺配置錯誤
- 不當的 IAM 配置:如果將 Kubernetes 集群的憑證(如 token 或證書)存儲在云提供商的存儲中(例如 AWS S3、Google Cloud Storage),并且存儲桶或對象沒有正確的訪問控制策略,可能導致憑證被泄露。
- 錯誤配置的 API 訪問:如果云平臺上設置的 Kubernetes 訪問控制策略不嚴格,惡意用戶可能通過漏洞獲得憑證。
5. 容器鏡像
- 憑證硬編碼在鏡像中:某些開發人員可能會將憑證硬編碼到應用程序中或將
kubeconfig
文件放入容器鏡像中,從而使憑證在鏡像被拉取時泄露。 - 容器共享:在多個容器之間不當共享 Kubernetes 憑證可能會導致泄露。
6. 日志文件泄露
- 錯誤的日志記錄:應用程序或集群的日志文件中可能意外記錄了
kubeconfig
文件的內容或認證信息(如 token、證書等)。 - 日志文件權限不足:如果日志文件的權限過于寬松,攻擊者可能從日志文件中提取出憑證信息。
7. 社交工程與釣魚攻擊
- 釣魚郵件:攻擊者通過釣魚郵件或社交工程手段,誘使用戶將
kubeconfig
文件上傳到不安全的地方或通過不安全的方式發送。 - 假冒網站:攻擊者可能創建假冒的 Kubernetes 登錄頁面或API接口,誘使用戶上傳
kubeconfig
文件,進而竊取憑證。
8. 不當的文件備份和遷移
- 備份未加密:如果
kubeconfig
文件被備份但沒有進行加密,備份文件可能成為泄露途徑。 - 無安全傳輸:在遷移或傳輸
kubeconfig
文件時,使用不安全的方式(如 FTP 或未加密的 HTTP)可能導致文件在傳輸過程中被竊取。
9. 惡意軟件與病毒
- 木馬或惡意軟件:攻擊者可能通過惡意軟件或病毒竊取本地文件,包括
kubeconfig
文件。這些惡意軟件可能會掃描本地文件系統并自動上傳敏感文件。 - 鍵盤記錄器:如果計算機感染了鍵盤記錄器,攻擊者可以捕捉到用戶輸入的憑證。
10. 不當的第三方工具或插件
- 不信任的工具:一些第三方工具、插件或應用程序可能會不安全地處理或存儲 Kubernetes 憑證。如果這些工具存在漏洞或不安全的設計,它們可能會導致
kubeconfig
文件的泄露。 - 公開共享的 API:通過某些 API 或工具訪問 Kubernetes 集群時,如果沒有加密傳輸或者 API 配置不當,可能導致憑證泄露。
11. 共享或過期的憑證
- 與他人共享憑證:如果管理員或開發人員將
kubeconfig
文件共享給他人,但沒有撤銷過期或不再使用的憑證,也可能導致憑證泄露。 - 公共訪問控制:某些情況下,
kubeconfig
文件可能與其他用戶共享或傳遞,而沒有采取適當的訪問控制。
利用方式
攻擊者獲取到config文件后,如何利用?
1. kubectl 官方客戶端連接工具?
安裝工具 | Kubernetes
我這里使用scoop安裝kubectl工具
?
#獲取node信息
kubectl -s https://192.168.48.142:6443 --kubeconfig=config --insecure-skip-tls-verify get node#獲取pod信息
kubectl -s https://192.168.48.142:6443 --kubeconfig=config --insecure-skip-tls-verify get pod#創建惡意pod
kubectl -s https://192.168.48.142:6443 --kubeconfig=config --insecure-skip-tls-verify create -f 1.yaml
2. dashboard 登錄
使用Kubeconfig方式進行登錄,選擇獲取到的config文件
登錄成功,創建惡意pod
如何防范
為了防止 Kubernetes kubeconfig
文件泄露,需要采取一系列的安全措施來保護該文件及其內容。以下是一些有效的防護措施:
1. 限制文件訪問權限
文件權限設置:確保 kubeconfig
文件只能由授權用戶訪問,使用操作系統的文件權限控制功能,限制文件的讀寫權限。
設置文件權限為 600(僅允許文件所有者讀寫):
chmod 600 ~/.kube/config
目錄權限:確保 .kube
目錄的權限足夠嚴格,防止其他用戶查看文件:
chmod 700 ~/.kube
2. 避免加入版本控制系統
使用 .gitignore
:確保 kubeconfig
文件和其他敏感配置文件不被意外提交到 Git 倉庫。將 .kube/
目錄添加到 .gitignore
文件中,防止泄露:
echo ".kube/" >> .gitignore
3. 使用環境變量指定路徑
限制文件位置:通過設置 KUBECONFIG
環境變量指定 kubeconfig
文件的路徑,這樣可以將敏感配置文件存放在更安全的位置,而不是默認的 ~/.kube/config
。
export KUBECONFIG=/path/to/secure/config
限制環境變量訪問:確保只有授權的進程和用戶能夠訪問 KUBECONFIG
環境變量。避免通過共享的環境或配置文件暴露該變量。
4. 使用安全的身份驗證和認證方式
避免存儲敏感憑證:避免將 API Token 或證書等敏感憑證直接存儲在 kubeconfig
文件中。可以使用外部的認證機制(如 OAuth2、AWS IAM、Azure AD)來替代硬編碼憑證。
使用短期證書或 Token:如果必須使用 Token 或證書,盡量使用短期有效的證書或 Token,并定期輪換它們。
啟用多因素認證:盡量啟用多因素認證(MFA),增加一個額外的安全層,減少憑證泄露的風險。
5. 限制訪問控制
最小權限原則:為用戶和服務帳戶分配最小權限,確保即使 kubeconfig
文件泄露,攻擊者獲得的權限也受到限制。使用 RBAC(Role-Based Access Control)確保用戶只能訪問他們需要的資源。
限制 API 服務器訪問:通過防火墻、IP 白名單或 VPN 等方式,限制對 Kubernetes API Server 的訪問,避免外部未經授權的訪問。
6. 審計和監控
啟用審計日志:啟用 Kubernetes 審計日志,以便在發生敏感操作時能夠及時發現。這樣可以追蹤任何濫用 kubeconfig
文件的行為。
監控配置文件訪問:監控 kubeconfig
文件的訪問和修改操作,任何未經授權的訪問都能被迅速識別并響應。
7. 定期審計和更新 kubeconfig
文件
定期更換憑證:定期更換 kubeconfig
文件中的 Token、證書和憑證,減少憑證泄露后的潛在風險。
清理無用的 kubeconfig
文件:確保只有必要的用戶或機器持有 kubeconfig
文件,對于不再使用的配置文件及時刪除。
8. 加密存儲
加密文件存儲:如果需要在磁盤上存儲 kubeconfig
文件,可以考慮使用加密文件系統或工具,如 LUKS(Linux Unified Key Setup)來加密磁盤分區,確保即使文件被竊取,也無法被輕易解密。
9. 在容器和云環境中使用 IAM/Service Account
容器化部署:如果在容器環境中部署 Kubernetes 客戶端,避免將 kubeconfig
文件直接嵌入容器鏡像。使用基于環境變量或 Kubernetes Secrets 等方式管理憑證。
云平臺 IAM:在云平臺(如 AWS、Azure、GCP)中,利用 IAM(Identity and Access Management)來管理訪問,而不是依賴本地的 kubeconfig
文件。例如,AWS 可以使用 eks
配置文件或 IAM 角色來訪問 Kubernetes。
總結
kubeconfig
文件是 Kubernetes 集群訪問的關鍵憑證,泄露可能導致嚴重的安全后果。通過限制文件訪問、避免上傳至版本控制系統、使用更安全的認證方式、啟用審計和監控等措施,可以大大降低 kubeconfig
文件泄露的風險,保護 Kubernetes 集群免受攻擊。