Ubuntu K8s集群安全加固方案
在Ubuntu系統(tǒng)上部署Kubernetes集群時(shí),若服務(wù)器擁有外網(wǎng)IP,需采取多層次安全防護(hù)措施以確保集群安全。本方案通過系統(tǒng)防火墻配置、TLS通信啟用、網(wǎng)絡(luò)策略實(shí)施和RBAC權(quán)限控制四個(gè)核心層面,構(gòu)建安全的Kubernetes環(huán)境。安全防護(hù)不應(yīng)僅停留在單點(diǎn)措施,而應(yīng)形成縱深防御體系,從物理主機(jī)到集群控制面再到應(yīng)用層進(jìn)行全面保護(hù)。在生產(chǎn)環(huán)境中,需確保所有安全配置均符合最小權(quán)限原則,并定期進(jìn)行審計(jì)與監(jiān)控。
一、基礎(chǔ)系統(tǒng)安全配置
Ubuntu服務(wù)器作為Kubernetes集群節(jié)點(diǎn),其基礎(chǔ)系統(tǒng)安全至關(guān)重要。首先,需確保系統(tǒng)時(shí)間同步,這可以通過安裝NTP服務(wù)并配置可靠的NTP服務(wù)器實(shí)現(xiàn)。在Ubuntu上,可使用以下命令安裝并配置NTP服務(wù):
sudoapt update sudoapt install ntpdate ntp sudontpdate ntp1.aliyun.com
其次,應(yīng)禁用Swap功能。Kubernetes要求所有節(jié)點(diǎn)禁用Swap,可通過編輯/etc/fstab文件并注釋掉Swap行實(shí)現(xiàn),然后執(zhí)行swapoff --all命令。
然后,配置容器運(yùn)行時(shí)環(huán)境。對于Ubuntu系統(tǒng),推薦使用Docker或Containerd作為容器運(yùn)行時(shí)。Docker安裝命令如下:
sudoapt-get update sudoapt-get install docker.io
Containerd安裝命令如下:
sudoapt-get update sudoapt-get install containerd
此外,還需調(diào)整Linux內(nèi)核參數(shù)以支持Kubernetes網(wǎng)絡(luò)需求。在Ubuntu上,可通過以下命令修改內(nèi)核參數(shù):
cat>> /etc/sysctl.d/kubernetes.conf <
這些內(nèi)核參數(shù)確保了容器網(wǎng)絡(luò)和Kubernetes組件之間的正常通信。
二、防火墻規(guī)則配置
Ubuntu服務(wù)器的防火墻規(guī)則是保護(hù)集群的第一道防線,需對非必要端口進(jìn)行限制,僅開放API Server等必需端口。默認(rèn)情況下,UFW(Uncomplicated Firewall)是Ubuntu的默認(rèn)防火墻配置工具,提供了一個(gè)用戶友好的界面來管理Linux系統(tǒng)的Netfilter防火墻。
首先,安裝并啟用UFW防火墻:
sudoapt update sudoapt install ufw sudoufwenable
啟用UFW后,默認(rèn)拒絕所有入站連接,僅允許已明確允許的連接。這是符合安全原則的默認(rèn)策略。
針對Kubernetes集群,需開放以下關(guān)鍵端口:
端口 協(xié)議 用途 訪問控制 22 TCP SSH管理 僅允許特定IP或子網(wǎng)訪問 6443 TCP API Server 僅允許集群內(nèi)節(jié)點(diǎn)或管理IP訪問 10250 TCP Kubelet API 僅允許集群內(nèi)節(jié)點(diǎn)訪問 10255 TCP Kubelet只讀端口 僅允許集群內(nèi)節(jié)點(diǎn)訪問 53 TCP/UDP DNS服務(wù) 僅允許集群內(nèi)節(jié)點(diǎn)訪問 2379/2380 TCP etcd集群通信 僅允許主節(jié)點(diǎn)間通信 具體UFW規(guī)則配置示例如下:
# 允許SSH管理訪問 sudoufw allow from 192.168.1.0/24 to any port 22 proto tcp # 允許API Server訪問(僅限集群內(nèi)節(jié)點(diǎn)) sudoufw allow from 10.0.0.0/24 to any port 6443 proto tcp # 允許etcd集群通信(僅限主節(jié)點(diǎn)間) sudoufw allow from <主節(jié)點(diǎn)IP1> to any port 2379 proto tcp sudoufw allow from <主節(jié)點(diǎn)IP2> to any port 2379 proto tcp # 允許kubelet API訪問(僅限集群內(nèi)節(jié)點(diǎn)) sudoufw allow from 10.0.0.0/24 to any port 10250 proto tcp # 允許DNS服務(wù)訪問(僅限集群內(nèi)節(jié)點(diǎn)) sudoufw allow from 10.0.0.0/24 to any port 53 proto tcp sudoufw allow from 10.0.0.0/24 to any port 53 proto udp # 設(shè)置默認(rèn)策略為拒絕所有入站連接 sudoufw default deny incoming
特別注意:NodePort服務(wù)端口范圍(30000-32767)僅在必要時(shí)開放,且建議限制訪問來源為特定管理IP。若集群不使用NodePort服務(wù),應(yīng)完全關(guān)閉此端口范圍。
最后,保存并應(yīng)用UFW規(guī)則:
sudoufw reload sudoufw status numbered
通過UFW規(guī)則配置,確保了只有授權(quán)流量才能訪問服務(wù)器,大大降低了被攻擊的可能性。
三、TLS安全通信配置
在Kubernetes集群中,TLS安全通信是保護(hù)控制平面和數(shù)據(jù)傳輸?shù)年P(guān)鍵機(jī)制。在初始化集群時(shí),通過kubeadm init命令啟用TLS通信,并配置證書管理及設(shè)置token有效期。
首先,使用以下命令初始化主節(jié)點(diǎn):
sudokubeadm init --apiserver-advertise-address=內(nèi)網(wǎng)IP --apiserver-cert-extra-sans=外網(wǎng)IP --pod-network-cidr=10.244.0.0/16
其中,--apiserver-cert-extra-sans參數(shù)至關(guān)重要,它允許為API Server證書添加額外的Subject Alternative Name(SAN),確保API Server可通過外網(wǎng)IP或域名安全訪問。
初始化完成后,立即創(chuàng)建帶有效期的引導(dǎo)token:
sudokubeadm token create --validity 24h --print-join-command
建議將默認(rèn)token有效期設(shè)置為24小時(shí),而非使用永久有效的token。這可以通過修改kubeadm配置文件并指定--token-ttl參數(shù)實(shí)現(xiàn)。
接下來,檢查證書有效期:
sudokubeadm certs check-expiration
控制面證書默認(rèn)有效期為1年,這符合生產(chǎn)環(huán)境的安全要求。若需延長有效期,可通過修改kubeadm配置文件中的certificates.duration字段實(shí)現(xiàn),但不建議超過1年,以降低維護(hù)復(fù)雜性。
最后,手動(dòng)續(xù)簽證書(若需要):
sudokubeadm certs renew all
續(xù)簽證書后,需重啟相關(guān)組件:
systemctl restart kubelet kubectl delete pod -n kube-system -l k8s-app=kube-apiserver kubectl delete pod -n kube-system -l k8s-app=kube-controller-manager kubectl delete pod -n kube-system -l k8s-app=kube-scheduler
通過以上配置,確保了Kubernetes集群內(nèi)部通信的安全性,避免了未經(jīng)加密的HTTP流量傳輸。
四、網(wǎng)絡(luò)策略插件部署與配置
部署網(wǎng)絡(luò)策略插件如Calico是實(shí)施Pod間通信限制和命名空間隔離的關(guān)鍵步驟。Calico不僅提供CNI(容器網(wǎng)絡(luò)接口)功能,還支持強(qiáng)大的網(wǎng)絡(luò)策略功能,能夠?qū)崿F(xiàn)細(xì)粒度的Pod間通信控制。
首先,下載Calico的YAML配置文件:
curl https://docs.projectcalico.org/manifests/calico.yaml -O
然后,應(yīng)用Calico配置:
kubectl apply -f calico.yaml
部署完成后,驗(yàn)證Calico組件狀態(tài):
kubectl get pods -n calico-system
確保所有Calico Pod均處于Running狀態(tài)。
接下來,實(shí)施網(wǎng)絡(luò)策略。建議首先啟用全局拒絕策略,作為安全基線:
apiVersion:projectcalico.org/v3 kind:GlobalNetworkPolicy metadata: name:default-deny spec: selector:all() types: -Ingress -Egress
應(yīng)用全局拒絕策略:
kubectl apply -f global-network-policy.yaml
然后,針對DNS服務(wù)創(chuàng)建例外策略:
apiVersion:networking.k8s.io/v1 kind:NetworkPolicy metadata: name:allow-dns namespace:default spec: podSelector:{} policyTypes: -Ingress ingress: -from: -namespaceSelector: matchLabels: name:kube-system -podSelector: matchLabels: k8s-app:kube-dns ports: -protocol:TCP port:53 -protocol:UDP port:53
應(yīng)用DNS例外策略:
kubectl apply -f dns-policy.yaml
命名空間隔離示例:對于敏感命名空間如database,可創(chuàng)建完全隔離策略:
apiVersion:networking.k8s.io/v1 kind:NetworkPolicy metadata: name:default-deny namespace:database spec: podSelector:{} policyTypes: -Ingress -Egress egress: -to: -ipBlock: cidr:0.0.0.0/0 except: -ipBlock: cidr:10.0.0.0/16 -ports: -protocol:TCP port:53 -protocol:UDP port:53
此策略拒絕所有入站流量,并僅允許出站流量訪問集群內(nèi)DNS服務(wù)。
網(wǎng)絡(luò)策略實(shí)施應(yīng)遵循分階段原則:首先在測試命名空間驗(yàn)證策略,確認(rèn)策略生效且不影響正常功能后,再逐步擴(kuò)展到生產(chǎn)環(huán)境。避免因策略配置錯(cuò)誤導(dǎo)致集群網(wǎng)絡(luò)中斷。
五、RBAC權(quán)限控制與審計(jì)
Kubernetes的RBAC(基于角色的訪問控制)是實(shí)現(xiàn)權(quán)限最小化的核心機(jī)制。通過Role、ClusterRole、RoleBinding和ClusterRoleBinding,可為不同用戶和服務(wù)賬戶分配精確的權(quán)限。
首先,為開發(fā)人員創(chuàng)建最小權(quán)限角色:
apiVersion:rbac.authorization.k8s.io/v1 kind:Role metadata: namespace:dev-namespace name:dev-namespace-role rules: -apiGroups:[""] resources:["pods","services"] verbs:["get","list","create","update","delete"] -apiGroups:["apps"] resources:["deployments"] verbs:["get","list","create","update","delete"] -apiGroups:[""] resources:["configmaps"] verbs:["get","list"]
然后,將角色綁定到開發(fā)人員:
apiVersion:rbac.authorization.k8s.io/v1 kind:RoleBinding metadata: name:dev-namespace-binding namespace:dev-namespace subjects: -kind:User name:dev-team apiGroup:rbac.authorization.k8s.io roleRef: kind:Role name:dev-namespace-role apiGroup:rbac.authorization.k8s.io
限制默認(rèn)賬戶權(quán)限是關(guān)鍵安全措施。對于defaultServiceAccount,可創(chuàng)建只讀角色:
apiVersion:rbac.authorization.k8s.io/v1 kind:Role metadata: namespace:default name:pod-reader-role rules: -apiGroups:[""] resources:["pods"] verbs:["get","watch","list"]
然后,將只讀角色綁定到defaultServiceAccount:
apiVersion:rbac.authorization.k8s.io/v1 kind:RoleBinding metadata: name:read-pods namespace:default subjects: -kind:ServiceAccount name:default namespace:default roleRef: kind:Role name:pod-reader-role apiGroup:rbac.authorization.k8s.io
定期審計(jì)集群資源和日志是安全運(yùn)維的重要環(huán)節(jié)??赏ㄟ^以下步驟啟用API Server審計(jì)日志:
1. 創(chuàng)建審計(jì)策略文件/etc/kubernetes/audit/audit-policy.yaml:
apiVersion:audit.k8s.io/v1 kind:Policy omitStages: -"RequestReceived" rules: -level:RequestResponse verbs:["delete","deletecollection","patch","update"] -level:Metadata verbs:["get","list","watch"] users:["system:kube-proxy"] -level:None verbs:["watch"] users:["system:kube-proxy"] resources: -group:"" resources:["endpoints","services"] -level:None userGroups:["system:authenticated"] nonResourceURLs: -"/api*" -"/version"
2. 修改kube-apiserver配置文件:
---audit-policy-file=/etc/kubernetes/audit/audit-policy.yaml ---audit-log-path=/var/log/kubernetes/audit.log ---audit-log-maxsize=100 ---audit-log-maxbackup=5 ---audit-log-maxage=30
3. 重啟kubelet服務(wù)使配置生效:
systemctl restart kubelet
審計(jì)日志文件位于/var/log/kubernetes/audit.log,可通過以下命令查看:
kubectl get --raw /api/v1/namespaces/kube-system/pods/kube-apiserver-<節(jié)點(diǎn)名稱>/log?container=kube-apiserver
審計(jì)日志分析可通過kube-audit等工具實(shí)現(xiàn)。首先安裝kube-audit:
go get -u github.com/Shopify/kube-audit
然后分析審計(jì)日志:
kube-audit -f /var/log/kubernetes/audit.log
定期審計(jì)流程建議包括:
1. 每周檢查審計(jì)日志中的敏感操作(如資源刪除、角色綁定變更)。
2. 每月審查RBAC權(quán)限配置,確保所有賬戶和服務(wù)賬戶均遵循最小權(quán)限原則。
3. 每季度進(jìn)行全集群安全評估,使用工具如kube-bench檢查Kubernetes安全配置。
通過以上措施,可有效監(jiān)控集群中的權(quán)限使用情況,及時(shí)發(fā)現(xiàn)并阻止未授權(quán)操作。
六、安全加固的最佳實(shí)踐
在Ubuntu上部署Kubernetes集群時(shí),應(yīng)遵循以下最佳安全實(shí)踐:
1.使用專用網(wǎng)絡(luò):將集群節(jié)點(diǎn)部署在專用網(wǎng)絡(luò)上,避免直接暴露于互聯(lián)網(wǎng)。若必須通過外網(wǎng)訪問API Server,應(yīng)配置負(fù)載均衡器或反向代理,并通過IP白名單限制訪問來源。
2.啟用Pod安全策略(PSP):雖然Kubernetes 1.25+已棄用Pod安全策略API,但可通過準(zhǔn)入控制器(如OPA Gatekeeper)實(shí)現(xiàn)類似功能,限制Pod的特權(quán)操作。
3.使用加密的Secret:敏感信息如數(shù)據(jù)庫密碼、API密鑰等應(yīng)使用Kubernetes Secret存儲(chǔ),并通過kubectl create secret命令創(chuàng)建。
4.定期更新系統(tǒng):保持Ubuntu系統(tǒng)和Kubernetes組件的最新版本,及時(shí)修復(fù)已知漏洞。
5.使用安全的容器鏡像:從可信來源獲取容器鏡像,并通過鏡像掃描工具(如Trivy、Clair)檢查鏡像安全。
6.實(shí)施定期備份:對集群關(guān)鍵數(shù)據(jù)(如etcd、證書)進(jìn)行定期備份,確保在出現(xiàn)安全事件時(shí)能夠快速恢復(fù)。
7.配置監(jiān)控與告警:使用Prometheus和Grafana監(jiān)控集群運(yùn)行狀態(tài),設(shè)置告警規(guī)則(如異常API調(diào)用、資源使用異常)。
8.使用網(wǎng)絡(luò)策略插件:除Calico外,還可考慮使用Cilium等支持更復(fù)雜網(wǎng)絡(luò)策略的插件,實(shí)現(xiàn)東西向流量控制和零信任網(wǎng)絡(luò)架構(gòu)。
安全措施 實(shí)施步驟 預(yù)期效果 防火墻配置 使用UFW限制非必要端口訪問 降低外部攻擊面 TLS啟用 通過kubeadm init配置證書 確??刂破矫嫱ㄐ虐踩?/td> 網(wǎng)絡(luò)策略 部署Calico并配置全局拒絕策略 實(shí)現(xiàn)Pod間通信限制和命名空間隔離 RBAC控制 創(chuàng)建最小權(quán)限角色并定期審計(jì) 確保權(quán)限最小化和使用合規(guī) 審計(jì)日志 啟用API Server審計(jì)日志并分析 監(jiān)控集群操作行為,及時(shí)發(fā)現(xiàn)異常 安全加固是一個(gè)持續(xù)的過程,而非一次性任務(wù)。建議建立安全運(yùn)維的SOP(標(biāo)準(zhǔn)操作流程),定期更新安全策略,應(yīng)對不斷變化的安全威脅。
七、安全加固后的集群驗(yàn)證
完成安全加固后,需進(jìn)行以下驗(yàn)證以確保配置生效:
1.防火墻規(guī)則驗(yàn)證:使用ufw status查看當(dāng)前規(guī)則,確認(rèn)僅開放必要端口。通過nc -zv <服務(wù)器IP> <端口>測試端口連通性,確保非授權(quán)IP無法訪問受限端口。
2.TLS通信驗(yàn)證:使用kubectl cluster-info檢查API Server是否通過HTTPS訪問。訪問https://
:6443并檢查證書是否有效。 3.網(wǎng)絡(luò)策略驗(yàn)證:創(chuàng)建兩個(gè)測試Pod,分別位于不同命名空間,嘗試相互訪問。通過kubectl exec -it
-- ping <目標(biāo)pod IP>測試通信是否被策略阻止。 4.RBAC權(quán)限驗(yàn)證:使用不同賬戶嘗試執(zhí)行敏感操作(如創(chuàng)建命名空間、刪除資源),確認(rèn)權(quán)限控制是否生效。
5.審計(jì)日志驗(yàn)證:檢查審計(jì)日志文件/var/log/kubernetes/audit.log,確認(rèn)審計(jì)事件是否被正確記錄,并使用kube-audit分析日志內(nèi)容。
通過以上驗(yàn)證步驟,可確保安全加固措施已正確實(shí)施,并為后續(xù)安全運(yùn)維奠定基礎(chǔ)。
八、結(jié)論與建議
在Ubuntu系統(tǒng)上部署Kubernetes集群時(shí),外網(wǎng)IP的存在增加了安全風(fēng)險(xiǎn),需采取多層次安全防護(hù)措施。從系統(tǒng)防火墻到TLS通信,再到網(wǎng)絡(luò)策略和RBAC權(quán)限控制,每一層都至關(guān)重要。生產(chǎn)環(huán)境中應(yīng)遵循最小權(quán)限原則,定期進(jìn)行安全審計(jì)與監(jiān)控,確保集群安全。
建議在部署Kubernetes集群前,先完成基礎(chǔ)系統(tǒng)安全加固,包括禁用Swap、配置NTP同步時(shí)間等。然后,通過UFW防火墻限制非必要端口訪問,僅開放API Server等必需端口。初始化集群時(shí),啟用TLS安全通信,并設(shè)置引導(dǎo)token有效期。部署網(wǎng)絡(luò)策略插件如Calico,實(shí)施Pod間通信限制和命名空間隔離。最后,配置RBAC權(quán)限控制,限制默認(rèn)賬戶權(quán)限,建立定期審計(jì)與日志分析流程。
安全防護(hù)不應(yīng)僅停留在配置層面,而應(yīng)形成持續(xù)的安全運(yùn)維文化。建議定期參加安全培訓(xùn),關(guān)注Kubernetes安全動(dòng)態(tài),及時(shí)更新安全策略。同時(shí),建立安全事件響應(yīng)機(jī)制,確保在出現(xiàn)安全問題時(shí)能夠快速應(yīng)對和恢復(fù)。
鏈接:https://blog.csdn.net/lswzw/article/details/147470317
-
服務(wù)器
+關(guān)注
關(guān)注
14文章
10253瀏覽量
91484 -
集群
+關(guān)注
關(guān)注
0文章
143瀏覽量
17661 -
Ubuntu
+關(guān)注
關(guān)注
5文章
613瀏覽量
33366 -
kubernetes
+關(guān)注
關(guān)注
0文章
263瀏覽量
9494
原文標(biāo)題:黑客都怕的Ubuntu K8s安全加固方案,運(yùn)維必看!
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
什么是 K8S,如何使用 K8S
全面提升,阿里云Docker/Kubernetes(K8S) 日志解決方案與選型對比
全面提升,阿里云Docker/Kubernetes(K8S) 日志解決方案與選型對比
K8s 從懵圈到熟練 – 集群網(wǎng)絡(luò)詳解
OpenStack與K8s結(jié)合的兩種方案的詳細(xì)介紹和比較
K8S集群服務(wù)訪問失敗怎么辦 K8S故障處理集錦
多k8s集群環(huán)境中工作有多快
切換k8s上下文有多快
k8s是什么意思?kubeadm部署k8s集群(k8s部署)|PetaExpres
K8s多集群管理:為什么需要多集群、多集群的優(yōu)勢是什么
Ubuntu K8s集群安全加固方案
評論