K8s-集群内网络安全
K8s-集群内网络安全
在Pod中使用宿主节点的Linux命名空间
Pod中的容器一般都在分开的Linux命名空间中,他们通过不同IPC和PID命名空间,彼此隔离
Pod使用宿主机网络命名空间
Pod需要使用主机网络,使用宿主机的网络适配器,而不是虚拟网络设备。
通过设置hostNetwork=true实现
绑定宿主机端口号而不是使用宿主机网络命名空间
Pod映射到到主机上的端口,但是不设置共享主机的网络命名空间
设置Pod的spec.containers.ports的hostPort实现
hostPort的Pod流量转发过程:
- 到达宿主机的端口连接直接转发到Pod 的对应的端口
与NodePort不同,NodePort会给所有的节点绑定上端口,即使Node没有对应Pod
Pod hostPort案例:
使用宿主机的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 |
阻止容器以root运行
使用特权模式运行Pod
pod 需要做它们的宿主节点上能够做的任何事,例如操作被保护的系统设备,或使用其他在通常容器中不能使用的内核功能
为容器单独添加内核功能
为容器禁止内核功能
阻止对容器根文件系统写入
考虑到安全,阻止容器进程对根文件系统写入,只能允许写入特定的挂载卷
设置Pod级别的安全上下文
虽然pod.spec.securityContext属性可以设置Pod级别的安全上下文,但是会被容器级别安全上下文覆盖
Pod的容器使用不同用户共享存储卷
一个Pod下的多个容器,使用不同用户运行容器,共享某一个文件夹
限制Pod使用安全相关特性
通过创建PodSecurityPolicy
实现,限制资源的特性使用
被移除的特性
PodSecurityPolicy 在 Kubernetes v1.21 中被弃用, 在 Kubernetes v1.25 中被移除。
隔离Pod的网络
通过NetworkPolicy
资源实现
在一个命名空间中启用网络隔离
允许同一命名空间的部分Pod访问一个服务端Pod
但是一般使用svc访问Pod,NetworkPolicy也会被触发