1. 程式人生 > >玩轉KVM:TLS安全登錄

玩轉KVM:TLS安全登錄

server 重新 alt 順序 ins sasl 請求 重啟 正常

下面來講講KVM的安全知識,TLS?有什麽用?

libvirt怎麽遠程?

說TLS安全連接之前,我們需要先聊一下怎麽可以遠程管理KVM。 目前vmware, xen, kvm, lxc等都支持libvirt, libvirt的強大,然後根本不需要考慮怎麽遠程的問題。我們只需要考慮怎麽更好地遠程管理它。
技術分享圖片

TLS配置實踐

簡單的邏輯圖:
技術分享圖片

管理證書服務器

創建臨時目錄,以將文件和更改保存到其中
mkdir /opt/cert_files
cd cert_files/

使用 openssl 命令創建 2048 位 RSA 密鑰
openssl genrsa -out cakey.pem 2048

使用該密鑰針對本地 CA 創建自簽名證書


這裏參數: 按需修改:/C=CN/L=GDFS/O=EFLY/CN=KVM CA

字段如下:
技術分享圖片
技術分享圖片

檢查 CA 證書
openssl x509 -noout -text -in cacert.pem

##client, server
創建密鑰
openssl genrsa -out serverkey.pem 2048
openssl genrsa -out clientkey.pem 2048

為服務器創建證書簽名請求
openssl req -new -key serverkey.pem -out serverkey.csr \
-subj "/C=CN/O=EFLY/CN=${KVM}/dns_name=${KVM}/ip_addres={IP}"

可以使用配置文件形式實現 server.info:
技術分享圖片
技術分享圖片
openssl req -new -key serverkey.pem -out serverkey.csr \
-config server.info
為客戶機創建證書簽名請求
openssl req -new -key clientkey.pem -out clientkey.csr \
-subj "/C=CN/O=EFLY/OU=virtualization/CN=root"

創建客戶機和服務器證書
openssl x509 -req -days 3650 -in clientkey.csr -CA cacert.pem -CAkey cakey.pem \

-set_serial 1 -out clientcert.pem
openssl x509 -req -days 3650 -in serverkey.csr -CA cacert.pem -CAkey cakey.pem \
-set_serial 94345 -out servercert.pem

檢查密鑰
openssl rsa -noout -text -in clientkey.pem
openssl rsa -noout -text -in serverkey.pem

檢查證書
openssl x509 -noout -text -in clientcert.pem
openssl x509 -noout -text -in servercert.pem

路徑說明:
技術分享圖片

服務端(所有KVM角色)

mkdir -p /etc/pki/CA
將認證中心 (CA) 證書 cacert.pem 文件復制到 /etc/pki/CA/cacert.pem
scp [proxy_ip]:/opt/cert_files/cacert.pem /etc/pki/CA/cacert.pem

創建 /etc/pki/libvirt 目錄。將 servercert.pem 服務器證書文件復制到 /etc/pki/libvirt/servercert.pem。創建 /etc/pki/libvirt/private 目錄。將 serverkey.pem 服務器密鑰文件復制到 /etc/pki/libvirt/private/serverkey.pem 目錄。確保只有 root 用戶才能夠訪問專用密鑰。

mkdir /etc/pki/libvirt
scp [proxy_ip]:/opt/cert_files/servercert.pem /etc/pki/libvirt/.
mkdir /etc/pki/libvirt/private
scp [proxy_ip]:/opt/cert_files/serverkey.pem /etc/pki/libvirt/private/.
chmod -R o-rwx /etc/pki/libvirt/private

