×

在AWS上的Red Hat OpenShift Service中,您可以使用安全上下文约束(SCC)来控制集群中Pod的权限。

默认SCC在安装过程中以及安装某些Operators或其他组件时创建。作为集群管理员,您也可以使用OpenShift CLI(oc)创建自己的SCC。

不要修改默认SCC。自定义默认SCC可能会导致某些平台Pod部署或ROSA升级时出现问题。此外,在某些集群升级期间,默认SCC值将重置为默认值,这将丢弃对这些SCC的所有自定义。

不要修改默认SCC,而是根据需要创建和修改您自己的SCC。有关详细步骤,请参阅创建安全上下文约束

关于安全上下文约束

与RBAC资源控制用户访问的方式类似,管理员可以使用安全上下文约束(SCC)来控制Pod的权限。这些权限决定了Pod可以执行的操作以及可以访问的资源。您可以使用SCC来定义Pod必须运行的一组条件才能被系统接受。

安全上下文约束允许管理员控制

  • Pod是否可以使用allowPrivilegedContainer标志运行特权容器

  • Pod是否使用allowPrivilegeEscalation标志受到约束

  • 容器可以请求的功能

  • 将主机目录用作卷

  • 容器的SELinux上下文

  • 容器用户ID

  • 主机命名空间和网络的使用

  • 拥有Pod卷的FSGroup的分配

  • 允许的补充组的配置

  • 容器是否需要对其根文件系统写入访问权限

  • 卷类型的使用

  • 允许的seccomp配置文件的配置

不要在AWS上的Red Hat OpenShift Service中的任何命名空间上设置openshift.io/run-level标签。此标签供AWS上的内部Red Hat OpenShift Service组件使用,用于管理主要API组(例如Kubernetes API服务器和OpenShift API服务器)的启动。如果设置了openshift.io/run-level标签,则不会将任何SCC应用于该命名空间中的Pod,从而导致在该命名空间中运行的任何工作负载都具有高度特权。

默认安全上下文约束

集群包含下表中描述的几个默认安全上下文约束(SCC)。当您将Operators或其他组件安装到AWS上的Red Hat OpenShift Service时,可能会安装其他SCC。

不要修改默认SCC。自定义默认SCC可能会导致某些平台Pod部署或ROSA升级时出现问题。此外,在某些集群升级期间,默认SCC值将重置为默认值,这将丢弃对这些SCC的所有自定义。

不要修改默认SCC,而是根据需要创建和修改您自己的SCC。有关详细步骤,请参阅“创建安全上下文约束”。

表1. 默认安全上下文约束
安全上下文约束 描述

anyuid

提供restricted SCC的所有功能,但允许用户以任何UID和任何GID运行。

hostaccess

允许访问所有主机命名空间,但仍然要求Pod以分配给命名空间的UID和SELinux上下文运行。

此SCC允许对命名空间、文件系统和PID进行主机访问。它只能由受信任的Pod使用。谨慎授予。

hostmount-anyuid

提供restricted SCC的所有功能,但允许主机挂载和以系统上的任何UID和任何GID运行。

此SCC允许以任何UID(包括UID 0)访问主机文件系统。谨慎授予。

hostnetwork

允许使用主机网络和主机端口,但仍然要求Pod以分配给命名空间的UID和SELinux上下文运行。

如果在控制平面主机上运行其他工作负载,请在提供对hostnetwork的访问权限时谨慎操作。在控制平面主机上运行hostnetwork的工作负载实际上是集群上的root用户,因此必须相应地对其进行信任。

hostnetwork-v2

hostnetwork SCC类似,但存在以下差异

  • ALL功能已从容器中删除。

  • 可以显式添加NET_BIND_SERVICE功能。

  • seccompProfile默认设置为runtime/default

  • 在安全上下文中,必须取消设置allowPrivilegeEscalation或将其设置为false

node-exporter

用于Prometheus节点导出器。

此SCC允许以任何UID(包括UID 0)访问主机文件系统。谨慎授予。

nonroot

提供restricted SCC 的所有功能,但允许用户以任何非 root UID 运行。用户必须指定 UID,或者必须在容器运行时的清单中指定。

nonroot-v2

