跳转到: 导航, 搜索

OSSN/OSSN-0007

活迁移说明建议使用不安全的 libvirt 远程访问

总结

在使用 OpenStack Compute 节点上的 KVM hypervisor 时,从一台 Compute 服务器到另一台 Compute 服务器的实例活迁移需要配置 libvirt daemon 以进行远程网络连接。OpenStack 配置参考手册中推荐的 libvirt daemon 配置会将 libvirtd 配置为侦听所有网络接口上的传入 TCP 连接,而无需任何身份验证或使用任何加密。这种不安全的配置允许具有 OpenStack Compute 节点上 libvirt daemon TCP 端口网络访问权限的任何人通过 libvirt API 控制 hypervisor。

受影响的服务 / 软件

Nova, Compute, KVM, libvirt, Grizzly, Havana, Icehouse

讨论

libvirt daemon 的默认配置是不允许远程访问。在 OpenStack Compute 节点之间运行实例的活迁移需要 OpenStack Compute 节点之间的 libvirt daemon 远程访问。

libvirt daemon 不应配置为允许未经身份验证的远程访问。libvirt daemon 有 4 种安全的 TCP 远程访问选项:

  • 通过 SSH 隧道连接到 libvirtd 的 UNIX socket
  • libvirtd TCP socket,使用 GSSAPI/Kerberos 进行身份验证和数据加密
  • libvirtd TCP socket,使用 TLS 进行加密和 x.509 客户端证书进行身份验证
  • libvirtd TCP socket,使用 TLS 进行加密和 Kerberos 进行身份验证

libvirt daemon 无需侦听所有接口上的远程 TCP 连接。应尽可能限制 libvirt daemon 的远程网络连接。远程访问只需要在 OpenStack Compute 节点之间,因此 libvirt daemon 只需要侦听用于此通信的接口上的远程 TCP 连接。可以配置防火墙来锁定对 libvirt daemon 侦听的 TCP 端口的访问,但这不足以保护对 libvirt API 的访问。远程 OpenStack Compute 节点上的其他进程可能具有网络访问权限,但不应被授权远程控制另一个 OpenStack Compute 节点上的 hypervisor。

建议的操作

如果您在 OpenStack Compute 节点上使用 KVM hypervisor 和 libvirt,则应检查您的 libvirt daemon 配置,以确保它不允许未经身份验证的远程访问。

通过 "listen_tls"、"listen_tcp" 和 "auth_tcp" 配置指令配置通过 TCP 进行远程访问的 libvirt daemon。默认情况下,这些指令都已注释掉。这将导致通过 TCP 进行远程访问被禁用。

如果您不需要远程 libvirt daemon 访问,则应确保在 /etc/libvirt/libvirtd.conf 配置文件中将以下配置指令设置为如下所示。注释掉这些指令将产生相同效果,因为这些值与内部默认值匹配

listen_tls = 1
listen_tcp = 0
auth_tcp = "sasl"

如果您需要在 OpenStack Compute 节点之间允许远程访问 libvirt daemon 以进行活迁移,则应确保需要身份验证。此外,您应考虑启用 TLS 以允许远程连接进行加密。

以下 libvirt daemon 配置指令将允许使用 SASL 进行身份验证的未加密远程连接

listen_tls = 0
listen_tcp = 1
auth_tcp = "sasl"

如果您想要求 TLS 加密的远程连接,您将需要获取 X.509 证书并配置 libvirt daemon 以使用它们来使用 TLS。有关此配置的详细信息,请参阅 libvirt daemon 文档。配置证书后,您应设置以下 libvirt daemon 配置指令

listen_tls = 1
listen_tcp = 0
auth_tls = "none"

在使用 TLS 时,将 "auth_tls" 配置指令设置为 "none" 将使用 X.509 客户端证书进行身份验证。您还可以通过设置以下 libvirt daemon 配置指令来要求 SASL 身份验证

