日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

第8章:Kubernetes 安全

發(fā)布時間:2024/9/3 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第8章:Kubernetes 安全 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Kubernetes 安全

1. Kubernetes 安全框架

? 訪問K8S集群的資源需要過三關(guān):認(rèn)證、鑒權(quán)、準(zhǔn)入控制
? 普通用戶若要安全訪問集群API Server,往往需要證書、 Token或者用戶名+密碼;Pod訪問,需要ServiceAccount
? K8S安全控制框架主要由下面3個階段進(jìn)行控制,每一個階段 都支持插件方式,通過API Server配置來啟用插件。
1. Authentication(鑒權(quán))
2. Authorization(授權(quán))
3. Admission Control(準(zhǔn)入控制)

2. 認(rèn)證,授權(quán),準(zhǔn)入控制

鑒權(quán)(Authentication)

三種客戶端身份認(rèn)證:
? HTTPS 證書認(rèn)證:基于CA證書簽名的數(shù)字證書認(rèn)證
? HTTP Token認(rèn)證:通過一個Token來識別用戶
? HTTP Base認(rèn)證:用戶名+密碼的方式認(rèn)證

授權(quán)(Authorization)

RBAC(Role-Based Access Control,基于角色的訪問控制):負(fù)責(zé)完成授權(quán)(Authorization)工作。
根據(jù)API請求屬性,決定允許還是拒絕。
? user:用戶名
? group:用戶分組
? extra:用戶額外信息
? API
? 請求路徑:例如/api,/healthz
? API請求方法:get,list,create,update,patch,watch,delete
? HTTP請求方法:get,post,put,delete
? 資源
? 子資源
? 命名空間
? API組

準(zhǔn)入控制(Admission Control)

Adminssion Control實際上是一個準(zhǔn)入控制器插件列表,發(fā)送到API Server的請求都需要經(jīng)過這個列表中的每個準(zhǔn)入控制器插件的檢查,檢查不通過,則拒絕請求。

3. 基于角色的權(quán)限訪問控制:RBAC

RBAC(Role-Based Access Control,基于角色的訪問控制),允許通過Kubernetes API動態(tài)配置策略。

角色
? Role:授權(quán)特定命名空間的訪問權(quán)限
? ClusterRole:授權(quán)所有命名空間的訪問權(quán)限
角色綁定
? RoleBinding:將角色綁定到主體(即subject)
? ClusterRoleBinding:將集群角色綁定到主體
主體(subject)
? User:用戶
? Group:用戶組
? ServiceAccount:服務(wù)賬號

4. 案例:為指定用戶授權(quán)訪問不同命名空間權(quán)限

示例:為aliang用戶授權(quán)default命名空間Pod讀取權(quán)限
1. 用K8S CA簽發(fā)客戶端證書
2. 生成kubeconfig授權(quán)文件
3. 創(chuàng)建RBAC權(quán)限策略

證書內(nèi)容生成

[root@k8s-m1 rbac]# cat cert.shcat > ca-config.json <<EOF {"signing": {"default": {"expiry": "87600h"},"profiles": {"kubernetes": {"usages": ["signing","key encipherment","server auth","client auth"],"expiry": "87600h"}}} } EOFcat > lewen-csr.json <<EOF {"CN": "lewen","hosts": [],"key": {"algo": "rsa","size": 2048},"names": [{"C": "CN","ST": "BeiJing","L": "BeiJing","O": "k8s","OU": "System"}] } EOFcfssl gencert -ca=/etc/kubernetes/pki/ca.crt -ca-key=/etc/kubernetes/pki/ca.key -config=ca-config.json -profile=kubernetes lewen-csr.json | cfssljson -bare lewen cert.sh

k8s簽發(fā)證書