nonroot SCC 类似,但有以下区别

  • ALL功能已从容器中删除。

  • 可以显式添加NET_BIND_SERVICE功能。

  • seccompProfile默认设置为runtime/default

  • 在安全上下文中,必须取消设置allowPrivilegeEscalation或将其设置为false

privileged

允许访问所有特权和主机功能,并能够以任何用户、任何组、任何 FSGroup 以及任何 SELinux 上下文运行。

这是最宽松的 SCC,仅应用于集群管理。谨慎授予。

privileged SCC 允许

  • 用户运行特权 Pod

  • Pod 将主机目录作为卷挂载

  • Pod 以任何用户身份运行

  • Pod 使用任何 MCS 标签运行

  • Pod 使用主机的 IPC 命名空间

  • Pod 使用主机的 PID 命名空间

  • Pod 使用任何 FSGroup

  • Pod 使用任何补充组

  • Pod 使用任何 seccomp 配置文件

  • Pod 请求任何功能

在 Pod 规范中设置privileged: true并不一定选择privileged SCC。如果用户有权限使用它,则将选择具有allowPrivilegedContainer: true且具有最高优先级的 SCC。

restricted

拒绝访问所有主机功能,并要求 Pod 使用分配给命名空间的 UID 和 SELinux 上下文运行。

restricted SCC

  • 确保 Pod 无法以特权方式运行

  • 确保 Pod 无法挂载主机目录卷

  • 要求 Pod 以预分配的 UID 范围内的用户身份运行

  • 要求 Pod 使用预分配的 MCS 标签运行

  • 要求 Pod 使用预分配的 FSGroup

  • 允许 Pod 使用任何补充组

在从 Red Hat OpenShift Service on AWS 4.10 或更早版本升级的集群中,任何已认证用户都可以使用此 SCC。除非显式授予访问权限,否则在新的 Red Hat OpenShift Service on AWS 4.11 或更高版本安装中,用户将无法再使用restricted SCC。

restricted-v2

restricted SCC 类似,但有以下区别

  • ALL功能已从容器中删除。

  • 可以显式添加NET_BIND_SERVICE功能。

  • seccompProfile默认设置为runtime/default

  • 在安全上下文中,必须取消设置allowPrivilegeEscalation或将其设置为false

这是新安装提供的最严格的 SCC,并将默认用于已认证用户。

restricted-v2 SCC 是系统默认包含的最严格的 SCC。但是,您可以创建更严格的自定义 SCC。例如,您可以创建一个将readOnlyRootFilesystem限制为true的 SCC。

安全上下文约束设置

安全上下文约束 (SCC) 由控制 Pod 能够访问的安全功能的设置和策略组成。这些设置分为三类

类别 描述

由布尔值控制

此类型的字段默认为最严格的值。例如,如果未指定,AllowPrivilegedContainer 始终设置为false

由允许的集合控制

此类型的字段将针对该集合进行检查,以确保其值是允许的。

由策略控制

具有生成值的策略的项目提供

  • 一种生成值的机制,以及

  • 一种确保指定值落入允许值集合中的机制。

CRI-O 具有以下默认功能列表,这些功能允许用于 Pod 的每个容器

  • CHOWN

  • DAC_OVERRIDE

  • FSETID

  • FOWNER

  • SETGID

  • SETUID

  • SETPCAP

  • NET_BIND_SERVICE

  • KILL

容器使用此默认列表中的功能,但 Pod 清单作者可以通过请求附加功能或删除某些默认行为来更改此列表。使用allowedCapabilitiesdefaultAddCapabilitiesrequiredDropCapabilities 参数来控制 Pod 的此类请求。使用这些参数,您可以指定可以请求哪些功能,必须向每个容器添加哪些功能,以及必须禁止或从每个容器中删除哪些功能。

您可以通过将requiredDropCapabilities 参数设置为ALL来删除容器中的所有功能。这就是restricted-v2 SCC 所做的。

安全上下文约束策略

