K8s-集群内网络安全

在Pod中使用宿主节点的Linux命名空间

Pod中的容器一般都在分开的Linux命名空间中,他们通过不同IPC和PID命名空间,彼此隔离

Pod使用宿主机网络命名空间

Pod需要使用主机网络,使用宿主机的网络适配器,而不是虚拟网络设备。

通过设置hostNetwork=true实现

绑定宿主机端口号而不是使用宿主机网络命名空间

Pod映射到到主机上的端口,但是不设置共享主机的网络命名空间

设置Pod的spec.containers.ports的hostPort实现

hostPort的Pod流量转发过程:

  • 到达宿主机的端口连接直接转发到Pod 的对应的端口

与NodePort不同,NodePort会给所有的节点绑定上端口,即使Node没有对应Pod

20240506203647

Pod hostPort案例:

20240506203724

使用宿主机的PID和IPC命名空间

当使用spec中hostPID=true 和 hostIPC=true之后,pod容器就可以看到所有宿主机上的进程

配置节点的安全上下文

通过 security Context 边项配置其他与安全性相关的特性

配置安全上下文以后功能:

  • 指定容器中运行进程的用户(用户ID)
  • 阻止容器使用root用户运行(容器的默认运行用户通常在其镜像中指定,所 以可能需要阻止容器 root 用户运行〉
  • 使用特权模式运行容器,使其对宿主节点的内核有完全访问的权限
  • 与以上相反,通过添加或禁用内核功能,配置细粒度的内核访问权限
  • 设 SELinux C Security aced Linux 安全增强型 Linux )边项,加强对容 器的限制
  • 阻止进程写入容器的根文件系统

运行Pod不配置安全上下文

通过kuhectl exec pod-with-defaults id查看

容器运行的用户在Dockerfile中指定,不指定默认root

指定用户运行容器

apiVersion: v1
kind: Pod
metadata:
name: pod-as-user-guest
spec:
containers:
- name: main
image: alpine
command: ["/bin/sleep","99999"]
securityContext:
runAsUser: 405

20240506212206

阻止容器以root运行

20240506212301

使用特权模式运行Pod

pod 需要做它们的宿主节点上能够做的任何事,例如操作被保护的系统设备,或使用其他在通常容器中不能使用的内核功能

20240506213019

为容器单独添加内核功能

20240506213206

为容器禁止内核功能

20240506213325

阻止对容器根文件系统写入

考虑到安全,阻止容器进程对根文件系统写入,只能允许写入特定的挂载卷

20240506213557

设置Pod级别的安全上下文

虽然pod.spec.securityContext属性可以设置Pod级别的安全上下文,但是会被容器级别安全上下文覆盖

Pod的容器使用不同用户共享存储卷

一个Pod下的多个容器,使用不同用户运行容器,共享某一个文件夹

20240506220254

限制Pod使用安全相关特性

通过创建PodSecurityPolicy实现,限制资源的特性使用

被移除的特性

PodSecurityPolicy 在 Kubernetes v1.21 中被弃用, 在 Kubernetes v1.25 中被移除。

隔离Pod的网络

通过NetworkPolicy资源实现

在一个命名空间中启用网络隔离

20240506223217

允许同一命名空间的部分Pod访问一个服务端Pod

20240506225710

20240506225908

但是一般使用svc访问Pod,NetworkPolicy也会被触发

在不同Namespace进行网络隔离

20240506231559

20240506231650

使用CIDR隔离网络

20240506231758

20240506231819