Hello folks,我是 Luga,今天我們來聊一聊在Kubernetes Cluster 編排生態(tài)環(huán)境中一個(gè)至關(guān)重要的安全 Topic:Kubectl Plugin。
(資料圖片僅供參考)
基于 Go 語言的優(yōu)勢,Kubernetes 在設(shè)計(jì)上往往具有令人難以置信的可定制性。Kubernetes 支持針對特定用例場景的自定義配置,從而消除了對底層功能應(yīng)用補(bǔ)丁的需要。因此,插件化便是擴(kuò)展 Kubernetes 功能和提供開箱即用產(chǎn)品的最佳實(shí)踐方法。
讓我們更深入地研究 Kubectl Plugin列表,這里,筆者強(qiáng)烈安利這些插件,畢竟,在實(shí)際的業(yè)務(wù)場景中,基于不同的業(yè)務(wù)訴求,這些插件可能對任何角色的人員都非常有用,尤其是維護(hù)、安全工程師等。
接下來,讓我們進(jìn)入今天的主題 ...
KubernetesPlugin概述
通常情況下,基于 Kubernetes 自身特性,用戶可以為 Kubernetes 命令行工具Kubectl 安裝和編寫接口擴(kuò)展以滿足實(shí)際的業(yè)務(wù)場景需要。?
通過將核心 Kubectl 命令視為與 Kubernetes Cluster 交互的基本構(gòu)建塊,集群管理員可以將插件視為利用這些構(gòu)建塊創(chuàng)建更復(fù)雜行為的一種方式。
基于插件,我們可以使用新的子命令擴(kuò)展 Kubectl,以及允許使用 Kubectl 主要發(fā)行版中未包含的新功能和自定義功能以滿足特定功能的需要。
在實(shí)際的業(yè)務(wù)場景中,Kubernetes 插件能夠?yàn)樗鶚?gòu)建的容器平臺提供無數(shù)的安全優(yōu)勢?;跇I(yè)務(wù)訴求,事件響應(yīng)者或維護(hù)者能夠可以使用他們所選擇的語言進(jìn)行“即時(shí)”附加功能的擴(kuò)展或二次開發(fā)。
在某些特定的場景中,由于 Kubernetes 功能在企業(yè)需要實(shí)現(xiàn)“范圍外”功能的情況下往往不足,因此,團(tuán)隊(duì)通常需要實(shí)施自己的自定義插件開發(fā)操作。
Kubernetes安全插件解析
在本文中,筆者將從 Krew插件管理器以及自定義插件開發(fā)等 2 個(gè)方面簡要為大家解析不同場景下的Kubectl 安全插件實(shí)踐。
KrewPlugin
Krew 是由 Kubernetes 特別興趣小組 (SIG) CLI 社區(qū)維護(hù)的插件管理器。從本質(zhì)上來講,Krew 本身就是一個(gè)插件,基于此 ,使得 Kubectl 所維護(hù)插件的使用變得更加容易,并能夠幫助我們在機(jī)器上發(fā)現(xiàn)、安裝和管理它們,類似于 apt、dnf或brew等工具。其項(xiàng)目地址:https://github.com/kubernetes-sigs/krew
截至目前,Krew 上已經(jīng)提供了 210 多個(gè) Kubectl 插件——而且這個(gè)數(shù)字還在不斷增加。隨著時(shí)間的推移,一些項(xiàng)目被積極使用,同時(shí),一些項(xiàng)目也被逐漸棄用,但仍然可以通過 Krew 訪問。
作為一款強(qiáng)大的插件及平臺,Krew 適用于所有主流平臺,例如 macOS、Linux 和 Windows。對于 Kubectl 用戶:Krew 幫助我們以一致的方式查找、安裝和管理 Kubectl 插件。除此,Krew 還能過幫助 Kubectl 插件開發(fā)人員:使得我們在多個(gè)平臺上打包和分發(fā)所構(gòu)建的插件,并通過 Krew 的集中式插件存儲庫使得它們可被發(fā)現(xiàn)。
通過 Krew 安裝 Kubectl 插件的命令,具體如下所示:
[leonli@Leon ~ % ]kubectl krew install
通過 Krew 插件索引提供的 Kubectl 插件若未經(jīng)審計(jì),這可能會導(dǎo)致供應(yīng)鏈出現(xiàn)問題。如上述所述,Krew 插件索引包含數(shù)百個(gè) kubectl 插件:https ://krew.sigs.k8s.io/plugins/
當(dāng)我們無意或有意安裝和運(yùn)行第三方插件時(shí),可能需要自行承擔(dān)未知的潛在風(fēng)險(xiǎn)。歸根結(jié)底,Kubectl 插件只是一個(gè)在 Shell 中運(yùn)行的任意程序而已。
這里,筆者將為大家分享如下不同的 Kubectl 安全插件,基于大家的實(shí)際業(yè)務(wù)環(huán)境,使得這些插件或多或少能夠改善我們所構(gòu)建的Kubernetes Cluster 的安全狀況。
1、Stern Plugin
作為一個(gè) Kubectl 插件,Stern 的工作方式更像 Linux 系統(tǒng)命令中的 “tail -f”。與kubectl log -f不同的是,kubectl log -f 對輸入?yún)?shù)有其自身的限制,而 Stern 則允許我們將 Pod ID 和 Container ID 指定為正則表達(dá)式。
Stern遵循任何匹配并將輸出多路復(fù)用在一起,以 Pod 和容器 ID 為前綴,并進(jìn)行顏色編碼以供大家使用。
我們可以使用以下 Krew 命令安裝 Stern,具體如下所示:
[leonli@Leon ~ % ]kubectl krew install stern
在 Stern 中跟蹤應(yīng)用程序名稱的命令,具體如下:
[leonli@Leon ~ % ]kubectl stern appname
這將匹配任何包含單詞 Service 的 Pod 并監(jiān)聽其中的所有容器。如果我們只想查看服務(wù)器容器 Container 的流量,可以這樣操作:
[leonli@Leon ~ % ]kubectl stern --container
這將流式傳輸所有服務(wù)器容器的日志,即使在多個(gè) Pod 中運(yùn)行也是如此。
Stern 插件的一個(gè)有趣的安全用例便是查看 Kubernetes Cluster 的身份驗(yàn)證活動。若要顯示過去 15 分鐘內(nèi)的身份驗(yàn)證活動以及突出顯示的相關(guān)時(shí)間戳詳情,我們可以運(yùn)行如下命令查看:
[leonli@Leon ~ % ]kubectl stern -t --since 15m auth
2、Kubectl-tracePlugin
作為另一款 Kubectl 安全插件,Kubectl-trace允許我們在 Kubernetes Cluster 中安排 bpftrace 程序的執(zhí)行。簡而言之,Kubectl-trace 插件是一個(gè)在 Kubernetes Cluster中進(jìn)行分布式跟蹤的工具。它允許請求通過集群的不同組件(包括 Pod、服務(wù)和入口控制器)時(shí)跟蹤請求的執(zhí)行情況。
我們可以使用以下 Krew 命令安裝Kubectl-trace插件,具體如下所示:
[leonli@Leon ~ % ]kubectl krew install trace
使用 Kubectl-trace 插件的一個(gè)潛在安全優(yōu)勢是它可以幫助我們識別和解決與集群內(nèi)請求處理相關(guān)的問題。例如,如果懷疑某個(gè)特定請求由于集群中的某些問題而被阻止或減慢,我們可以使用 Kubectl-trace 來跟蹤請求在集群中傳播并確定問題的根源。
這個(gè)插件運(yùn)行一個(gè)程序來探測所選節(jié)點(diǎn)上的跟蹤點(diǎn):
[leonli@Leon ~ % ]kubectl trace run -e "tracepoint:syscalls:sys_enter_* { @[probe] = count(); }"
另一個(gè)潛在的安全優(yōu)勢是 Kubectl-trace 可以幫助我們了解請求是如何在集群中處理的,這對于識別潛在的漏洞或錯誤配置很有用。例如,如果發(fā)現(xiàn)某個(gè)請求正在由遭到破壞的 Pod 或服務(wù)處理,我們可以使用 Kubectl-trace 來跟蹤該請求并確定問題的來源。
總的來說,Kubectl-trace 插件可以通過幫助識別和解決與請求處理和執(zhí)行相關(guān)的問題來提高 Kubernetes 集群的安全性。
3、Kubectl-capturePlugin
Sysdig 開源(Sysdig Inspect)的一個(gè)用于容器故障排除、性能調(diào)優(yōu)和安全調(diào)查的強(qiáng)大工具。Sysdig 的團(tuán)隊(duì)創(chuàng)建了一個(gè) Kubectl 插件,它在運(yùn)行 Pod 的底層主機(jī)中觸發(fā)數(shù)據(jù)包捕獲。
我們可以使用以下 Krew 命令安裝kubectl-capture插件,具體如下所示:
[leonli@Leon ~ % ]kubectl krew install kubectl-capture
數(shù)據(jù)包捕獲對于 Kubernetes 中的事件響應(yīng)和取證非常有用。捕獲文件在一段時(shí)間內(nèi)創(chuàng)建并下載到本地,以便將其與Sysdig Inspect一起使用,Sysdig Inspect 是一個(gè)強(qiáng)大的開源界面,旨在直觀地導(dǎo)航數(shù)據(jù)密集的 Sysdig 捕獲,其中包含細(xì)粒度的系統(tǒng)、網(wǎng)絡(luò)和應(yīng)用程序活動 Linux 系統(tǒng)。
只需對集群中任何正在運(yùn)行的 Pod 運(yùn)行以下命令:
[leonli@Leon ~ % ]kubectl capture kinsing-78f5d695bd-bcbd8
在旋轉(zhuǎn)捕獲容器時(shí),需要一些時(shí)間來編譯 Sysdig 內(nèi)核模塊和捕獲系統(tǒng)調(diào)用。完成后,我們可以從工作站讀取 Sysdig Inspect UI 中的內(nèi)容,如下所示:
使用這些工具,分析人員將更容易找到問題的根源或?qū)徍税l(fā)生的情況。如果想更深入,可以閱讀使用 Sysdig Inspect 進(jìn)行容器故障排除或?qū)阂馊萜鬟M(jìn)行分類。
4、Kube Policy AdvisorPlugin
Kube-policy-advisor 插件為所構(gòu)建的 Kubernetes 集群建議 PodSecurityPolicies 和 Open Policy Agent (OPA) 策略。雖然PodSecurityPolicies 已被棄用,因此不應(yīng)使用,但 OPA 是非常推薦的準(zhǔn)入控制器工具。
我們可以使用以下 Krew 命令安裝advise-policy 插件,具體如下所示:
[leonli@Leon ~ % ]kubectl krew install advise-policy
這個(gè) Kubectl 插件為 Kubernetes Cluster 提供安全性和合規(guī)性檢查,除此之外,可以幫助識別集群配置中潛在的安全風(fēng)險(xiǎn)和違反最佳實(shí)踐的行為,并提供有關(guān)如何修復(fù)這些問題的建議。kube-policy-advisor 可以執(zhí)行的檢查類型的一些示例包括:
(1)確保 Pod 以最低權(quán)限運(yùn)行,并且不會被授予不必要的權(quán)限;
(2)檢查密鑰和其他敏感數(shù)據(jù)是否未以純文本形式存儲或簽入源代碼管理;
(3)驗(yàn)證網(wǎng)絡(luò)策略是否到位以防止對資源的未授權(quán)訪問;
(4)評估容器鏡像的安全性并確保它們來自可信來源。
在 Kubernetes 中,準(zhǔn)入控制器在創(chuàng)建、更新和刪除操作期間強(qiáng)制執(zhí)行對象的語義驗(yàn)證。使用 OPA,我們可以在 Kubernetes 對象上實(shí)施自定義策略,而無需重新編譯或重新配置 Kubernetes API Server。
作為一種策略工具,Kube-policy-advisor可以更輕松地從實(shí)時(shí) K8s 環(huán)境或從包含 Pod 規(guī)范(Deployment、DaemonSet、Pod 等)的單個(gè) .yaml 文件創(chuàng)建 OPA 策略。在下面的命令中,插件能夠檢查任何給定的命名空間以打印報(bào)告或 OPA 策略。
[leonli@Leon ~ % ]kubectl advise-policy inspect --namespace=
注意:如果不輸入給定的命名空間,默認(rèn)情況下,它將為所有網(wǎng)絡(luò)命名空間生成 OPA 策略。
通過使用 Kube-policy-advisor 插件,其能夠可以幫助確保我們的 Kubernetes Cluster 安全并符合最佳實(shí)踐,從而有助于保護(hù)我們的應(yīng)用程序和數(shù)據(jù)免受潛在威脅。
5、Kubectl-ssm-secretPlugin
kubectl-ssm-secret 插件允許管理員將他們的Kubernetes Secrets導(dǎo)入或?qū)С龅紸WS SSMParameter Store 路徑或從中導(dǎo)出。Kubernetes Secret 是在 Kubernetes Cluster 環(huán)境中使用的敏感信息,例如,密碼或訪問密鑰。在 Kubernetes 和 AWS 云之間傳輸時(shí),能夠安全地控制這些敏感憑證非常重要。
我們可以使用以下 Krew 命令安裝ssm-secret 插件,具體如下所示:
[leonli@Leon ~ % ]kubectl krew install ssm-secret
當(dāng)然,密鑰并不是 Kubernetes 獨(dú)有的。我們幾乎可以在所有類型的現(xiàn)代應(yīng)用程序環(huán)境或平臺中使用 Secrets 的數(shù)據(jù)。對于 ssm-secret 插件,在給定參數(shù)存儲路徑下找到的所有參數(shù)都可以作為“StringData”導(dǎo)入到單個(gè) Kubernetes Secret 中。
如果我們正在重新配置集群或命名空間并且需要一遍又一遍地配置相同的密鑰時(shí),這將非常有用。此外,備份/恢復(fù)我們的 LetsEncryp t或其他證書可能很有用。
如果路徑 /foo/bar 的 AWS 參數(shù)包含一個(gè)密鑰值,并且參數(shù) /foo/passwd 包含一個(gè)安全密碼,我們可以使用 kubectl ssm-secret list 子命令查看參數(shù)存儲中的鍵和值,具體如下:
[leonli@Leon ~ % ]kubectl ssm-secret list --ssm-path /foo
然后,可以使用以下導(dǎo)入命令導(dǎo)入這些輸出參數(shù),具體如下:
[leonli@Leon ~ % ]kubectl ssm-secret import foo --ssm-path /foo
需要注意的是,我們必須為此插件指定一個(gè)參數(shù)存儲路徑才能工作。它不會在給定路徑下遞歸搜索超過一個(gè)級別。因此,該插件非常固執(zhí)己見,如果用戶沒有正確跟蹤這些路徑,他們將面臨無法將密鑰導(dǎo)入/導(dǎo)出到正確路徑的風(fēng)險(xiǎn)。
6、KubeloginPlugin
若我們的Kubernetes Cluster環(huán)境運(yùn)行的是 Kubectl v.1.12 或更高版本,Kubelogin(也稱為“kubectl-login”)是一個(gè)非常有用的安全插件,用于通過 CLI 登錄集群。它通過像 DEX 這樣的 OpenID Connect 提供商來實(shí)現(xiàn)這一點(diǎn)。OpenID Connect 是 OAuth 2.0 協(xié)議之上的一個(gè)簡單身份層。它允許客戶端根據(jù)授權(quán)服務(wù)器執(zhí)行的身份驗(yàn)證來驗(yàn)證最終用戶的身份,并以可互操作和類似 REST 的方式獲取有關(guān)最終用戶的基本配置文件信息。
我們可以使用以下 Krew 命令安裝kubectl-login插件,具體如下所示:
[leonli@Leon ~ % ]kubectl krew install kubectl-login
我們的 OpenID Connect 提供商必須具有 OpenID 配置中列出的 Kubernetes API 客戶端的默認(rèn)回調(diào)端點(diǎn):
[leonli@Leon ~ % ]http://localhost:33768/auth/callback
這個(gè) Kubectl 插件從.kube/config獲取 OpenID Connect (OIDC) 頒發(fā)者 URL ,因此它必須放在我們的.kube/config中。對 kubeconfig 文件進(jìn)行此更改后,我們可以繼續(xù)使用分配給 OIDC 提供商的用戶名,具體如下:
[leonli@Leon ~ % ]kubectl login nigeldouglas-oidc
在CLI 中執(zhí)行此命令后,將打開瀏覽器并重定向到 OpenID Connect 提供程序登錄頁面。在 OIDC 提供商端成功驗(yàn)證后,我們的 kubeconfig 文件中的令牌將被替換。
7、Kubectl-whisper-secretPlugin
我們提到了使用 Kubectl-ssm-secret 插件保護(hù)敏感憑證(如“Secrets”)的重要性。whisper-secret 插件專注于創(chuàng)建具有改進(jìn)隱私的秘密。該插件允許用戶通過安全輸入提示創(chuàng)建秘密,以防止通過終端 (bash) 歷史、shoulder surfing攻擊等方式泄露信息。
我們可以使用以下 Krew 命令安裝whisper-secret 插件,具體如下所示:
[leonli@Leon ~ % ]kubectl krew install whisper-secret
“kubectl create secret”有幾個(gè)我們最常使用的子命令,它們可能會以多種方式泄露敏感信息,如上所述。例如,我們可以使用純文本密碼通過“kubectl create secret”命令連接到 Docker 注冊表以進(jìn)行身份驗(yàn)證。
[leonli@Leon ~ % ]kubectl create secret docker-registry my-secret --docker-password nigelDouglasP@ssw0rD
“kubectl whisper-secret”插件允許用戶通過安全輸入提示為包含敏感信息的字段(如 --from-literal和--docker-password )創(chuàng)建密鑰。
[leonli@Leon ~ % ]kubectl whisper-secret docker-registry my-secret --docker-password -- -n nigel-test --docker-username
然后系統(tǒng)會提示輸入 Docker 密碼,但這不會插入命令本身。這樣,密碼就不會以純文本值的形式出現(xiàn)在 bash 歷史記錄中,從而提高了安全性。
因此處內(nèi)容涉及面較廣,由于時(shí)間關(guān)系,本文解析到此為止,希望對大家有用。關(guān)于Kubectl 安全插件更多需要了解的信息,將在下一篇博文中介紹,歡迎大家交流、關(guān)注!最后,給大家推薦一本云原生書籍,如下所示,對于新人或許有一定的幫助。
Adiós!
關(guān)鍵詞: Kubernetes 訪問管理