Red Hat Training

A Red Hat training course is available for OpenShift Container Platform

27.18.6. SELinux 选项

privileged SCC 外,所有预定义的 SCC 都会将 seLinuxContext 设置为 MustRunAs。因此,最有可能与 Pod 要求匹配的 SCC 将强制 Pod 使用 SELinux 策略。Pod 使用的 SELinux 策略可以在 Pod 本身、在镜像、SCC 或项目中定义(提供默认值)。

SELinux 标签可以在 pod 的 securityContext.seLinuxOptions 部分中定义,并支持 user, role, type, 和 level:

注意

这一主题中可互换使用 level 和 MCS 标签。

...
 securityContext: 1
    seLinuxOptions:
      level: "s0:c123,c456" 2
...
1
可以为整个 pod 全局定义 级别,也可以针对每个容器单独定义。
2
SELinux 级别标签。

以下是来自 SCC 和 default 项目的片段:

$ oc get -o yaml --export scc scc-name
...
seLinuxContext:
  type: MustRunAs 1

# oc get -o yaml --export namespace default
...
metadata:
  annotations:
    openshift.io/sa.scc.mcs: s0:c1,c0 2
...
1
MustRunAs 会导致卷重新标记。
2
如果 Pod 或 SCC 中没有提供该标签,则默认来自项目。

privileged SCC 外,所有预定义的 SCC 都会将 seLinuxContext 设置为 MustRunAs。这会强制 pod 使用 MCS 标签,这些标签可以在容器集定义、镜像或作为默认定义中定义。

SCC 决定是否需要 SELinux 标签,并提供默认标签。如果 seLinuxContext 策略被设置为 MustRunAs,并且 pod(或镜像)没有定义标签,OpenShift Container Platform 默认为从 SCC 本身或从项目中选择的标签。

如果 seLinuxContext 设置为 RunAsAny,则不提供默认标签,容器决定了最终的标签。如果是 Docker,容器将使用唯一的 MCS 标签,该标签可能与现有存储挂载上的标签匹配。支持 SELinux 管理的卷将被重新标记,以便它们可以被指定标签访问,这取决于标签如何排除,只有该标签才可以被该标签访问。

这意味着,对于非特权容器的两个操作:

  • 卷被授予可由非特权容器访问的类型。这个类型通常是 Red Hat Enterprise Linux(RHEL)版本 7.5 及更新的版本中的 container_file_t。这个类型将卷视为容器内容。在以前的 RHEL 版本、RHEL 7.4、7.3 等中,为卷提供 svirt_sandbox_file_t 类型。
  • 如果指定了 级别,则卷使用给定的 MCS 标签标记。

要使卷可以被 pod 访问,pod 必须具有这两个卷类别。因此,使用 s0:c1,c2 的 pod 可以通过 s0:c1,c2 访问卷。所有 pod 都可以访问具有 s0 的卷。

如果 pod 出现故障,或者存储挂载因为权限错误而失败,则可能会 SELinux 强制中断。要检查这一点的一种方法是运行:

# ausearch -m avc --start recent

这会检查 AVC(Access Vector Cache)错误的日志文件。