除了让pod使用宿主节点的linux命名空间,还可以在pod或所属容器的描述中通过security-context选项配置其他与安全性相关的特性。这个选项可以运行于整个pod,或每个pod中单独的容器。
了解安全上上下文中可以配置的内容
配置安全上下文可以允许你做很多事:
1)使用指定用户运行容器
为了使用一个与镜像中不同的用户id来运行pod,需要设置该pod的securityContext.runAsUser选项
guest用户id:405
2)阻止容器以root用户运行
yaml文件配置属性
runAsNonRoot:true
3)使用特权模式运行pod
有时pod需要做它们的宿主节点的能做的任何事,如操作被保护的系统设备,或使用其他在通常容器中不能使用的内核功能。
这种pod的一个样例就是kube-proxy pod。为了获取宿主机内核的完整权限,该pod需要在特权模式下运行。可以将容器的securityContext中的privileged设置为true实现。
4)为容器单独添加内核功能
前面介绍了一种给予容器无限力量的方法,一个更加安全的做法就是只给予它使用真正需要的内核功能的权限。kunernetes允许为特定的容器添加内核功能,或禁用部分内核功能,以允许对容器进行更加精细的权限控制,限制攻击者潜入的影响。
如果需要允许容器修改系统时间,可以在容器的capbilities里的add一项名CAP_SYS_TIME的功能。
注意:Linux内核功能的名称通常以CAP_开头。但在pod的spec中指定内核功能时,必须省略CAP_前缀
5)在容器中禁用内核功能
默认情况下容器拥有CAP_CHOWN权限,允许进程修改文件系统中文件的所有者。为了阻止容器此种行为,在yaml中的securityContext.capabilitirs.drop列表中加入此项,以禁用这个修改文件所有者的内核功能。
6)阻止对容器根文件系统的写入
为了安全原因,需要阻止容器中的进程对容器的根文件系统进行写入,仅允许他们写入挂载的存储卷。
将容器的securityContext.readOnlyRootFileSystem设置为true
提示:为了增强安全性,请将在生产环境中运行的容器的readOnlyRootFilesystem选项设置为true
设置pod级别的安全上下文
前面例子都是针对单独的容器设置的安全上下文。这些选项中一部分也可以从pod级别设定(通过pod.spec.securityContext属性)。它们会作为一个pod中的每一个容器默认安全上下文,但是会被容器级别的安全上下文覆盖。下面是pod级别安全上下文独有的内容。
7)容器使用不同用户运行时共享存储卷
之前章节讲的使用存储卷在pod的不同容器中共享数据,可以顺利在一个容器中写入数据,在另一个容器中读出这些数据,前提是这两个容器都以root用户运行,对存储卷中的所有文件拥有全部权限。如果两个不同用户它们不一定能读取或者写入另一个容器的文件。
kunernetes允许为pod中所有容器指定supplemental组,以允许它们无论哪个用户id运行都可以共享文件,可以通过设置以下两个属性设置: