Kubernetes-保障叢集內節點和網路安全
阿新 • • 發佈:2019-08-18
13.1.在pod中使用宿主節點的Linux名稱空間
13.1.1.在pod中使用宿主節點的網路名稱空間
在pod的yaml檔案中就設定spec.hostNetwork: true
這個時候pod使用宿主機的網路,如果設定了埠,則使用宿主機的埠。
apiVersion: v1 kind: pod metadata: name: pod-host-yaohong spec: hostNetwork: true //使用宿主節點的網路名稱空間 containers: - image: luksa/kubia command: ["/bin/sleep", "9999"]
13.1.2.繫結宿主節點上的埠而不使用宿主節點的網路名稱空間
在pod的yaml檔案中就設定spec.containers.ports欄位來設定
在ports欄位中可以使用
containerPorts設定通過pod 的ip訪問的埠
container.hostPort設定通過所在節點的埠訪問
apiVersion: v1 kind: pod metadata: name: kubia-hostport-yaohong spec: containers: - image: luksa/kubia - name: kubia ports: - containerport: 8080 //該容器通過pod IP訪問該埠 hostport: 9000 //該容器可以通過它所在節點9000埠訪問 protocol: Tcp
13.1.3.使用宿主節點的PID與IPC
PID是程序ID,PPID是父程序ID。
在linux下的多個程序間的通訊機制叫做IPC(Inter-Process Communication),它是多個程序之間相互溝通的一種方法。
apiVersion: v1 kind: pod metadata: name: pod-with-host-pid-and-ipc-yaohong spec: hostPID: true //你希望這個pod使用宿主節點的PID名稱空間 hostIPC: true //你希望pod使用宿主節點的IPC名稱空間 containers: - name: main image: alpine command: ["/bin/sleep", "99999"]
13.2.配置節點的安全上下文
13.2.1.使用指定使用者執行容器
檢視某個pod執行的使用者
$ kubectl -n kube-system exec coredns-7b8dbb87dd-6ll7z id uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),11(floppy),20(dialout),26(tape),27(video)
容器的執行使用者再DockerFile中指定,如果沒有指定則為root
指定pod的執行的使用者方法如下
apiVersion: v1 kind: pod metadata: name: pod-as-user spec: containers: - name: main image: alpine command: ["/bin/sleep", "99999"] securityContext: runAsUser: 405 //你需要指定的使用者ID,而不是使用者名稱
13.2.2.阻止容器以root使用者執行
runAsNonRoot來設定apiVersion: v1 kind: pod metadata: name: pod-as-user spec: containers: - name: main image: alpine command: ["/bin/sleep", "99999"] securityContext: runAsNonRoot: true //這個容器只允許以非root使用者執行
13.2.3.使用特權模式執行pod
為了獲得宿主機核心完整的許可權,該pod需要在特權模式下執行。需要新增privileged引數為true。
apiVersion: v1 kind: pod metadata: name: pod-as-privileged spec: containers: - name: main image: alpine command: ["/bin/sleep", "99999"] securityContext: privileged: true //這個容器將在特權模式下執行
13.2.4.為容器單獨新增核心功能
apiVersion: v1 kind: pod metadata: name: pod-as-capability spec: containers: - name: main image: alpine command: ["/bin/sleep", "99999"] securityContext: capabilities: //該引數用於pod新增或者禁用某項核心功能 add: - SYS_TIME //新增修改系統時間引數
13.2.5.在容器中禁止使用核心功能
apiVersion: v1 kind: pod metadata: name: pod-as-capability spec: containers: - name: main image: alpine command: ["/bin/sleep", "99999"] securityContext: capabilities: //該引數用於pod新增或者禁用某項核心功能 drop: - CHOWN //禁用容器修改檔案的所有者
13.2.6.阻止對容器根檔案系統的寫入
securityContext.readyOnlyFilesystem設定為true來實現阻止對容器根檔案系統的寫入。apiVersion: v1 kind: pod metadata: name: pod-with-readonly-filesystem spec: containers: - name: main image: alpine command: ["/bin/sleep", "99999"] securityContext: readyOnlyFilesystem: true //這個容器的根檔案系統不允許寫入 volumeMounts: - name: my-volume mountPath: /volume //volume寫入是允許的,因為這個目錄掛載一個儲存卷 readOnly: false
13.3.限制pod使用安全相關的特性
13.3.1.PodSecurityPolicy資源介紹
PodSecurityPolicy是一種叢集級別(無名稱空間)的資源,它定義了使用者能否在pod中使用各種安全相關的特性。
13.3.2.瞭解runAsUser、fsGroups和supplementalGroup策略
runAsUser: runle: MustRunAs ranges: - min: 2 //新增一個max=min的range,來指定一個ID為2的user max: 2 fsGroup: rule: MustRunAs ranges: - min: 2 max: 10 //新增多個區間id的限制,為2-10 或者20-30 - min: 20 max: 30 supplementalGroups: rule: MustRunAs ranges: - min: 2 max: 10 - min: 20 max: 30
13.3.3.配置允許、預設新增、禁止使用的核心功能
三個欄位會影響容器的使用
allowedCapabilities:指定容器可以新增的核心功能 defaultAddCapabilities:為所有容器新增的核心功能 requiredDropCapabilities:禁止容器中的核心功能apiVersion: v1 kind: PodSecurityPolicy spec: allowedCapabilities: - SYS_TIME //允許容器新增SYS_time功能 defaultAddCapabilities: - CHOWN //為每個容器自動新增CHOWN功能 requiredDropCapabilities: - SYS_ADMIN //要求容器禁用SYS_ADMIN和SYS_MODULE功能
13.4.隔離pod網路
13.4.1.在一個名稱空間中使用網路隔離
podSelector進行對一個名稱空間下的pod進行隔離
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: postgres-netpolicy spec: podSelector: //這個策略確保了對具有app=databases標籤的pod的訪問安全性 matchLabels: app: database ingress: - from: - podSelector: //它只允許來自具有app=webserver標籤的pod的訪問 matchLabels: app: webserver ports: - port: 5432 //允許對這個埠的訪問
13.4.2.在 不同的kubernetes名稱空間之間進行網路隔離
namespaceSelector進行對不同名稱空間間進行網路隔離
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: postgres-netpolicy spec: podSelector: //這個策略確保了對具有app=databases標籤的pod的訪問安全性 matchLabels: app: database ingress: - from: - namespaceSelector: //只允許tenant: manning標籤的名稱空間中執行的pod進行互相訪問 matchLabels: tenant: manning ports: - port: 5432 //允許對這個埠的訪問
13.4.3.使用CIDR網路隔離
ingress: - from: - ipBlock: cidr: 192.168.1.0/24 //指明允許訪問的ip段
13.4.4.限制pod對外訪問流量
使用egress進行限制
spec: podSelector: //這個策略確保了對具有app=databases標籤的pod的訪問安全性 matchLabels: app: database egress: //限制pod的出網流量 - to: - podSelector: matchLables: //database的pod只能與有app: webserver的pod進行通訊 app: webserver
&n