使用 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。
先决条件¶
版本要求:此功能需要至少 libvirt 4.4.0 和 QEMU 2.11。
必须在所有相关的计算节点上“正确”配置预配置的 TLS 环境——即 CA、服务器和客户端证书、其文件权限等。(通常由安装工具配置)。为了简化您的 PKI(公钥基础设施)设置,请使用处理所有证书生命周期管理的部署工具。例如,请参阅 TripleO 项目的“TLS 无处不在”指南。
所有相关计算节点的无密码 SSH 设置。
在所有相关计算节点上,确保
/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 环境¶
假设您有两个计算主机(ComputeNode1 和 ComputeNode2),在两个节点上运行 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
执行迁移¶
在所有相关计算节点上,启用配置属性
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_tls和libvirt.live_migration_tunnelled是无效的(并且不允许)。注意
未将
libvirt.live_migration_scheme设置为tls将导致 libvirt 使用未加密的 TCP 连接,而不会在日志中显示任何错误或警告。然后重新启动
nova-compute服务$ systemctl restart openstack-nova-compute
现在所有 TLS 相关配置都已就位,从
ComputeNode1迁移客户机(无论是否使用共享存储)到ComputeNode2。请参阅 实时迁移实例 文档,了解有关实时迁移的详细信息。