4.2.5. 安全性上下文约束
除了控制用户可执行的操作的 RBAC 资源 外,OpenShift Container Platform 还提供 安全性上下文约束 (SCC)来控制 Pod 可以执行的操作以及它有权访问的内容。管理员可以使用 CLI 管理 SCC。
SCC 在管理对持久存储的访问时也非常有用。
SCC 是定义 Pod 运行必须满足的一组条件的对象,以便其能被系统接受。它们允许管理员控制以下内容:
- 运行特权容器。
- 容器可请求添加的功能
- 将主机目录用作卷。
- 容器的 SELinux 上下文。
- 用户 ID。
- 使用主机命名空间和联网。
-
分配拥有 pod 卷的
FSGroup
- 配置允许的补充组
- 要求使用只读根文件系统
- 控制卷类型的使用
- 配置允许的 seccomp 配置集
默认情况下,在集群中添加七个 SCC,集群管理员可使用 CLI 查看它们:
oc get scc
$ oc get scc
输出示例
不要修改默认 SCC。修改默认 SCC 可导致升级 OpenShift Container Platform 时出现问题。而是 创建新的 SCC。
集群管理员也可以使用 CLI 查看各个 SCC 的定义。例如,对于特权 SCC:
oc get -o yaml --export scc/privileged
$ oc get -o yaml --export scc/privileged
输出示例
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。