使用 rootwrap

Rootwrap 允许非特权用户安全地以 root 用户身份运行 Compute 操作。Compute 之前使用 sudo 来实现此目的,但维护起来很困难,并且不允许高级过滤。 rootwrap 命令取代了 Compute 中的 sudo

要使用 rootwrap,请在 Compute 命令前加上 nova-rootwrap。例如

$ sudo nova-rootwrap /etc/nova/rootwrap.conf command

一个通用的 sudoers 条目允许 Compute 用户以 root 身份运行 nova-rootwrapnova-rootwrap 代码在其配置文件中查找过滤器定义目录,并从中加载命令过滤器。然后,它检查 Compute 请求的命令是否与其中一个过滤器匹配,如果是,则执行该命令(以 root 身份)。如果没有过滤器匹配,则拒绝该请求。

注意

请注意在使用 NFS 和 root 拥有的文件时可能存在问题。为了使 rootwrap 正常工作,NFS 共享必须配置为启用 no_root_squash 选项。

Rootwrap 完全由 root 用户控制。root 用户拥有 sudoers 条目,该条目允许 Compute 以 root 身份运行特定的 rootwrap 可执行文件,并且仅使用特定的配置文件(该配置文件也应由 root 拥有)。 nova-rootwrap 命令从清理过的、系统默认的 PYTHONPATH 导入它需要的 Python 模块。root 拥有的配置文件指向 root 拥有的过滤器定义目录,其中包含 root 拥有的过滤器定义文件。这个链条确保 Compute 用户本身无法控制 nova-rootwrap 可执行文件使用的配置或模块。

配置 rootwrap

rootwrap.conf 文件中配置 rootwrap。由于它位于受信任的安全路径中,因此必须仅由 root 用户拥有和可写。 rootwrap_config=entry 参数指定 sudoers 条目和 nova.conf 配置文件中的文件位置。

rootwrap.conf 文件使用带有以下部分和参数的 INI 文件格式

rootwrap.conf 配置选项

配置选项=默认值

(类型) 描述

[DEFAULT] filters_path=/etc/nova/rootwrap.d,/usr/share/nova/rootwrap

(ListOpt) 包含过滤器定义文件的目录的逗号分隔列表。定义 rootwrap 过滤器存储的位置。此行定义的目录都应存在,并且只能由 root 用户拥有和可写。

如果 root 包装器未正确执行,可以在 nova.conf 配置文件中添加一个解决方法选项。此解决方法会将 root 包装器配置重新配置为回退到以 sudo 运行命令,这是 Kilo 版本的特性。

将此解决方法包含在您的配置文件中,可以保护您的环境免受可能损害 root 包装器性能的问题影响。例如,影响 Python Build Reasonableness (PBR) 的工具更改是一个已知问题,会影响 root 包装器性能。

要设置此解决方法,请在 nova.conf 配置文件的 [workaround] 部分中配置 disable_rootwrap 选项。

过滤器定义文件包含 rootwrap 将用于允许或拒绝特定命令的过滤器的列表。它们通常以 .filters 为后缀。由于它们位于受信任的安全路径中,因此它们需要只能由 root 用户拥有和可写。它们的位置在 rootwrap.conf 文件中指定。

过滤器定义文件使用带有 [Filters] 部分和多行的 INI 文件格式,每行都有一个唯一的参数名称,该名称应与您定义的每个过滤器不同

过滤器配置选项

配置选项=默认值

(类型) 描述

[Filters] filter_name=kpartx: CommandFilter, /sbin/kpartx, root

(ListOpt) 逗号分隔的列表,包含要使用的过滤器类,后跟过滤器参数(具体取决于所选的过滤器类)。

配置 rootwrap 守护进程

管理员可以使用 rootwrap 守护进程支持,而不是使用 sudo 运行 rootwrap。rootwrap 守护进程减少了使用 sudo 运行 oslo.rootwrap 产生的开销和性能损失。每次需要 rootwrap 权限的调用都需要一个新的 rootwrap 实例。守护进程可以防止重复调用造成的开销。但是,守护进程不支持长期运行的进程。

要启用 rootwrap 守护进程,请在 Compute 服务配置文件中将 use_rootwrap_daemon 设置为 True