kubernetes-资源对象之security context
一、kubernetes资源对象之security context
- Security Context,即安全上下文,用于定义Pod或Container的权限和访问控制。
- Kubernetes 提供了三种配置 Security Context 的方法:
- Container-level Security Context:应用于容器级别
- Pod-level Security Context:应用于Pod级别
- Pod Security Policy:应用于集群级别
-
安全上下文(Security Context)定义 Pod 或 Container 的特权与访问控制设置。安全上下文包括但不限于:
- 自主访问控制(Discretionary Access Control):基于用户 ID(UID)和组 ID(GID)来判定对对象(例如文件)的访问权限。
- 安全性增强的 Linux(SELinux):为对象赋予安全性标签。
- 以特权模式或者非特权模式运行。
- Linux 权能:为进程赋予 root 用户的部分特权而非全部特权。
- AppArmor:使用程序框架来限制个别程序的权能。
- Seccomp:过滤进程的系统调用。
- AllowPrivilegeEscalation:控制进程是否可以获得超出其父进程的特权。 此布尔值直接控制是否为容器进程设置 no_new_privs 标志。当容器以特权模式运行或者具有 CAP_SYS_ADMIN 权能时,AllowPrivilegeEscalation 总是为 true。
- readOnlyRootFilesystem:以只读方式加载容器的根文件系统。
-
SecurityContext 可以应用于 Container 和 Pod 维度:
- 在 Pod 上设置的安全性配置会应用到 Pod 中所有 Container 上,并且会还会影响 Volume
- 在 Container 上设置的安全性配置仅适用于该容器本身,不会影响到其他容器以及 Pod 的 Volume
1.1、容器级别
- 仅应用到指定的容器上,并且不会影响 Volume;
apiVersion: v1
kind: Pod
metadata:
name: hello-world
spec:
containers:
- name: hello-world-container
securityContext:
privileged: true
1.2、Pod级别
应用到 Pod 内所有容器,会影响 Volume;
apiVersion: v1
kind: Pod
metadata:
name: hello-world
spec:
containers:
securityContext:
fsGroup: 1234
supplementalGroups: [5678]
seLinuxOptions:
level: "s0:c123,c456"
1.3、PSP集群级别
- PSP 是集群级的 Pod 安全策略,自动为集群内的 Pod 和 Volume 设置 Security Context;
支持的控制项
RunAsUser
- MustRunAs - 必须配置一个 range。使用该范围内的第一个值作为默认值。验证是否不在配置的该范围内。
- MustRunAsNonRoot - 要求提交的 Pod 具有非零 runAsUser 值,或在镜像中定义了 USER 环境变量。不提供默认值。
- RunAsAny - 没有提供默认值。允许指定任何 runAsUser 。
SELinux
- MustRunAs - 如果没有使用预分配的值,必须配置 seLinuxOptions。默认使用 seLinuxOptions。
- RunAsAny - 没有提供默认值。允许任意指定的 seLinuxOptions ID。
SupplementalGroups
- MustRunAs - 至少需要指定一个范围。默认使用第一个范围的最小值。
- RunAsAny - 没有提供默认值。允许任意指定的 supplementalGroups ID
FSGroup
- MustRunAs - 至少需要指定一个范围。默认使用第一个范围的最小值。
- RunAsAny - 没有提供默认值。允许任意指定的 fsGroup ID
主机网络
- HostPorts , 默认为 empty。HostPortRange 列表通过 min(包含) and max(包含) 来定义,指定了被允许的主机端口。
允许的主机路径
- AllowedHostPaths 是一个被允许的主机路径前缀的白名单。空值表示所有的主机路径都可以使用。
控制卷
- 通过设置 PSP 卷字段,能够控制具体卷类型的使用。
apiVersion: extensions/v1beta1
kind: PodSecurityPolicy
metadata:
name: permissive
spec:
seLinux:
rule: RunAsAny
supplementalGroups:
rule: RunAsAny
runAsUser:
rule: RunAsAny
fsGroup:
rule: RunAsAny
hostPorts:
- min: 8000
max: 8080
volumes:
- '*'
二、应用场景
2.1、自定义对象访问权限
- 也就是上文中提到的自主访问控制(Discretionary Access Control),通过设置 UID 和 GID 来达到限制容器权限的目的。
...
securityContext:
runAsUser: 1000
runAsGroup: 3000
fsGroup: 2000
...
- 如上这个配置,可以看到 Pod 中所有容器内的进程都是已用户 uid=1000 和主组 gid=3000来运行的,而创建的任何文件的属组都是 groups=2000。通过这样的方法,可以达到让用户的进程不使用默认的 Root (uid=0,gid=0)权限的目的。
向往的地方很远,喜欢的东西很贵,这就是我努力的目标。