說明
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