保障集群内节点和网络安全——《K8s in action》读书笔记13

13、保障集群内节点和网络安全

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

  • 配置节点的安全上下文

  • 限制pod使用安全相关的特性

  • 隔离pod的网络

安全上下文(securityContext)

securityContext既可以配置给pod也可以配置给pod下的任意容器,配置给pod则相当于声明了默认的安全上下文,它可以被容器的安全上下文覆盖。

面向容器:

配置项 说明
securityContext.runAsUser 指定启动容器的用户ID,此用户ID可以覆盖Dockerfile中USER指定的用户。
securityContext.runAsNonRoot 不想用 runAsUser 指定用户ID,仅仅想阻止容器以root用户运行。
(虽然容器与宿主机是隔离的,但是使用root运行容器仍然是一种不好的实践。例如宿主机某目录挂载到容器中时,如果容器是以root身份运行的,那么容器就有了此目录的完整权限,非root则没有完整权限。)
securityContext.privileged 使用特权模式运行,可以看到并使用所有的设备
(例子:kube-proxy使用了特权模式并可以修改宿主机的iptables)
securityContext.capabilities 为容器单独添加(add)内核功能或去除(drop)内核功能
(单独添加内核功能远比 privileged 要更好,诚然这需要使用者了解各种内核功能。)
securityContext.readOnlyRootFilesystem 阻止对容器根文件系统的写入

面向pod:

配置项 说明
securityContext.fsGroup 当进程在存储卷中创建文件时起作用,所创建的文件的所属用户组为fsGroup声明的值
securityContext.supplementalGroups 定义了某个用户所关联的额外的用户组

限制pod使用安全相关的特性(PodSecurityPolicy)

略过(不太感兴趣)

隔离pod的网络(NetworkPolicy)

通过配置 spec.ingressspec.egress 要求部分pod网络的入网流浪和出网流量。

散弹知识点

  • 设置 spec.hostNetWork 可以使pod直接使用宿主机网络命名空间
  • 设置 spec.containers.ports.hostPort 可以让pod拥有自己的网络命名空间的同时将端口绑定到宿主节点的端口上。(当然,此时pod实例在同一节点只能有一个副本)
  • 设置 spec.hostPID 可以使pod直接使用宿主机PID命名空间
  • 设置 spec.hostIPC 可以使pod直接使用宿主机IPC命名空间
  • Linux 内核功能的名称通常以 CAP_ 开头。但在 pod spec 中指定内核功能时,必须省略 CAP_ 前缀

命令

# 查看pod中所有的设备,若开启特权模式则能够看到宿主机所有的设备
kubectl exec -it pod-xxx ls /dev

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 nz_nuaa@163.com
github