listen_tls = 1
listen_tcp = 0
auth_tls = "sasl"

在使用 TLS 时,还需要配置 OpenStack Compute 节点以使用非默认的 URI 进行活迁移。这可以通过在 /etc/nova/nova.conf 中设置以下配置指令来完成

live_migration_uri=qemu+tls://%s/system

有关 libvirt daemon 远程 URI 格式的更多详细信息,请参阅以下 libvirt daemon 文档

有关配置 SASL 身份验证和 libvirt daemon 的 X.509 证书的详细信息,请参阅以下位置的 libvirt daemon 文档

在配置 libvirt daemon 进行身份验证时,同样重要的是配置授权以限制对 OpenStack Compute 节点的远程访问。例如,如果您没有配置授权,则由您的颁发 CA 签名的任何 X.509 客户端证书都将被允许访问。当使用 SASL/GSSAPI 进行 Kerberos 身份验证时,具有有效 TGT 的任何客户端都将被授予访问权限。缺乏授权可能允许意外的远程访问。应查阅 libvirt daemon 文档以获取有关配置授权的详细信息。

除了要求对 OpenStack Compute 节点上 libvirt daemon 的远程访问进行身份验证外,还建议限制网络访问,以便仅允许 Compute 节点之间的连接。

首先要做的是限制 libvirt daemon 侦听远程连接的网络接口。默认情况下,当启用远程访问时,libvirt daemon 侦听所有接口。可以通过在 /etc/libvirt/libvirtd.conf 中设置以下配置指令来限制此设置

listen_addr = <IP address or hostname>

libvirt daemon 中的迁移还会默认使用一系列临时端口。这些临时端口上的连接未经过身份验证或加密。可以将迁移流量通过常规 libvirt daemon 远程访问端口进行隧道传输,这将使用您为该端口定义的身份验证和加密设置。建议这样做以提供额外的安全性。要启用迁移流量的隧道传输,您必须告诉 OpenStack Compute 节点为活迁移设置 VIR_MIGRATE_TUNNELLED 标志。这可以通过在 /etc/nova/nova.conf 中设置以下指令来完成

live_migration_flag=VIR_MIGRATE_UNDEFINE_SOURCE, VIR_MIGRATE_PEER2PEER, VIR_MIGRATE_TUNNELLED

上述描述的迁移流量隧道传输不适用于活块迁移。活块迁移目前只能通过临时端口进行。

如果您选择使用临时迁移端口,您需要注意一些事项。不幸的是,在 libvirt 版本 1.1.4 之前,无法限制这些临时端口将侦听的网络接口。如果您正在运行 libvirt daemon 的 1.1.4 或更高版本,则可以在 /etc/libvirt/qemu.conf 中设置以下指令来指定用于临时迁移端口的接口

migration_address = <IP address>

同样建议配置每个 OpenStack Compute 节点上的防火墙,以仅允许其他 Compute 节点访问用于远程访问 libvirt daemon 的端口。默认情况下,TLS 为 16514,未加密 TCP 为 16509。

此外,通过临时端口进行的迁移使用端口范围 49152-49215。如果您选择不通过 libvirt daemon 远程访问端口对迁移流量进行隧道传输,则需要允许 OpenStack Compute 节点相互通信这些端口。

您可以查看 libvirt daemon 配置的端口,方法是查看以下配置指令

 tls_port (libvirtd.conf)
 tcp_port (libvirtd.conf)
 migration_port_min (qemu.conf)
 migration_port_max (qemu.conf)

如果您正在运行 libvirt daemon 的旧版本(低于 1.1.4),并且想要执行活块迁移,则需要允许 OpenStack Compute 节点在端口范围 5900-49151 上进行通信。如果您正在运行 libvirt daemon 的 1.1.4 或更高版本,则常规临时迁移端口范围将用于活块迁移。

请参阅防火墙软件的文档,以获取有关配置适当防火墙规则的说明。

联系方式 / 参考文献