RunAsUser
  • MustRunAs - 要求配置runAsUser。使用配置的runAsUser作为默认值。根据配置的runAsUser进行验证。

    MustRunAs 代码片段示例
    ...
    runAsUser:
      type: MustRunAs
      uid: <id>
    ...
  • MustRunAsRange - 如果不使用预分配的值,则要求定义最小值和最大值。使用最小值作为默认值。根据整个允许范围进行验证。

    MustRunAsRange 代码片段示例
    ...
    runAsUser:
      type: MustRunAsRange
      uidRangeMax: <maxvalue>
      uidRangeMin: <minvalue>
    ...
  • MustRunAsNonRoot - 要求 Pod 使用非零runAsUser提交,或在镜像中定义USER指令。不提供默认值。

    MustRunAsNonRoot 代码片段示例
    ...
    runAsUser:
      type: MustRunAsNonRoot
    ...
  • RunAsAny - 不提供默认值。允许指定任何runAsUser

    RunAsAny 代码片段示例
    ...
    runAsUser:
      type: RunAsAny
    ...
SELinuxContext
  • MustRunAs - 如果不使用预分配的值,则要求配置seLinuxOptions。使用seLinuxOptions作为默认值。根据seLinuxOptions进行验证。

  • RunAsAny - 不提供默认值。允许指定任何seLinuxOptions

SupplementalGroups
  • MustRunAs - 如果不使用预分配的值,则要求至少指定一个范围。使用第一个范围的最小值作为默认值。根据所有范围进行验证。

  • RunAsAny - 不提供默认值。允许指定任何supplementalGroups

FSGroup
  • MustRunAs - 如果不使用预分配的值,则要求至少指定一个范围。使用第一个范围的最小值作为默认值。根据第一个范围中的第一个 ID 进行验证。

  • RunAsAny - 不提供默认值。允许指定任何fsGroup ID。

控制卷

可以通过设置 SCC 的volumes字段来控制特定卷类型的使用。

此字段的允许值对应于创建卷时定义的卷源

对于新的 SCC,建议的最小允许卷集为configMapdownwardAPIemptyDirpersistentVolumeClaimsecretprojected

此允许卷类型列表并不详尽,因为 Red Hat OpenShift Service on AWS 的每个版本都会添加新的类型。

为了向后兼容性,allowHostDirVolumePlugin 的使用会覆盖volumes字段中的设置。例如,如果allowHostDirVolumePlugin设置为 false,但在volumes字段中允许,则hostPath值将从volumes中删除。

准入控制

使用 SCC 的准入控制允许根据授予用户的权限来控制资源的创建。

关于安全上下文约束 (SCC),这意味着准入控制器可以检查上下文中提供的用户信息以检索一组合适的 SCC。这样做可以确保 Pod 被授权请求其操作环境或生成一组应用于 Pod 的约束。

准入用于授权 Pod 的 SCC 集由用户的身份和所属组决定。此外,如果 Pod 指定了一个服务帐户,则允许的 SCC 集包括服务帐户可以访问的任何约束。

创建工作负载资源(例如部署)时,仅使用服务帐户查找 SCC 并在其创建时准入 Pod。

准入使用以下方法为 Pod 创建最终安全上下文

  1. 检索所有可用的 SCC。

  2. 为请求中未指定的安全上下文设置生成字段值。

  3. 根据可用约束验证最终设置。

如果找到匹配的约束集,则接受 Pod。如果请求无法与 SCC 匹配,则拒绝 Pod。

Pod 必须根据 SCC 验证每个字段。以下是必须验证的两个字段的示例

这些示例是在使用预分配值的策略的上下文中。

MustRunAs 的 FSGroup SCC 策略

如果 Pod 定义了 fsGroup ID,则该 ID 必须等于默认 fsGroup ID。否则,该 SCC 不会验证 Pod,并且会评估下一个 SCC。

如果 SecurityContextConstraints.fsGroup 字段的值为 RunAsAny,并且 Pod 规范省略了 Pod.spec.securityContext.fsGroup,则此字段被认为有效。请注意,在验证期间,其他 SCC 设置可能会拒绝其他 Pod 字段,从而导致 Pod 失败。

MustRunAs 的 SupplementalGroups SCC 策略

如果 Pod 规范定义了一个或多个 supplementalGroups ID,则 Pod 的 ID 必须等于命名空间的 openshift.io/sa.scc.supplemental-groups 注释中的一个 ID。否则,该 SCC 不会验证 Pod,并且会评估下一个 SCC。

如果 SecurityContextConstraints.supplementalGroups 字段的值为 RunAsAny,并且 Pod 规范省略了 Pod.spec.securityContext.supplementalGroups,则此字段被认为有效。请注意,在验证期间,其他 SCC 设置可能会拒绝其他 Pod 字段,从而导致 Pod 失败。

