×

了解 OpenShift 虚拟化安全和授权。

要点
  • OpenShift Virtualization 遵循restricted Kubernetes Pod 安全标准 配置文件,旨在强制执行当前最佳的 Pod 安全实践。

  • 虚拟机 (VM) 工作负载作为非特权 Pod 运行。

  • 安全上下文约束 (SCC) 为kubevirt-controller 服务帐户定义。

  • OpenShift Virtualization 组件的 TLS 证书会自动更新和轮换。

关于工作负载安全

默认情况下,虚拟机 (VM) 工作负载在 OpenShift Virtualization 中不会以 root 权限运行,并且没有需要 root 权限的支持的 OpenShift Virtualization 功能。

对于每个 VM,virt-launcher Pod 以会话模式运行libvirt 的一个实例来管理 VM 进程。在会话模式下,libvirt守护进程作为非 root 用户帐户运行,并且仅允许来自以相同用户标识符 (UID) 运行的客户端的连接。因此,VM 作为非特权 Pod 运行,遵守最小权限的安全原则。

TLS 证书

OpenShift Virtualization 组件的 TLS 证书会自动更新和轮换。您无需手动刷新它们。

自动更新计划

TLS 证书会根据以下计划自动删除和替换

  • KubeVirt 证书每天更新一次。

  • 容器化数据导入器控制器 (CDI) 证书每 15 天更新一次。

  • MAC 池证书每年更新一次。

自动 TLS 证书轮换不会中断任何操作。例如,以下操作将继续运行而不会中断

  • 迁移

  • 镜像上传

  • VNC 和控制台连接

授权

OpenShift Virtualization 使用基于角色的访问控制 (RBAC) 来定义人员用户和服务帐户的权限。为服务帐户定义的权限控制 OpenShift Virtualization 组件可以执行的操作。

您还可以使用 RBAC 角色来管理用户对虚拟化功能的访问。例如,管理员可以创建一个 RBAC 角色,该角色提供启动虚拟机所需的权限。然后,管理员可以通过将角色绑定到特定用户来限制访问。

OpenShift Virtualization 的默认集群角色

通过使用集群角色聚合,OpenShift Virtualization 将 AWS 上默认的 Red Hat OpenShift 服务集群角色扩展到包括访问虚拟化对象的权限。

表 1. OpenShift Virtualization 集群角色
默认集群角色 OpenShift Virtualization 集群角色 OpenShift Virtualization 集群角色描述

查看

kubevirt.io:view

可以查看集群中所有 OpenShift Virtualization 资源但不能创建、删除、修改或访问它们的用户的角色。例如,用户可以看到虚拟机 (VM) 正在运行,但无法将其关闭或访问其控制台。

编辑

kubevirt.io:edit

可以修改集群中所有 OpenShift Virtualization 资源的用户角色。例如,用户可以创建 VM、访问 VM 控制台和删除 VM。

管理员

kubevirt.io:admin

对所有 OpenShift Virtualization 资源具有完全权限的用户角色,包括删除资源集合的能力。用户还可以查看和修改 OpenShift Virtualization 运行时配置,该配置位于openshift-cnv 命名空间中的HyperConverged 自定义资源中。

OpenShift Virtualization 中存储功能的 RBAC 角色

以下权限授予容器化数据导入器 (CDI),包括cdi-operatorcdi-controller 服务帐户。

集群范围的 RBAC 角色

表 2. cdi.kubevirt.io API 组的聚合集群角色
CDI 集群角色 资源 动词

cdi.kubevirt.io:admin

datavolumes, uploadtokenrequests

* (所有)

datavolumes/source

创建

cdi.kubevirt.io:edit

datavolumes, uploadtokenrequests

*

datavolumes/source

创建

cdi.kubevirt.io:view

cdiconfigs, dataimportcrons, datasources, datavolumes, objecttransfers, storageprofiles, volumeimportsources, volumeuploadsources, volumeclonesources

get, list, watch

datavolumes/source

创建

cdi.kubevirt.io:config-reader

cdiconfigs, storageprofiles

get, list, watch

表 3. cdi-operator 服务帐户的集群范围角色
API 组 资源 动词

rbac.authorization.k8s.io

clusterrolebindings, clusterroles

get, list, watch, create, update, delete

security.openshift.io

securitycontextconstraints

get, list, watch, update, create

apiextensions.k8s.io

customresourcedefinitions, customresourcedefinitions/status

get, list, watch, create, update, delete

cdi.kubevirt.io

*

*

upload.cdi.kubevirt.io

