4.2.5. 安全性上下文约束


除了控制用户可执行的操作的 RBAC 资源 外,OpenShift Container Platform 还提供 安全性上下文约束 (SCC)来控制 Pod 可以执行的操作以及它有权访问的内容。管理员可以使用 CLI 管理 SCC

SCC 在管理对持久存储的访问时也非常有用。

SCC 是定义 Pod 运行必须满足的一组条件的对象,以便其能被系统接受。它们允许管理员控制以下内容:

  1. 运行特权容器
  2. 容器可请求添加的功能
  3. 将主机目录用作卷。
  4. 容器的 SELinux 上下文。
  5. 用户 ID。
  6. 使用主机命名空间和联网。
  7. 分配拥有 pod 卷的 FSGroup
  8. 配置允许的补充组
  9. 要求使用只读根文件系统
  10. 控制卷类型的使用
  11. 配置允许的 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:
- '*'

1
Pod 可以请求的功能列表。空列表表示不允许请求任何功能,而特殊符号 * 则允许任何功能。
2
将添加到任何 pod 的附加功能列表。
3
FSGroup 策略,指明安全性上下文的允许值。
4
有权访问此 SCC 的组。
5
将从 pod 中丢弃的功能列表。
6
作为用户策略类型运行,指明安全性上下文的允许值。
7
SELinux 上下文策略类型,指明安全性上下文的允许值。
8
补充组策略,指明安全上下文的允许补充组。
9
有权访问此 SCC 的用户。

SCC 上的 usersgroups 字段控制可以使用哪些 SCC。默认情况下,集群管理员、节点和构建控制器被授予特权 SCC 的访问权限。所有经过身份验证的用户被授予受限 SCC 的访问权限。

Docker 具有允许用于 Pod 的每个容器的默认功能列表。容器使用此默认列表中的功能,但 Pod 清单作者可以通过请求额外的功能或丢弃一些默认功能来修改它。allowedCapabilitiesdefaultAddCapabilitiesrequiredDropCapabilities 字段用于控制来自 Pod 的此类请求,并指定可以请求哪些功能、必须为每个容器添加哪些功能,以及必须禁止哪些功能。

特权 SCC:

  • 允许特权 pod。
  • 允许将主机目录挂载为卷.
  • 允许容器集以任何用户身份运行。
  • 允许 Pod 使用任何 MCS 标签运行。
  • 允许 pod 使用主机的 IPC 命名空间。
  • 允许容器集使用主机的 PID 命名空间。
  • 允许容器集使用任何 FSGroup。
  • 允许容器集使用任何补充组。
  • 允许容器集使用任何 seccomp 配置集。
  • 允许容器集请求任何功能。

受限 SCC:

  • 确保 Pod 无法以特权方式运行。
  • 确保容器集无法使用主机目录卷。
  • 要求容器集以预先分配的 UID 范围内的用户运行。
  • 要求 Pod 使用预先分配的 MCS 标签运行。
  • 允许容器集使用任何 FSGroup。
  • 允许容器集使用任何补充组。
注意

如需有关各个 SCC 的更多信息,请参阅 SCC 的 kubernetes.io/description 注解。

SCC 由设置和策略组成,它们控制容器集可以访问的安全功能。这些设置分为三个类别:

由布尔值控制

此类型的字段默认为限制性最强的值。例如,AllowPrivilegedContainer 若未指定,则始终设为 false

由允许的集合控制

针对集合检查此类型的字段,以确保其值被允许。

由策略控制

具有生成某个值的策略的条目提供以下功能:

  • 生成值的机制,以及
  • 确保指定值属于允许值集合的机制。

4.2.5.1. SCC 策略

4.2.5.1.1. RunAsUser
  1. MustRunAs - 需要配置 runAsUser。使用配置的 runAsUser 作为默认值。针对配置的 runAsUser 进行验证。
  2. MustRunAsRange - 如果不使用预分配值,则需要定义最小值和最大值。使用最小值作为默认值。针对整个允许范围进行验证。
  3. MustRunAsNonRoot - 需要 Pod 提交为具有非零 runAsUser 或具有镜像中定义的 USER 指令。不提供默认值。
  4. RunAsAny - 不提供默认值。允许指定任何 runAsUser
4.2.5.1.2. SELinuxContext
  1. MustRunAs - 如果不使用预分配的值,则需要配置 seLinuxOptions。使用 seLinuxOptions 作为默认值。针对使用 seLinuxOptions 进行验证。
  2. RunAsAny - 不提供默认值。允许指定任何 seLinuxOptions
4.2.5.1.3. SupplementalGroups
  1. MustRunAs - 如果不使用预分配值,则需要至少指定一个范围。使用第一个范围内的最小值作为默认值。针对所有范围进行验证。
  2. RunAsAny - 不提供默认值。允许指定任何 supplementalGroups
4.2.5.1.4. FSGroup
  1. MustRunAs - 如果不使用预分配值,则需要至少指定一个范围。使用第一个范围内的最小值作为默认值。针对第一个范围内的第一个 ID 进行验证。
  2. RunAsAny - 不提供默认值。允许指定任何 fsGroup ID。
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.