安全上下文约束优先级

安全上下文约束 (SCC) 具有一个优先级字段,该字段会影响准入控制器尝试验证请求时的顺序。

优先级值为 0 是最低优先级。空优先级被视为 0 或最低优先级。排序时,更高优先级的 SCC 会被移到集合的前面。

确定所有可用 SCC 的完整集合后,SCC 的排序方式如下:

  1. 最高优先级的 SCC 首先排序。

  2. 如果优先级相同,则 SCC 从最严格到最不严格排序。

  3. 如果优先级和限制都相同,则 SCC 按名称排序。

默认情况下,授予集群管理员的 anyuid SCC 在其 SCC 集中具有优先级。这允许集群管理员通过在 Pod 的 SecurityContext 中指定 RunAsUser 来以任何用户身份运行 Pod。

关于预分配的安全上下文约束值

准入控制器知道安全上下文约束 (SCC) 中的某些条件会触发它从命名空间查找预分配的值并在处理 Pod 之前填充 SCC。每个 SCC 策略都独立于其他策略进行评估,预分配的值(在允许的情况下)用于每个策略,并与 Pod 规范值聚合以生成运行 Pod 中定义的各种 ID 的最终值。

以下 SCC 会导致准入控制器在 Pod 规范中未定义范围时查找预分配的值:

  1. MustRunAsRangeRunAsUser 策略,未设置最小值或最大值。准入会查找 openshift.io/sa.scc.uid-range 注释以填充范围字段。

  2. MustRunAsSELinuxContext 策略,未设置级别。准入会查找 openshift.io/sa.scc.mcs 注释以填充级别。

  3. MustRunAsFSGroup 策略。准入会查找 openshift.io/sa.scc.supplemental-groups 注释。

  4. MustRunAsSupplementalGroups 策略。准入会查找 openshift.io/sa.scc.supplemental-groups 注释。

在生成阶段,安全上下文提供程序使用默认值来代替 Pod 中未明确设置的任何参数值。默认值基于所选策略。

  1. RunAsAnyMustRunAsNonRoot 策略不提供默认值。如果 Pod 需要参数值(例如组 ID),则必须在 Pod 规范中定义该值。

  2. MustRunAs(单值)策略提供始终使用的默认值。例如,对于组 ID,即使 Pod 规范定义了自己的 ID 值,命名空间的默认参数值也会出现在 Pod 的组中。

  3. MustRunAsRangeMustRunAs(基于范围)策略提供范围的最小值。与单值 MustRunAs 策略一样,命名空间的默认参数值会出现在正在运行的 Pod 中。如果基于范围的策略可配置多个范围,则它提供第一个配置范围的最小值。

如果命名空间上不存在 openshift.io/sa.scc.supplemental-groups 注释,则 FSGroupSupplementalGroups 策略会回退到 openshift.io/sa.scc.uid-range 注释。如果两者都不存在,则不会创建 SCC。

默认情况下,基于注释的 FSGroup 策略使用基于注释最小值的单个范围进行配置。例如,如果您的注释读取 1/3,则 FSGroup 策略将使用 1 的最小值和最大值进行配置。如果您想允许为 FSGroup 字段接受更多组,您可以配置不使用注释的自定义 SCC。

openshift.io/sa.scc.supplemental-groups 注释接受以 <start>/<length<start>-<end> 格式的逗号分隔的块列表。openshift.io/sa.scc.uid-range 注释仅接受单个块。

安全上下文约束示例

以下示例显示了安全上下文约束 (SCC) 格式和注释

