4.2.5. 安全性上下文约束
除了控制用户可执行的操作的 RBAC 资源 外,OpenShift Container Platform 还提供 安全性上下文约束 (SCC)来控制 Pod 可以执行的操作以及它有权访问的内容。管理员可以使用 CLI 管理 SCC。
SCC 在管理对持久存储的访问时也非常有用。
SCC 是定义 Pod 运行必须满足的一组条件的对象,以便其能被系统接受。它们允许管理员控制以下内容:
- 运行特权容器。
- 容器可请求添加的功能
- 将主机目录用作卷。
- 容器的 SELinux 上下文。
- 用户 ID。
- 使用主机命名空间和联网。
-
分配拥有 pod 卷的
FSGroup
- 配置允许的补充组
- 要求使用只读根文件系统
- 控制卷类型的使用
- 配置允许的 seccomp 配置集
默认情况下,在集群中添加七个 SCC,集群管理员可使用 CLI 查看它们:
$ oc get scc
输出示例
NAME PRIV CAPS SELINUX RUNASUSER FSGROUP SUPGROUP PRIORITY READONLYROOTFS VOLUMES anyuid false [] MustRunAs RunAsAny RunAsAny RunAsAny 10 false [configMap downwardAPI emptyDir persistentVolumeClaim secret] hostaccess false [] MustRunAs MustRunAsRange MustRunAs RunAsAny <none> false [configMap downwardAPI emptyDir hostPath persistentVolumeClaim secret] hostmount-anyuid false [] MustRunAs RunAsAny RunAsAny RunAsAny <none> false [configMap downwardAPI emptyDir hostPath nfs persistentVolumeClaim secret] hostnetwork false [] MustRunAs MustRunAsRange MustRunAs MustRunAs <none> false [configMap downwardAPI emptyDir persistentVolumeClaim secret] nonroot false [] MustRunAs MustRunAsNonRoot RunAsAny RunAsAny <none> false [configMap downwardAPI emptyDir persistentVolumeClaim secret] privileged true [*] RunAsAny RunAsAny RunAsAny RunAsAny <none> false [*] restricted false [] MustRunAs MustRunAsRange MustRunAs RunAsAny <none> false [configMap downwardAPI emptyDir persistentVolumeClaim secret]
不要修改默认 SCC。修改默认 SCC 可导致升级 OpenShift Container Platform 时出现问题。而是 创建新的 SCC。
集群管理员也可以使用 CLI 查看各个 SCC 的定义。例如,对于特权 SCC:
$ oc get -o yaml --export scc/privileged
输出示例
allowHostDirVolumePlugin: true allowHostIPC: true allowHostNetwork: true allowHostPID: true allowHostPorts: true allowPrivilegedContainer: true allowedCapabilities: 1 - '*' apiVersion: v1 defaultAddCapabilities: [] 2 fsGroup: 3 type: RunAsAny groups: 4 - system:cluster-admins - system:nodes kind: SecurityContextConstraints metadata: annotations: kubernetes.io/description: 'privileged allows access to all privileged and host features and the ability to run as any user, any group, any fsGroup, and with any SELinux context. WARNING: this is the most relaxed SCC and should be used only for cluster administration. Grant with caution.' creationTimestamp: null name: privileged priority: null readOnlyRootFilesystem: false requiredDropCapabilities: [] 5 runAsUser: 6 type: RunAsAny seLinuxContext: 7 type: RunAsAny seccompProfiles: - '*' supplementalGroups: 8 type: RunAsAny users: 9 - system:serviceaccount:default:registry - system:serviceaccount:default:router - system:serviceaccount:openshift-infra:build-controller volumes: - '*'
SCC 上的 users
和 groups
字段控制可以使用哪些 SCC。默认情况下,集群管理员、节点和构建控制器被授予特权 SCC 的访问权限。所有经过身份验证的用户被授予受限 SCC 的访问权限。
Docker 具有允许用于 Pod 的每个容器的默认功能列表。容器使用此默认列表中的功能,但 Pod 清单作者可以通过请求额外的功能或丢弃一些默认功能来修改它。allowedCapabilities
、defaultAddCapabilities
和 requiredDropCapabilities
字段用于控制来自 Pod 的此类请求,并指定可以请求哪些功能、必须为每个容器添加哪些功能,以及必须禁止哪些功能。
特权 SCC:
- 允许特权 pod。
- 允许将主机目录挂载为卷.
- 允许容器集以任何用户身份运行。
- 允许 Pod 使用任何 MCS 标签运行。
- 允许 pod 使用主机的 IPC 命名空间。
- 允许容器集使用主机的 PID 命名空间。
- 允许容器集使用任何 FSGroup。
- 允许容器集使用任何补充组。
- 允许容器集使用任何 seccomp 配置集。
- 允许容器集请求任何功能。
受限 SCC:
- 确保 Pod 无法以特权方式运行。
- 确保容器集无法使用主机目录卷。
- 要求容器集以预先分配的 UID 范围内的用户运行。
- 要求 Pod 使用预先分配的 MCS 标签运行。
- 允许容器集使用任何 FSGroup。
- 允许容器集使用任何补充组。
如需有关各个 SCC 的更多信息,请参阅 SCC 的 kubernetes.io/description 注解。
SCC 由设置和策略组成,它们控制容器集可以访问的安全功能。这些设置分为三个类别:
由布尔值控制 |
此类型的字段默认为限制性最强的值。例如, |
由允许的集合控制 | 针对集合检查此类型的字段,以确保其值被允许。 |
由策略控制 | 具有生成某个值的策略的条目提供以下功能:
|
4.2.5.1. SCC 策略
4.2.5.1.1. RunAsUser
-
MustRunAs - 需要配置
runAsUser
。使用配置的runAsUser
作为默认值。针对配置的runAsUser
进行验证。 - MustRunAsRange - 如果不使用预分配值,则需要定义最小值和最大值。使用最小值作为默认值。针对整个允许范围进行验证。
-
MustRunAsNonRoot - 需要 Pod 提交为具有非零
runAsUser
或具有镜像中定义的USER
指令。不提供默认值。 -
RunAsAny - 不提供默认值。允许指定任何
runAsUser
。
4.2.5.1.2. SELinuxContext
-
MustRunAs - 如果不使用预分配的值,则需要配置
seLinuxOptions
。使用seLinuxOptions
作为默认值。针对使用seLinuxOptions
进行验证。 -
RunAsAny - 不提供默认值。允许指定任何
seLinuxOptions
。
4.2.5.1.3. SupplementalGroups
- MustRunAs - 如果不使用预分配值,则需要至少指定一个范围。使用第一个范围内的最小值作为默认值。针对所有范围进行验证。
-
RunAsAny - 不提供默认值。允许指定任何
supplementalGroups
。
4.2.5.1.4. FSGroup
- MustRunAs - 如果不使用预分配值,则需要至少指定一个范围。使用第一个范围内的最小值作为默认值。针对第一个范围内的第一个 ID 进行验证。
-
RunAsAny - 不提供默认值。允许指定任何
fsGroup
ID。