使用 QEMU 原生 TLS 进行安全实时迁移

背景

nova 的 libvirt.live_migration_tunnelled 提供的加密并不能保护 nova 实例的所有不同迁移流,即:客户机 RAM、设备状态和磁盘(在使用非共享存储时)。此外,“通过 libvirtd 进行隧道传输” 存在固有的局限性:(a) 它无法处理非共享存储设置中磁盘的实时迁移(也称为“块迁移”);以及 (b) 由于源主机和目标主机上数据复制次数增加,导致巨大的性能开销和延迟,从而消耗更多的 CPU 和内存带宽。

为了解决此现有限制,QEMU 和 libvirt 已获得(请参阅 下方 获取版本详细信息)对“原生 TLS”的支持,即内置于 QEMU 中的 TLS。这将保护所有数据传输,包括不在共享存储上的磁盘,而不会产生“通过 libvirtd 隧道传输”传输的限制。

为了利用 QEMU 和 libvirt 中的“原生 TLS”支持,nova 引入了新的配置属性 libvirt.live_migration_with_native_tls

先决条件

  1. 版本要求:此功能需要至少 libvirt 4.4.0 和 QEMU 2.11。

  2. 必须在所有相关的计算节点上“正确”配置预配置的 TLS 环境——即 CA、服务器和客户端证书、其文件权限等。(通常由安装工具配置)。为了简化您的 PKI(公钥基础设施)设置,请使用处理所有证书生命周期管理的部署工具。例如,请参阅 TripleO 项目的“TLS 无处不在”指南。

  3. 所有相关计算节点的无密码 SSH 设置。

  4. 在所有相关计算节点上,确保 /etc/libvirt/qemu.conf 中的 TLS 相关配置属性已就位

    default_tls_x509_cert_dir = "/etc/pki/qemu"
    default_tls_x509_verify = 1
    

    如果尚未配置,请修改两个节点(ComputeNode1 和 ComputeNode2)上的 /etc/sysconfig/libvirtd 以监听 TCP/IP 连接

    LIBVIRTD_ARGS="--listen"
    

    然后,重新启动 libvirt 守护进程(也在两个节点上)

    $ systemctl restart libvirtd
    

    请参阅“相关信息”部分,了解有关 /etc/libvirt/qemu.conf 中其他 TLS 相关配置属性的说明。

验证计算节点上的 TLS 环境

假设您有两个计算主机(ComputeNode1ComputeNode2),在两个节点上运行 virt-pki-validate 工具(来自您的 Linux 发行版上的 libvirt-client 包)以确保已配置所有必要的 PKI 文件

[ComputeNode1]$ virt-pki-validate
Found /usr/bin/certtool
Found CA certificate /etc/pki/CA/cacert.pem for TLS Migration Test
Found client certificate /etc/pki/libvirt/clientcert.pem for ComputeNode1
Found client private key /etc/pki/libvirt/private/clientkey.pem
Found server certificate /etc/pki/libvirt/servercert.pem for ComputeNode1
Found server private key /etc/pki/libvirt/private/serverkey.pem
Make sure /etc/sysconfig/libvirtd is setup to listen to
TCP/IP connections and restart the libvirtd service

[ComputeNode2]$ virt-pki-validate
Found /usr/bin/certtool
Found CA certificate /etc/pki/CA/cacert.pem for TLS Migration Test
Found client certificate /etc/pki/libvirt/clientcert.pem for ComputeNode2
Found client private key /etc/pki/libvirt/private/clientkey.pem
Found server certificate /etc/pki/libvirt/servercert.pem for ComputeNode2
Found server private key /etc/pki/libvirt/private/serverkey.pem
Make sure /etc/sysconfig/libvirtd is setup to listen to
TCP/IP connections and restart the libvirtd service

执行迁移

  1. 在所有相关计算节点上,启用配置属性 libvirt.live_migration_with_native_tls 并将配置属性 libvirt.live_migration_scheme 设置为 tls

    [libvirt]
    live_migration_with_native_tls = true
    live_migration_scheme = tls
    

    注意

    同时设置 libvirt.live_migration_with_native_tlslibvirt.live_migration_tunnelled 是无效的(并且不允许)。

    注意

    未将 libvirt.live_migration_scheme 设置为 tls 将导致 libvirt 使用未加密的 TCP 连接,而不会在日志中显示任何错误或警告。

    然后重新启动 nova-compute 服务

    $ systemctl restart openstack-nova-compute
    
  2. 现在所有 TLS 相关配置都已就位,从 ComputeNode1 迁移客户机(无论是否使用共享存储)到 ComputeNode2。请参阅 实时迁移实例 文档,了解有关实时迁移的详细信息。