*

*

admissionregistration.k8s.io

validatingwebhookconfigurations, mutatingwebhookconfigurations

create, list, watch

admissionregistration.k8s.io

validatingwebhookconfigurations

允许列表:cdi-api-dataimportcron-validate, cdi-api-populator-validate, cdi-api-datavolume-validate, cdi-api-validate, objecttransfer-api-validate

get, update, delete

admissionregistration.k8s.io

mutatingwebhookconfigurations

允许列表:cdi-api-datavolume-mutate

get, update, delete

apiregistration.k8s.io

apiservices

get, list, watch, create, update, delete

表 4. cdi-controller 服务帐户的集群范围角色
API 组 资源 动词

"" (核心)

events

create, patch

"" (核心)

persistentvolumeclaims

get, list, watch, create, update, delete, deletecollection, patch

"" (核心)

persistentvolumes

get, list, watch, update

"" (核心)

persistentvolumeclaims/finalizers, pods/finalizers

更新

"" (核心)

pods, services

get, list, watch, create, delete

"" (核心)

configmaps

get, create

storage.k8s.io

storageclasses, csidrivers

get, list, watch

config.openshift.io

proxies

get, list, watch

cdi.kubevirt.io

*

*

snapshot.storage.k8s.io

volumesnapshots, volumesnapshotclasses, volumesnapshotcontents

get, list, watch, create, delete

snapshot.storage.k8s.io

volumesnapshots

update, deletecollection

apiextensions.k8s.io

customresourcedefinitions

get, list, watch

scheduling.k8s.io

priorityclasses

get, list, watch

image.openshift.io

imagestreams

get, list, watch

"" (核心)

secrets

创建

kubevirt.io

virtualmachines/finalizers

更新

命名空间 RBAC 角色

表 5. cdi-operator 服务帐户的命名空间角色
API 组 资源 动词

rbac.authorization.k8s.io

rolebindings, roles

get, list, watch, create, update, delete

"" (核心)

serviceaccounts, configmaps, events, secrets, services

get, list, watch, create, update, patch, delete

apps

deployments, deployments/finalizers

get, list, watch, create, update, delete

route.openshift.io

routes, routes/custom-host

get, list, watch, create, update

config.openshift.io

proxies

get, list, watch

monitoring.coreos.com

servicemonitors, prometheusrules

get, list, watch, create, delete, update, patch

coordination.k8s.io

leases

get, create, update

表 6. cdi-controller 服务帐户的命名空间角色
API 组 资源 动词

"" (核心)

configmaps

get, list, watch, create, update, delete

"" (核心)

secrets

get, list, watch

batch

cronjobs

get, list, watch, create, update, delete

batch

jobs

create, delete, list, watch

coordination.k8s.io

leases

get, create, update

networking.k8s.io

ingresses

get, list, watch

route.openshift.io

路由

get, list, watch

kubevirt-controller 服务账号的附加 SCC 和权限

安全上下文约束 (SCC) 控制 Pod 的权限。这些权限包括 Pod(容器集合)可以执行的操作以及可以访问的资源。您可以使用 SCC 来定义 Pod 必须具备才能被系统接受的一组条件。

virt-controller 是一个集群控制器,它为集群中的虚拟机创建 virt-launcher Pod。这些 Pod 的权限由 kubevirt-controller 服务账号授予。

kubevirt-controller 服务账号被授予额外的 SCC 和 Linux 功能,以便它能够创建具有适当权限的 virt-launcher Pod。这些扩展的权限允许虚拟机使用超出典型 Pod 范围的 OpenShift 虚拟化功能。

kubevirt-controller 服务账号被授予以下 SCC:

  • scc.AllowHostDirVolumePlugin = true
    这允许虚拟机使用 hostpath 卷插件。

  • scc.AllowPrivilegedContainer = false
    这确保 virt-launcher Pod 不以特权容器运行。

  • scc.AllowedCapabilities = []corev1.Capability{"SYS_NICE", "NET_BIND_SERVICE"}

    • SYS_NICE 允许设置 CPU 亲和性。

    • NET_BIND_SERVICE 允许 DHCP 和 Slirp 操作。

查看 kubevirt-controller 的 SCC 和 RBAC 定义

您可以使用 oc 工具查看 kubevirt-controllerSecurityContextConstraints 定义

$ oc get scc kubevirt-controller -o yaml

您可以使用 oc 工具查看 kubevirt-controller 集群角色的 RBAC 定义

$ oc get clusterrole kubevirt-controller -o yaml