[root@k8s-m1 rbac]# cat kubeconfig.shkubectl config set-cluster kubernetes \--certificate-authority=/etc/kubernetes/pki/ca.crt \--embed-certs=true \--server=https://10.0.0.23:6443 \--kubeconfig=lewen.kubeconfig# 設(shè)置客戶端認(rèn)證 kubectl config set-credentials lewen \--client-key=lewen-key.pem \--client-certificate=lewen.pem \--embed-certs=true \--kubeconfig=lewen.kubeconfig# 設(shè)置默認(rèn)上下文 kubectl config set-context kubernetes \--cluster=kubernetes \--user=lewen \--kubeconfig=lewen.kubeconfig# 設(shè)置當(dāng)前使用配置 kubectl config use-context kubernetes --kubeconfig=lewen.kubeconfig kubeconfig.sh

創(chuàng)建用戶訪問權(quán)限

[root@k8s-m1 rbac]# cat rbac.yaml kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata:namespace: defaultname: pod-reader rules: - apiGroups: ["","apps"]resources: ["pods","services","deployments"]verbs: ["get", "watch", "list"]---kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata:name: read-podsnamespace: default subjects: - kind: Username: lewenapiGroup: rbac.authorization.k8s.io roleRef:kind: Rolename: pod-readerapiGroup: rbac.authorization.k8s.io rbac.yaml

測試訪問

把生成的 lewen.kubeconfig 拷貝到 root/.kube/config

就可以訪問資源了

5. 網(wǎng)絡(luò)策略概述

網(wǎng)絡(luò)策略(Network Policy),用于限制Pod出入流量,提供Pod級別和Namespace級別網(wǎng)絡(luò)訪問控制。
一些應(yīng)用場景:
? 應(yīng)用程序間的訪問控制。例如微服務(wù)A允許訪問微服務(wù)B,微服務(wù)C不能訪問微服務(wù)A
? 開發(fā)環(huán)境命名空間不能訪問測試環(huán)境命名空間Pod
? 當(dāng)Pod暴露到外部時,需要做Pod白名單
? 多租戶網(wǎng)絡(luò)環(huán)境隔離Pod網(wǎng)絡(luò)入口方向隔離:
? 基于Pod級網(wǎng)絡(luò)隔離:只允許特定對象訪問Pod(使用標(biāo)簽定義),允許白名單上的IP地址或者IP段訪問Pod
? 基于Namespace級網(wǎng)絡(luò)隔離:多個命名空間,A和B命名空間Pod完全隔離。Pod網(wǎng)絡(luò)出口方向隔離:
? 拒絕某個Namespace上所有Pod訪問外部
? 基于目的IP的網(wǎng)絡(luò)隔離:只允許Pod訪問白名單上的IP地址或者IP段
? 基于目標(biāo)端口的網(wǎng)絡(luò)隔離:只允許Pod訪問白名單上的端口

6. 案例:對項目Pod出入流量訪問控制

需求1:將default 命名空間攜帶run=web-nginx-0811標(biāo)簽的Pod隔離,只允 許default命名空間攜帶run=client標(biāo)簽的Pod訪問80端口。

[root@k8s-m1 chp8]# cat test-network-policy.yml apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata:name: test-network-policynamespace: default spec:podSelector:matchLabels:app: web-nginx-0811policyTypes:- Ingress- Egressingress:- from:- podSelector:matchLabels:run: clientports:- protocol: TCPport: 80 test-network-policy.yml # 創(chuàng)建一個pod用來測試 kubectl run -l run=client --image=busybox -- sh[root@k8s-m1 ~]# kubectl get pod sh --show-labels # 查看pod的標(biāo)簽,要和網(wǎng)絡(luò)策略里面的一直 NAME READY STATUS RESTARTS AGE LABELS sh 1/1 Running 0 96s run=client# 查看一下限流pod的IP地址 [root@k8s-m1 chp8]# kubectl get ep web-nginx-0811 NAME ENDPOINTS AGE web-nginx-0811 10.244.111.212:80,10.244.111.213:80,10.244.111.220:80 8d# 然后去到允許訪問的pod里面,發(fā)起測試 [root@k8s-m1 ~]# kubectl exec sh -it -- sh / # ls bin dev etc home proc root sys tmp usr var# 能夠成功獲取頁面 / # wget 10.244.111.213 Connecting to 10.244.111.213 (10.244.111.213:80) saving to 'index.html' index.html 100% |*************| 612 0:00:00 ETA 'index.html' saved# 測試一下端口 / # telnet 10.244.111.213 80 Connected to 10.244.111.213 Connection closed by foreign host# 創(chuàng)建另外一個非允許的標(biāo)簽 pod kubectl run -l run=client-other -it --image=busybox -- bash [root@k8s-m1 ~]# kubectl get pod bash --show-labels NAME READY STATUS RESTARTS AGE LABELS bash 1/1 Running 0 96s run=client-other# 發(fā)現(xiàn)其他非允許的pod 無法訪問 web-nginx-0811 [root@k8s-m1 ~]# kubectl exec bash -it -- sh / # wget 10.244.111.213 Connecting to 10.244.111.213 (10.244.111.213:80) wget: can't connect to remote host (10.244.111.213): Connection timed out / # telnet 10.244.111.213 80

