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

切換k8s上下文有多快

k8s是什么意思?kubeadm部署k8s集群(k8s部署)|PetaExpres
K8s多集群管理:為什么需要多集群、多集群的優勢是什么

k8s云原生開發要求

評論