说明
我有一个带有initContainer
的kubernetes pod,它需要以特权(privileged: true
)身份运行。第二个容器(不是init)不需要这种特权。
我想启用PodSecurityPolicy入场插件,我正在寻找对舱内不同容器具有不同特权/功能的可能性。
我非常确定它不会遵循任何最佳实践,但是我只是想知道这是否有可能。也许我误会了一些概念?
问题
您知道是否可以为Pod中的特定容器定义PodSecurityPolicy吗?
答案 0 :(得分:1)
首先要注意所有有关kubernetes pod安全策略最佳实践的理论:
在Kubernetes窗格中,容器可以选择以“特权”模式运行,这意味着容器内的进程几乎可以不受限制地访问主机系统上的资源。尽管在某些用例中需要这种级别的访问,但是通常来说,让您的容器执行此操作会带来安全风险。 请看一下:pod-sp,pod-psp-privileged。
有一些建议将SecurityContext
重构为具有容器级别和容器级别的属性,以便正确地对容器级别和容器级别的安全性进行建模。
例如,您可能想要一个包含两个容器的容器,其中一个以特权设置作为根运行,另一个作为非根UID运行。 这是一个示例:
apiVersion: v1
kind: Pod
metadata:
name: example
spec:
containers:
- name: container-1
securityContext:
privileged: true
- name: container-2
securityContext:
runAsUser: 1002
查看更多:security-context-example。
要为容器指定安全设置,请在容器清单中包含securityContext
字段。 securityContext
字段是SecurityContext对象。您为容器指定的安全性设置仅适用于单个容器,并且当它们重叠时,它们会覆盖在Pod级别进行的设置。容器设置不会影响Pod的音量。
但是目前无法为不同的容器创建一个PodSecurityContext.securityContext。
用户不应给Pod /容器root特权,而应该将特定的功能添加到指定的容器linux中,以改善容器的隔离性。看看:set-capabilities-for-a-container。
借助Linux功能,您可以授予进程某些特权,而无需授予root用户的所有特权。要为容器添加或删除Linux功能,请在容器清单的securityContext部分中包含功能字段。
与特权进程绕过所有内核权限检查相比,非特权进程必须基于进程的凭据(例如有效的UID,GID和补充组列表)通过完整的权限检查。从内核2.2开始,Linux将特权进程的特权划分为不同的单元,称为功能。这些不同的单元/特权可以独立分配,并为引入根特权的非特权进程启用。 Kubernetes用户可以使用Linux功能向进程授予某些特权,而无需授予root用户所有特权。这对改善容器与主机的隔离很有帮助,因为容器不再需要以root用户身份进行写-您只需授予它们某些root特权即可。
要为容器添加或删除Linux功能,可以在容器清单的securityContext
部分中包含功能字段。我们来看一个例子:
apiVersion: v1
kind: Pod
metadata:
name: linux-capabilities-example
spec:
securityContext:
runAsUser: 3000
containers:
- name: linux-capabilities
image: supergiantkir/k8s-liveliness
securityContext:
capabilities:
add: ["NET_ADMIN"]
在此示例中,CAP_NET_ADMIN
被分配了容器功能。此Linux功能允许进程执行各种与网络相关的操作,例如接口配置,IP防火墙管理,修改路由表,启用多播等。有关可用功能的完整列表,请参见官方Linux documentation。 / p>
了解更多:linux-capabilities。