需求2:default命名空間下所有pod可以互相訪問,也可以訪問其他命名空間Pod,但其他命名空間不能訪問 default命名空間Pod

[root@k8s-m1 chp8]# cat deny-from-other-namespaces.yml apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata:name: deny-from-other-namespacesnamespace: default spec:podSelector: {}policyTypes:- Ingressingress:- from:- podSelector: {} deny-from-other-namespaces.yml # 創(chuàng)建一個 kube-system 命名空間的[root@k8s-m1 chp8]# kubectl run client2 -it --image=busybox -n kube-system -- sh / # ping 10.244.111.213 PING 10.244.111.213 (10.244.111.213): 56 data bytes 64 bytes from 10.244.111.213: seq=0 ttl=63 time=0.271 ms 64 bytes from 10.244.111.213: seq=1 ttl=63 time=0.115 ms 64 bytes from 10.244.111.213: seq=2 ttl=63 time=0.113 ms ^C --- 10.244.111.213 ping statistics --- 3 packets transmitted, 3 packets received, 0% packet loss round-trip min/avg/max = 0.113/0.166/0.271 ms / # wget 10.244.111.213 Connecting to 10.244.111.213 (10.244.111.213:80) saving to 'index.html' index.html 100% |*********************************************| 612 0:00:00 ETA 'index.html' saved# 創(chuàng)建執(zhí)行命令后,不通了 [root@k8s-m1 chp8]# kubectl apply -f deny-from-other-namespaces.yml networkpolicy.networking.k8s.io/deny-from-other-namespaces created/ # ping 10.244.111.213 PING 10.244.111.213 (10.244.111.213): 56 data bytes ^C --- 10.244.111.213 ping statistics --- 2 packets transmitted, 0 packets received, 100% packet loss / # wget 10.244.111.213 Connecting to 10.244.111.213 (10.244.111.213:80) ^C# 創(chuàng)建一個默認(rèn)名稱空間的pod,發(fā)現(xiàn)可以訪問 [root@k8s-m1 chp8]# kubectl run client-default -it --image=busybox -- sh If you don't see a command prompt, try pressing enter. / # ping 10.244.111.213 PING 10.244.111.213 (10.244.111.213): 56 data bytes 64 bytes from 10.244.111.213: seq=0 ttl=63 time=0.110 ms 64 bytes from 10.244.111.213: seq=1 ttl=63 time=0.064 ms 64 bytes from 10.244.111.213: seq=2 ttl=63 time=0.073 ms ^C --- 10.244.111.213 ping statistics --- 3 packets transmitted, 3 packets received, 0% packet loss round-trip min/avg/max = 0.064/0.082/0.110 ms / # wget 10.244.111.213 Connecting to 10.244.111.213 (10.244.111.213:80) saving to 'index.html' index.html 100% |*********************************************| 612 0:00:00 ETA 'index.html' saved / #

課后作業(yè)

1、完成案例1:為指定用戶授權(quán)訪問不同命名空間權(quán)限
2、完成案例2:對項目Pod出入流量訪問控制

總結(jié)

以上是生活随笔為你收集整理的第8章:Kubernetes 安全的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。