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
apiVersion: v1
kind: pod
metadata:
name: pod-host-yaohong
spec:
hostNetwork: true //使用宿主節點的網絡命名空間
containers:
- image: luksa/kubia
command: ["/bin/sleep", "9999"]
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
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"]
$ 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)
apiVersion: v1
kind: pod
metadata:
name: pod-as-user
spec:
containers:
- name: main
image: alpine
command: ["/bin/sleep", "99999"]
securityContext:
runAsUser: 405 //你需要指定的使用者ID,而不是使用者名
apiVersion: v1
kind: pod
metadata:
name: pod-as-user
spec:
containers:
- name: main
image: alpine
command: ["/bin/sleep", "99999"]
securityContext:
runAsNonRoot: true //這個容器隻允許以非root使用者運作
apiVersion: v1
kind: pod
metadata:
name: pod-as-privileged
spec:
containers:
- name: main
image: alpine
command: ["/bin/sleep", "99999"]
securityContext:
privileged: true //這個容器将在特權模式下運作
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 //添加修改系統時間參數
apiVersion: v1
kind: pod
metadata:
name: pod-as-capability
spec:
containers:
- name: main
image: alpine
command: ["/bin/sleep", "99999"]
securityContext:
capabilities: //該參數用于pod添加或者禁用某項核心功能
drop:
- CHOWN //禁用容器修改檔案的所有者
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
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
apiVersion: v1
kind: PodSecurityPolicy
spec:
allowedCapabilities:
- SYS_TIME //允許容器添加SYS_time功能
defaultAddCapabilities:
- CHOWN //為每個容器自動添加CHOWN功能
requiredDropCapabilities:
- SYS_ADMIN //要求容器禁用SYS_ADMIN和SYS_MODULE功能
13.4.隔離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 //允許對這個端口的通路
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 //允許對這個端口的通路
ingress:
- from:
- ipBlock:
cidr: 192.168.1.0/24 //指明允許通路的ip段
spec:
podSelector: //這個政策確定了對具有app=databases标簽的pod的通路安全性
matchLabels:
app: database
egress: //限制pod的出網流量
- to:
- podSelector:
matchLables: //database的pod隻能與有app: webserver的pod進行通信
app: webserver