驗證這些文件是否已正確放置
find /etc/pki/CA/*|xargs ls -l
ls -lR /etc/pki/libvirt

##配置libvirt
生成 /etc/default/libvirtd 文件和 /etc/libvirt/libvirtd.conf 文件的副本。
編輯 /etc/default/libvirtd 文件
## Start libvirtd to handle qemu/kvm:
start_libvirtd="yes"

## options passed to libvirtd, add "-l" to listen on tcp
修改前

  • libvirtd_opts=""
    修改後
  • libvirtd_opts="-l"

編輯 /etc/libvirt/libvirtd.conf 文件,並在 libvirtd.conf 文件中使用 tls_allowed_dn_list 偽指令配置一組允許的主題。以下示例顯示原始文件中的更改。它將可接受的客戶機證書限制為具有 O=IBM,OU=virtualization 值的證書,而系統可能會對國家或地區 (C) 和公共名 (CN) 分配任何值。主題中字段的順序必須與您創建證書時使用的順序相同。
技術分享圖片

重新啟動 libvirtd 守護程序服務,以使更改生效
# /etc/init.d/libvirtd restart
Stopping libvirtd daemon: [ OK ]
Starting libvirtd daemon: [ OK ]

客戶端(KVM-API-118)

將認證中心 (CA) 證書 cacert.pem 從 PowerKVM 主機復制到管理站 /etc/pki/CA/ 目錄。請勿變更文件名。
scp [proxy_ip]:/opt/cert_files/cacert.pem /etc/pki/CA/

將客戶機證書 clientcert.pem 復制到 /etc/pki/libvirt/ 目錄,並將客戶機密鑰 clientkey.pem 從 PowerKVM 主機復制到 /etc/pki/libvirt/private/ 目錄。使用缺省文件名稱,並確保只有 root 用戶才能夠訪問專用密鑰。

mkdir -p /etc/pki/libvirt/
scp [proxy_ip]:/opt/cert_files/clientcert.pem /etc/pki/libvirt/.
mkdir /etc/pki/libvirt/private
scp [proxy_ip]:/opt/cert_files/clientkey.pem /etc/pki/libvirt/private/.
chmod -R o-rwx /etc/pki/libvirt/private

驗證這些文件是否已正確放置
ls -lR /etc/pki/libvirt/

角色機需要安裝:
yum -y install cyrus-sasl-md5

設置代理(VNC角色)

可以使用nginx 或者 haproxy等工具
##如haproxy
apt-get install haproxy

##每一臺VM都需要做一個端口代理, 端口號:165+KVM服務器的ip位數
vim /etc/haproxy/haproxy.cfg

listen kvm-proxy-ip位數
bind 0.0.0.0:165ip位數
mode tcp
use_backend kvm-tls-ip位數
backend kvm-tls-ip位數
mode tcp
server kvm-tls-35 10.10.10.35:16514 -一定是16514


listen kvm-proxy-35
bind 0.0.0.0:16535
mode tcp
use_backend kvm-tls-35
backend kvm-tls-35
mode tcp
server kvm-tls-35 10.10.10.35:16514 -一定是16514

##啟動haproxy
service haproxy restart

##驗證連通
[email protected]:~# virsh -c qemu+tls://KVM_PROXY:16515/system hostname
ubuntu-kvm35

返回正常, 則完成遠程

Sasl認證(所有KVM角色)

(1)libvirt sasl配置在/etc/sasl2/libvirt.conf,Tls是tcp的加密傳輸協議,所以mech_list:需要設置成digest-md5。

vim /etc/sasl2/libvirt.conf

  • 修改前, + 修改後
    技術分享圖片

(2)創建用戶
[email protected]:/etc/libvirt# saslpasswd2 -a libvirt efly
Ps: 密碼 [email protected]#123
技術分享圖片

(3)指定密碼庫
[email protected]:/etc/sasl2# sasldblistusers2 -f /etc/libvirt/passwd.db
技術分享圖片

(4)修改libvirtd.conf
修改 /etc/libvirt/libvirtd.conf
技術分享圖片

(5)重啟libvirtd
systemctl restart libvirtd

(6)測試連接
[email protected]:~# virsh -c qemu+tls://PROXY:16515/system hostname
技術分享圖片
技術分享圖片

玩轉KVM:TLS安全登錄