27.18.4. fsGroup


注意

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

提示

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

fsGroup 定义 pod 的"文件系统组"ID,该 ID 已添加到容器的补充组中。supplementalGroups ID 适用于共享存储,而 fsGroup ID 用于块存储。

块存储(如 Ceph RBD、iSCSI 和各种云存储)通常专用于单一 pod 请求块存储卷,可以是直接或使用 PVC。与共享存储不同,块存储被 pod 接管;也就是说,容器集定义(或镜像)中提供的用户和组 ID 被应用到实际的物理块设备。通常,块存储不被共享。

在以下 pod 定义片段中显示了 fsGroup 定义:

kind: Pod
...
spec:
  containers:
  - name: ...
  securityContext: 1
    fsGroup: 5555 2
  ...
1
supplementalGroups 一样,fsGroup 必须全局定义到 pod,而不是每个容器。
2
5555 将成为卷组组权限以及卷中创建的所有新文件的组 ID。

supplementalGroups 一样,以上 Pod 中的所有容器(假设匹配的 SCC 或项目允许组 5555)将成为组 5555 的成员,并且有权访问块卷,而不管容器的用户 ID 是什么。如果 pod 与 restricted SCC 匹配,它的 fsGroup 策略是 MustRunAs,则 pod 将运行失败。但是,如果 SCC 的 fsGroup 策略设为 RunAsAny,则将接受任何 fsGroup ID(包括 5555)。请注意,如果 SCC 的 fsGroup 策略设置为 RunAsAny,并且未指定 fsGroup ID,则不会发生块存储的"接管",则将拒绝该 Pod 的权限。

fsGroups 和 Custom SCCs

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

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

最好创建新 SCC,而不修改预定义的 SCC,或更改预定义项目中允许的 ID 范围。

请考虑以下片段的新 SCC 定义:

# oc get -o yaml --export scc new-scc
...
kind: SecurityContextConstraints
...
fsGroup:
  type: MustRunAs 1
  ranges: 2
  - max: 6000
    min: 5000 3
...
1
MustRunAs 触发组 ID 范围检查,而 RunAsAny 不需要范围检查。
2
允许的组 ID 范围是 5000 到,包括 5999。支持多个范围,但不支持使用。这里允许的组 ID 范围为 5000 到 5999,默认的 fsGroup 为 5000。
3
最小值(或整个范围)可以从 SCC 省略,因此范围检查和生成默认值将推迟到项目的 openshift.io/sa.scc.supplemental-groups 范围。fsGroupsupplementalGroups 在项目中使用相同的 group 字段,因此没有 fsGroup 的范围。

当上方所示的 pod 针对这个新 SCC 运行(假定为 course),pod 与新 SCC 匹配时,它将会启动,因为 Pod 定义中提供的组 5555 受到自定义 SCC 的限制。另外,pod 会"接管"块设备,因此当 pod 之外的进程查看块存储时,它实际上将具有 5555 作为其组 ID。

支持块所有权的卷列表包括:

  • AWS Elastic Block Store
  • OpenStack Cinder
  • Ceph RBD
  • GCE Persistent Disk
  • iSCSI
  • emptyDir
注意

此列表可能不完整。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.