libvirt-qemu-TLS加密虚拟机传输实例分析
说明
TLS(Transport Layer Security Protocol),即安全传输层协议,其核心是加密两台计算机之间的通信。
libvirt中使用TLS,可以实现libvirt的安全加密。可以保证数据传输的安全性、完整性。
OpenStack环境中,Libvirt默认采用TCP方式,会监听16509端口。这种方式是不安全的,因此建议采用TLS安全连接的方式。配置TLS最重要的步骤,是证书的生成及管理。证书的生成可以在任意节点进行。
证书的生成
证书的生成主要有以下几步:
生成中央证书颁发机构证书。只需生成一次,所有节点的服务端证书及客户端证书,均基于此生成。
生成服务端证书及私钥。每个计算节点均需要配置与该计算节点对应的服务端证书及私钥,需生成多次。
生成客户端证书及私钥。每个计算节点均需要配置与该计算节点对应的客户端证书及私钥,需生成多次。
证书分发。需将中央证书颁发机构证书、与计算节点对应的服务端证书与私钥、与计算节点对应的客户端证书与私钥,分别复制到对应的计算节点目录上。
证书生成工具安装,很多服务器默认已经安装
yum install gnutls-utils
CA证书生成
mkdir /root/pki
cd /root/pki #将密钥保存到cakey.pem中
certtool --generate-privkey > cakey.pem vi ca.info cn = inspur
ca
cert_signing_key
expiration_days = 700
#注意这里的的cn填写你组织的名字(Name of your organization)
#然后这里的expiration_days填写证书过期的日期,如果没有的话默认是1年的期限 #开始生成ca文件
certtool --generate-self-signed --load-privkey cakey.pem --template ca.info --outfile cacert.pem
现在目录下有了两个文件
cakey.pem - CA的私钥文件(注意保护这个文件)
cacert.pem - CA的公钥文件(公钥公钥就是大家都可以看的那种)
服务端证书生成
certtool --generate-privkey > node02_serverkey.pem vi node02_server.info organization = inspur
cn = node02
ip_address = 100.7.34.23
tls_www_server
encryption_key
signing_key
expiration_days = 700 #organization还是填写你的组织名字
#cn呢如果是公网就填域名,不是的话就是写你KVM服务器的hostname,hostname用命令hostname查看
#ip_address写你的kvm服务器的IP地址
#expiration_days和上面一样 #注册证书
certtool --generate-certificate --load-privkey node02_serverkey.pem \
--load-ca-certificate cacert.pem --load-ca-privkey cakey.pem \
--template node02_server.info --outfile node02_servercert.pem
客户端证书
certtool --generate-privkey > node02_clientkey.pem vi node02_client.info country = CN
state = JN
locality = JN
organization = inspur
cn = node02
tls_www_server
encryption_key
signing_key
expiration_days = 700 certtool --generate-certificate --load-privkey node02_clientkey.pem \
--load-ca-certificate cacert.pem --load-ca-privkey cakey.pem \
--template node02_client.info --outfile node02_clientcert.pem
证书分发
模板是node1_client.info的就分发到co-dev-node1服务器,如果生成多个计算节点证书,每个计算节点分发包括服务端和客户端证书,CA证书是同一个。
mkdir -p /etc/pki/libvirt/private
chmod 755 /etc/pki/libvirt/
chmod 750 /etc/pki/libvirt/private 分发ca证书
scp cacert.pem @node03:/etc/pki/CA
chmod 444 /etc/pki/CA/cacert.pem 分发服务端证书
scp -p node03_servercert.pem @node03:/etc/pki/libvirt/servercert.pem
scp -p node03_serverkey.pem @node03:/etc/pki/libvirt/private/serverkey.pem
chgrp qemu /etc/pki/libvirt \
/etc/pki/libvirt/servercert.pem \
/etc/pki/libvirt/private \
/etc/pki/libvirt/private/serverkey.pem chmod 440 /etc/pki/libvirt/servercert.pem
chmod 440 /etc/pki/libvirt/private/serverkey.pem 分发客户端证书
scp -p node03_clientcert.pem @node03:/etc/pki/libvirt/clientcert.pem
scp -p node03_clientkey.pem @node03:/etc/pki/libvirt/private/clientkey.pem chmod 400 /etc/pki/libvirt/clientcert.pem
chmod 400 /etc/pki/libvirt/private/clientkey.pem
libvirtd配置
修改/etc/libvirt/libvirtd.conf 参数
listen_tcp = 1
listen_tls = 1 #开启
tls_port = "16514" #端口可以不写,不写默认为16514
auth_tcp = "none"
log_level = 3
log_outputs = "3:file:/var/log/kolla/libvirt/libvirtd.log"
listen_addr = "100.2.30.241"
tcp_port = "16509"
host_uuid = "8148c199-01a8-57e4-85f8-50ad834b79f0"
key_file = "/etc/pki/libvirt/private/serverkey.pem" #证书路径
cert_file = "/etc/pki/libvirt/servercert.pem" #证书路径
ca_file = "/etc/pki/CA/cacert.pem" #证书路径
改完重启libvirt服务
虚拟机迁移
测试一下证书的可用性
virsh -c qemu+tls://node32/system hostname
p2p的tls通道测试虚拟机在不同的主机间迁移
virsh migrate --p2p --tunnelled instance-0000000e qemu+tls://node32/system
p2p原生迁移
virsh migrate --p2p instance-00000001 qemu+tcp://100.2.30.242/system
libvirt客户端向libvirtd服务端的原生迁移
virsh migrate instance-00000001 qemu+tcp://100.2.30.242/system
virsh migrate instance-00000001 qemu+tls://node241/system
报错处理
(1)
(nova-libvirt)[root@node03 /]# virsh migrate --p2p --tunnelled instance-00000005 qemu+tls://node02/system
error: Unable to pre-create chardev file '/var/lib/nova/instances/2105158c-94f2-4c4f-8f26-a211acdd7dd9/console.log': No such file or directory
目标端创建该文件夹
(2)
(nova-libvirt)[root@node03 2105158c-94f2-4c4f-8f26-a211acdd7dd9]# virsh migrate --p2p --tunnelled instance-00000005 qemu+tls://node02/system
error: Cannot get interface MTU on 'qbrd0f61f69-2e': No such device
目标端创建该网桥,brctl addbr qbrd0f61f69-2e
(3)
error: internal error: process exited while connecting to monitor: 2019-07-25T02:45:24.440142Z qemu-kvm: -chardev pty,id=charserial0,
logfile=/var/lib/nova/instances/0e4f2c37-b9ba-43f5-ac6c-9a0594caaebe/console.log,logappend=off: Unable to open logfile /var/lib/nova/instances/0e4f2c37-b9ba-43f5-ac6c-9a0594caaebe/console.log: Permission denied
openstack环境,可能路径的权限不对,看看是不是需要改成nova
libvirt-qemu-TLS加密虚拟机传输实例分析的更多相关文章
- MQTT TLS 加密传输
MQTT TLS 加密传输 Mosquitto原生支持了TLS加密,TLS(传输层安全)是SSL(安全套接层)的新名称,生成证书后再配置一下MQTT代理,本文主要介绍Mqtt如何实现双向认证和单向认证 ...
- OutOfMemoryError/OOM/内存溢出异常实例分析--虚拟机栈和本地方法栈溢出
关于虚拟机栈和本地方法栈,在JVM规范中描述了两种异常: 1.如果线程请求的栈深度大于JVM所允许的深度,将抛出StackOverflowError异常: 2.如果虚拟机在扩展栈时无法申请到足够的内存 ...
- 干货分享: 长达250页的Libvirt Qemu KVM的ppt,不实验无真相
下载地址:Libvirt Qemu KVM 教程大全 http://files.cnblogs.com/popsuper1982/LibvirtQemuKVM.pptx 1. 概论 1.1 虚拟化的基 ...
- KVM 介绍(8):使用 libvirt 迁移 QEMU/KVM 虚机和 Nova 虚机 [Nova Libvirt QEMU/KVM Live Migration]
学习 KVM 的系列文章: (1)介绍和安装 (2)CPU 和 内存虚拟化 (3)I/O QEMU 全虚拟化和准虚拟化(Para-virtulizaiton) (4)I/O PCI/PCIe设备直接分 ...
- 识别TLS加密恶意流量
利用背景流量数据(contexual flow data)识别TLS加密恶意流量 识别出加密流量中潜藏的安全威胁具有很大挑战,现已存在一些检测方法利用数据流的元数据来进行检测,包括包长度和到达间隔时间 ...
- libvirt/qemu特性之numa
博客地址:http://blog.csdn.net/halcyonbaby 内容系本人学习.研究和总结,如有雷同,实属荣幸! Numa 查看主机node情况 使用virsh命令查看 virsh # c ...
- 利用背景流量数据(contexual flow data) 识别TLS加密恶意流量
识别出加密流量中潜藏的安全威胁具有很大挑战,现已存在一些检测方法利用数据流的元数据来进行检测,包括包长度和到达间隔时间等.来自思科的研究人员扩展现有的检测方法提出一种新的思路(称之为“dataomni ...
- RPC原理及RPC实例分析
在学校期间大家都写过不少程序,比如写个hello world服务类,然后本地调用下,如下所示.这些程序的特点是服务消费方和服务提供方是本地调用关系. 1 2 3 4 5 6 public class ...
- 用实例分析H264 RTP payload
用实例分析H264 RTP payload H264的RTP中有三种不同的基本负载(Single NAL,Non-interleaved,Interleaved) 应用程序可以使用第一个字节来识别. ...
随机推荐
- QT父子窗口事件传递与事件过滤器(讲了一些原理,比较清楚)
处理监控系统的时候遇到问题,在MainWidget中创建多个子Widget的时候,原意是想鼠标点击先让MainWidget截获处理后再分派给子Widget去处理,但调试后发现如果子Widget重新实现 ...
- QT中的SOCKET编程
转自:http://mylovejsj.blog.163.com/blog/static/38673975200892010842865/ QT中的SOCKET编程 2008-10-07 23:13 ...
- .NET错误:未找到类型或命名空间名称
现象:编译项目时提示未找到类型或命名空间名称"... " 解决方法:如果是未找到类型,检查是否引用了类型所在的命名空间,使用using指令:如果是未找到命名空间,那么检查是否引用了 ...
- 线性表List
数组array是基本的数据结构,但它的功能有限,线性表list可以认为是扩展了功能的数组.可以自动调整大小.添加和删除元素不需要其他元素移位. 根据指针数量和指向的不同,线性表分为单向链表.双向链表和 ...
- 高并发 Nginx+Lua OpenResty系列(4)——Lua 模块开发
在实际开发中,不可能把所有代码写到一个大而全的lua文件中,需要进行分模块开发:而且模块化是高性能Lua应用的关键.使用require第一次导入模块后,所有Nginx 进程全局共享模块的数据和代码,每 ...
- Netty源码分析--初始化Options,添加处理器(四)
接上篇,我们继续进入AbstractBootstrap类的 initAndRegister() 方法 进入init()方法 设置父级Channel的options, 进入到上节提到的NioServer ...
- Mybatis_three
延迟加载 实现多对一的延迟加载(association) 例如下面的:有很多个账户信息(招商\工商\农商)是属于一个用户人的 [需求] 查询账户(Account)信息并且关联查询用户(User)信息. ...
- Programming In Lua 第四章
1, 2, 3, 4, 5, 6, 7,
- Win32小游戏--蜘蛛纸牌
前一段时间完成了蜘蛛纸牌的仿写,现将过程和思路记录下来 首先,为了符合复用性,在win32的基本框架中,把可变的部分用c++封装起来成为一系列虚函数,这样如果再继续写游戏的话,只需要继承这个类就可以了 ...
- java虚拟机-程序计数器PC Register
什么是程序计数器? 程序计数器是一块 较小 的内存空间,它可以看做是当前线程所执行的字节码的 行号指示器 :在虚拟机的概念模型里(仅仅是概念模型,各种虚拟机可能会通过一些更高效的方式去实现),字节码解 ...