27.18.3. 补充组


注意

在使用补充组之前,请阅读 SCC、defaults 和 Allowed Ranges

提示

与使用 用户 ID 相比,通常最好使用组 ID(supplemental 或 fsGroup)来获得对持久性存储的访问。

补充组是常规的 Linux 组。当进程在 Linux 中运行时,它具有一个 UID、一个 GID,以及一个或多个补充组。可以为容器的主进程设置这些属性。supplementalGroups ID 通常用于控制对共享存储的访问,如 NFS 和 GlusterFS,而 fsGroup 则用于控制对块存储的访问,如 Ceph RBD 和 iSCSI。

OpenShift Container Platform 共享存储插件挂载卷,以便挂载上的 POSIX 权限与目标存储上的权限匹配。例如,如果目标存储的所有者 ID 是 1234,其组 ID 为 5678,则主机节点上和容器中的挂载将具有同样的 ID。因此,容器的主进程必须匹配其中一个或两个 ID 才能访问该卷。

例如,请考虑以下 NFS 导出:

在 OpenShift Container Platform 节点上:

注意

showmount 需要访问由 rpcbindrpc.mount 在 NFS 服务器上使用的端口

# showmount -e <nfs-server-ip-or-hostname>
Export list for f21-nfs.vm:
/opt/nfs  *

在 NFS 服务器中:

# cat /etc/exports
/opt/nfs *(rw,sync,root_squash)
...

# ls -lZ /opt/nfs -d
drwx------. 1000100001 5555 unconfined_u:object_r:usr_t:s0   /opt/nfs

/opt/nfs/ 导出可以被 UID 1000100001 和组 5555 访问。通常,容器不应以 root 用户身份运行。因此,在这个 NFS 示例中,没有以 UID 1000100001 运行且不是组 5555 的容器将无法访问 NFS 导出。

通常,与 pod 匹配的 SCC 不允许指定特定用户 ID,因此使用补充组可以更加灵活地向 pod 授予存储访问权限。例如,要向导出授予 NFS 访问权限,可在 Pod 定义中定义组 5555

apiVersion: v1
kind: Pod
...
spec:
  containers:
  - name: ...
    volumeMounts:
    - name: nfs 1
      mountPath: /usr/share/... 2
  securityContext: 3
    supplementalGroups: [5555] 4
  volumes:
  - name: nfs 5
    nfs:
      server: <nfs_server_ip_or_host>
      path: /opt/nfs 6
1
卷挂载的名称。必须与 volumes 部分中的名称匹配。
2
与容器中看到的 NFS 导出路径。
3
Pod 全局安全上下文。适用于 pod 中的所有容器。每个容器也可以定义其 securityContext,但组 ID 对 pod 全局,且无法为单个容器定义。
4
补充组(这是 ID 数组)被设置为 5555。这样可授予对导出的组访问权限。
5
卷的名称。必须与 volumeMounts 部分中的名称匹配。
6
NFS 服务器上的实际 NFS 导出路径。

以上 pod 中的所有容器(假设匹配的 SCC 或项目允许组 5555)成为组 5555 的成员,并且无论容器的用户 ID 都有权访问该卷。但是,上述假设至关重要。有时,SCC 并不定义允许的组 ID 范围,而是需要组 ID 验证(s supplementalGroups 的结果设置为 MustRunAs)。请注意,这不是 restricted SCC 的情况。该项目不太可能允许组 ID 5555,除非项目自定义了用于访问此 NFS 导出。因此,在这种情况下,上面的 Pod 将失败,因为它组 ID 5555 不在 SCC 或项目的允许组 ID 中。

补充组和自定义 SCC

要补救上一个示例中的情况,可以创建一个自定义 SCC,以便:

  • 已定义最小和最大组 ID,
  • 已强制检查 ID 范围检查,
  • 允许组 ID 5555

创建新 SCC 而非修改预定义的 SCC,或更改预定义项目中允许的 ID 范围,通常是创建新的 SCC。

创建新 SCC 的最简单方法是导出现有的 SCC,并自定义 YAML 文件以满足新 SCC 的要求。例如:

  1. 使用 restricted SCC 作为新 SCC 的模板:

    $ oc get -o yaml --export scc restricted > new-scc.yaml
  2. new-scc.yaml 文件编辑到您需要的规格。
  3. 创建新 SCC:

    $ oc create -f new-scc.yaml
注意

oc edit scc 命令可用于修改实例化的 SCC。

以下是名为 nfs-scc 的新 SCC 片段:

$ oc get -o yaml --export scc nfs-scc

allowHostDirVolumePlugin: false 1
...
kind: SecurityContextConstraints
metadata:
  ...
  name: nfs-scc 2
priority: 9 3
...
supplementalGroups:
  type: MustRunAs 4
  ranges:
  -  min: 5000 5
     max: 6000
...
1
allow 布尔值与 restricted SCC 相同。
2
新 SCC 的名称。
3
数字较大的数值具有更高的优先级。nil 或 omitted 是最低优先级。在优先级较低的 SCC 前排列较高的优先级 SCC,因此可以更好地匹配新 pod。
4
supplementalGroups 是一个策略,它被设置为 MustRunAs,这意味着需要进行组 ID 检查。
5
支持多个范围。这里允许的组 ID 范围为 5000 到 5999,默认的补充组为 5000。

如果前面显示的相同 pod 针对这个新 SCC 运行(假设,pod 与新 SCC 匹配时),它将会启动,因为 Pod 定义中提供的组 5555 可以被自定义 SCC 支持。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.