Kubernetes-保障集群內節點和網路安全

  • 2019 年 10 月 3 日
  • 筆記

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