带注释的 privileged SCC
allowHostDirVolumePlugin: true
allowHostIPC: true
allowHostNetwork: true
allowHostPID: true
allowHostPorts: true
allowPrivilegedContainer: true
allowedCapabilities: (1)
- '*'
apiVersion: security.openshift.io/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: null (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: (10)
- '*'
1 Pod 可以请求的功能列表。空列表表示无法请求任何功能,而特殊符号 * 允许任何功能。
2 添加到任何 Pod 的附加功能列表。
3 FSGroup 策略,它规定安全上下文的允许值。
4 可以访问此 SCC 的组。
5 要从 Pod 中删除的功能列表。或者,指定 ALL 以删除所有功能。
6 runAsUser 策略类型,它规定安全上下文的允许值。
7 seLinuxContext 策略类型,它规定安全上下文的允许值。
8 supplementalGroups 策略,它规定安全上下文的允许补充组。
9 可以访问此 SCC 的用户。
10 安全上下文的允许卷类型。在示例中,* 允许使用所有卷类型。

SCC(安全上下文约束)上的usersgroups 字段控制哪些用户可以访问 SCC。默认情况下,集群管理员、节点和构建控制器被授予对特权 SCC 的访问权限。所有已认证的用户都被授予对restricted-v2 SCC 的访问权限。

无显式runAsUser设置
apiVersion: v1
kind: Pod
metadata:
  name: security-context-demo
spec:
  securityContext: (1)
  containers:
  - name: sec-ctx-demo
    image: gcr.io/google-samples/node-hello:1.0
1 当容器或 Pod 没有请求其应该运行的用户 ID 时,有效 UID 取决于发出此 Pod 的 SCC。因为restricted-v2 SCC 默认授予所有已认证的用户,所以它将对所有用户和服务帐户可用,并在大多数情况下使用。restricted-v2 SCC 使用MustRunAsRange策略来约束和默认securityContext.runAsUser字段的可能值。准入插件将查找当前项目上的openshift.io/sa.scc.uid-range注释以填充范围字段,因为它不提供此范围。最终,容器的runAsUser将等于范围的第一个值,该值很难预测,因为每个项目都有不同的范围。
有显式runAsUser设置
apiVersion: v1
kind: Pod
metadata:
  name: security-context-demo
spec:
  securityContext:
    runAsUser: 1000 (1)
  containers:
    - name: sec-ctx-demo
      image: gcr.io/google-samples/node-hello:1.0
1 只有当服务帐户或用户被授予对允许此类用户 ID 的 SCC 的访问权限时,请求特定用户 ID 的容器或 Pod 才会被 Red Hat OpenShift Service on AWS 接受。SCC 可以允许任意 ID、属于某个范围内的 ID 或请求特有的确切用户 ID。

此配置对 SELinux、fsGroup 和补充组有效。

创建安全上下文约束

如果默认的安全上下文约束 (SCC) 不满足您的应用程序工作负载要求,您可以使用 OpenShift CLI (oc) 创建自定义 SCC。

创建和修改您自己的 SCC 是高级操作,可能会导致集群不稳定。如果您对使用自己的 SCC 有任何疑问,请联系 Red Hat 支持。有关联系 Red Hat 支持的信息,请参阅《获取支持》。

先决条件
  • 安装 OpenShift CLI (oc)。

  • 以具有cluster-admin角色的用户身份登录集群。

步骤
  1. 在名为scc-admin.yaml的 YAML 文件中定义 SCC

    kind: SecurityContextConstraints
    apiVersion: security.openshift.io/v1
    metadata:
      name: scc-admin
    allowPrivilegedContainer: true
    runAsUser:
      type: RunAsAny
    seLinuxContext:
      type: RunAsAny
    fsGroup:
      type: RunAsAny
    supplementalGroups:
      type: RunAsAny
    users:
    - my-admin-user
    groups:
    - my-admin-group

    您可以选择通过使用所需的值设置requiredDropCapabilities字段来删除 SCC 的特定功能。任何指定的权限都将从容器中删除。要删除所有权限,请指定ALL。例如,要创建一个删除KILLMKNODSYS_CHROOT权限的 SCC,请将以下内容添加到 SCC 对象

    requiredDropCapabilities:
    - KILL
    - MKNOD
    - SYS_CHROOT

    您不能同时在allowedCapabilitiesrequiredDropCapabilities中列出权限。

    CRI-O 支持与Docker 文档中相同的权限值列表。

  2. 通过传入文件来创建 SCC

    $ oc create -f scc-admin.yaml
    示例输出
    securitycontextconstraints "scc-admin" created
验证
  • 验证 SCC 是否已创建

    $ oc get scc scc-admin
    示例输出
    NAME        PRIV      CAPS      SELINUX    RUNASUSER   FSGROUP    SUPGROUP   PRIORITY   READONLYROOTFS   VOLUMES
    scc-admin   true      []        RunAsAny   RunAsAny    RunAsAny   RunAsAny   <none>     false            [awsElasticBlockStore azureDisk azureFile cephFS cinder configMap downwardAPI emptyDir fc flexVolume flocker gcePersistentDisk gitRepo glusterfs iscsi nfs persistentVolumeClaim photonPersistentDisk quobyte rbd secret vsphere]

配置工作负载以需要特定 SCC

您可以将工作负载配置为需要特定的安全上下文约束 (SCC)。这在您想将特定 SCC 固定到工作负载或想防止所需 SCC 被集群中的其他 SCC 抢占的情况下非常有用。

要需要特定的 SCC,请在您的工作负载上设置openshift.io/required-scc注释。您可以将此注释设置在可以设置 Pod 清单模板的任何资源上,例如部署或守护程序集。

SCC 必须存在于集群中,并且必须适用于工作负载,否则 Pod 准入将失败。如果创建 Pod 的用户或 Pod 的服务帐户对 Pod 命名空间中的 SCC 具有use权限,则 SCC 被认为适用于工作负载。

不要更改活动 Pod 清单中的openshift.io/required-scc注释,因为这样做会导致 Pod 准入失败。要更改所需的 SCC,请更新底层 Pod 模板中的注释,这将导致 Pod 被删除并重新创建。

先决条件
  • SCC 必须存在于集群中。

步骤
  1. 为部署创建一个 YAML 文件,并通过设置openshift.io/required-scc注释来指定所需的 SCC

    示例deployment.yaml
    apiVersion: config.openshift.io/v1
    kind: Deployment
    apiVersion: apps/v1
    spec:
    # ...
      template:
        metadata:
          annotations:
            openshift.io/required-scc: "my-scc" (1)
    # ...
    1 指定要需要的 SCC 的名称。
  2. 运行以下命令创建资源

    $ oc create -f deployment.yaml
验证
  • 验证部署是否使用了指定的 SCC

    1. 运行以下命令查看 Pod 的openshift.io/scc注释的值

      $ oc get pod <pod_name> -o jsonpath='{.metadata.annotations.openshift\.io\/scc}{"\n"}' (1)
      1 <pod_name>替换为您的部署 Pod 的名称。
    2. 检查输出并确认显示的 SCC 与您在部署中定义的 SCC 匹配

      示例输出
      my-scc

基于角色的安全上下文约束访问

您可以将 SCC 指定为由 RBAC 处理的资源。这允许您将对 SCC 的访问范围限定到某个项目或整个集群。将用户、组或服务帐户直接分配给 SCC 将保留集群范围。

不要在默认项目中运行工作负载或共享对默认项目的访问权限。默认项目保留用于运行核心集群组件。

以下默认项目被认为是高度特权的:defaultkube-publickube-systemopenshiftopenshift-infraopenshift-node以及其他其openshift.io/run-level标签设置为01的系统创建的项目。依赖于准入插件的功能(例如 Pod 安全准入、安全上下文约束、集群资源配额和镜像引用解析)在高度特权的项目中不起作用。

要包含对您角色的 SCC 的访问权限,请在创建角色时指定scc资源。

$ oc create role <role-name> --verb=use --resource=scc --resource-name=<scc-name> -n <namespace>

这将导致以下角色定义

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
...
  name: role-name (1)
  namespace: namespace (2)
...
rules:
- apiGroups:
  - security.openshift.io (3)
  resourceNames:
  - scc-name (4)
  resources:
  - securitycontextconstraints (5)
  verbs: (6)
  - use
1 角色的名称。
2 已定义角色的命名空间。如果未指定,则默认为default
3 包含SecurityContextConstraints资源的 API 组。当scc被指定为资源时自动定义。
4 您想要访问的 SCC 的示例名称。
5 允许用户在resourceNames字段中指定 SCC 名称的资源组的名称。
6 应用于角色的一组动词。

具有此规则的本地或集群角色允许与其绑定了角色绑定或集群角色绑定的主体使用名为scc-name的用户定义的 SCC。

由于 RBAC 旨在防止升级,即使是项目管理员也无法授予对 SCC 的访问权限。默认情况下,他们不允许对 SCC 资源(包括restricted-v2 SCC)使用动词use

安全上下文约束命令参考

您可以使用 OpenShift CLI (oc) 将安全上下文约束 (SCC) 作为普通 API 对象在您的实例中进行管理。

列出安全上下文约束

要获取 SCC 的当前列表

$ oc get scc
示例输出
NAME                              PRIV    CAPS                   SELINUX     RUNASUSER          FSGROUP     SUPGROUP    PRIORITY     READONLYROOTFS   VOLUMES
anyuid                            false   <no value>             MustRunAs   RunAsAny           RunAsAny    RunAsAny    10           false            ["configMap","downwardAPI","emptyDir","persistentVolumeClaim","projected","secret"]
hostaccess                        false   <no value>             MustRunAs   MustRunAsRange     MustRunAs   RunAsAny    <no value>   false            ["configMap","downwardAPI","emptyDir","hostPath","persistentVolumeClaim","projected","secret"]
hostmount-anyuid                  false   <no value>             MustRunAs   RunAsAny           RunAsAny    RunAsAny    <no value>   false            ["configMap","downwardAPI","emptyDir","hostPath","nfs","persistentVolumeClaim","projected","secret"]
hostnetwork                       false   <no value>             MustRunAs   MustRunAsRange     MustRunAs   MustRunAs   <no value>   false            ["configMap","downwardAPI","emptyDir","persistentVolumeClaim","projected","secret"]
hostnetwork-v2                    false   ["NET_BIND_SERVICE"]   MustRunAs   MustRunAsRange     MustRunAs   MustRunAs   <no value>   false            ["configMap","downwardAPI","emptyDir","persistentVolumeClaim","projected","secret"]
node-exporter                     true    <no value>             RunAsAny    RunAsAny           RunAsAny    RunAsAny    <no value>   false            ["*"]
nonroot                           false   <no value>             MustRunAs   MustRunAsNonRoot   RunAsAny    RunAsAny    <no value>   false            ["configMap","downwardAPI","emptyDir","persistentVolumeClaim","projected","secret"]
nonroot-v2                        false   ["NET_BIND_SERVICE"]   MustRunAs   MustRunAsNonRoot   RunAsAny    RunAsAny    <no value>   false            ["configMap","downwardAPI","emptyDir","persistentVolumeClaim","projected","secret"]
privileged                        true    ["*"]                  RunAsAny    RunAsAny           RunAsAny    RunAsAny    <no value>   false            ["*"]
restricted                        false   <no value>             MustRunAs   MustRunAsRange     MustRunAs   RunAsAny    <no value>   false            ["configMap","downwardAPI","emptyDir","persistentVolumeClaim","projected","secret"]
restricted-v2                     false   ["NET_BIND_SERVICE"]   MustRunAs   MustRunAsRange     MustRunAs   RunAsAny    <no value>   false            ["configMap","downwardAPI","emptyDir","persistentVolumeClaim","projected","secret"]

检查安全上下文约束

您可以查看有关特定 SCC 的信息,包括应用了该 SCC 的用户、服务帐户和组。

例如,要检查restricted SCC

$ oc describe scc restricted
示例输出
Name:                                  restricted
Priority:                              <none>
Access:
  Users:                               <none> (1)
  Groups:                              <none> (2)
Settings:
  Allow Privileged:                    false
  Allow Privilege Escalation:          true
  Default Add Capabilities:            <none>
  Required Drop Capabilities:          KILL,MKNOD,SETUID,SETGID
  Allowed Capabilities:                <none>
  Allowed Seccomp Profiles:            <none>
  Allowed Volume Types:                configMap,downwardAPI,emptyDir,persistentVolumeClaim,projected,secret
  Allowed Flexvolumes:                 <all>
  Allowed Unsafe Sysctls:              <none>
  Forbidden Sysctls:                   <none>
  Allow Host Network:                  false
  Allow Host Ports:                    false
  Allow Host PID:                      false
  Allow Host IPC:                      false
  Read Only Root Filesystem:           false
  Run As User Strategy: MustRunAsRange
    UID:                               <none>
    UID Range Min:                     <none>
    UID Range Max:                     <none>
  SELinux Context Strategy: MustRunAs
    User:                              <none>
    Role:                              <none>
    Type:                              <none>
    Level:                             <none>
  FSGroup Strategy: MustRunAs
    Ranges:                            <none>
  Supplemental Groups Strategy: RunAsAny
    Ranges:                            <none>
1 列出应用了 SCC 的用户和服务帐户。
2 列出应用了 SCC 的组。

其他资源