zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    window.parent 、window.top及window.self 详解
    js中的变量提升和函数提升
    IE不支持ES6语法的解决方案——Babel
    JavaScript 文件拖拽上传插件 dropzone.js 介绍
    C# DataTable 增加行与列
    group by 与 order by 一起使用的时候
    window.open传递多个参数
    Jquery EasyUI tree 的异步加载(遍历指定文件夹,根据文件夹内的文件生成tree)
    ASP.NET中调用百度地图API
    C# 读取Excel中的数据到DataTable中
  • 原文地址:https://www.cnblogs.com/jinyuanliu/p/11244876.html
Copyright © 2011-2022 走看看