本文是一篇散文
今天我们就来说一下KVM的安全配置
KVM的安全实现有很多类型
比如用SSH来连接KVM管理器
但是SSH这个方法有个不好的地方就是没法对我们的VNC加密
或者就是我们这里的TLS配置
既然涉及到了TLS肯定离不开证书
我们就先从证书开始
一. CA证书生成
我们这里的KVM是运行在内网中的CentOS7上的,如果是公网注意这里配置文件会有些许的不同
如果其他版本的Linux
请自行转换一下命令
我们这里不是用openssl
而是另一个工具叫certtool
首先我们找个目录,空目录作为我们生成证书的工作目录,比如我这里选择的是KVM服务器上的/root/pki/
目录
我们先为ca生成密钥
pwd
/root/pki
执行
certtool --generate-privkey > cakey.pem
将密钥保存到cakey.pem
中
然后新建一个文件叫ca.info
,用编辑器打开
vim ca.info
写入如下内容
cn = Test
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
执行之后就是这里,我们可以看到证书的过期时间是2039年(emmmm,设置大一点以后懒得改啊哈哈)
如何也可以看到我们现在证书的生效时间是2018年的9月14号
然后现在你可以删除ca.info
了,但是这里还是建议大家不要删除,毕竟保不准还得再来一次
如何我们现在目录下有了两个文件,一个是
- cakey.pem - CA的私钥文件(注意保护这个文件)
- cacert.pem - CA的公钥文件(公钥公钥就是大家都可以看的那种)
然后这里还要注意一点就是这个cacert.pem
在不仅仅在服务端要安装,客户端中也会要求安装
而且不管在服务端还是客户端,CA文件的目录都是/etc/pki/CA/cacert.pem
,注意这点
如果你忘了你的证书是什么时候过期,可以用这个命令查看
certtool -i --infile cacert.pem
之后我们复制证书到指定地方
cp cacert /etc/pki/CA/
chmod 444 /etc/pki/CA/cacert.pem
二. 服务器证书的生成
生成完CA之后我们为服务器的证书制作一下
对于libvirtd
服务端来说,需要一个hostname或者IP
如果你部署在公网上(公网有独立服务器的大神也不会来看我的文章),就需要一个hostname,其实也就是域名
公网如何部署我们就不说了
下面的文件样本展示的如何在内网中部署
一样的,我们先为服务端生成私钥
certtool --generate-privkey > serverkey.pem
私钥被保存到了serverkey.pem
中
之后,我们开始编辑配置文件
vim server.info
之后
organization = Test
cn = kvm
ip_address = 192.168.1.2
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 serverkey.pem \
--load-ca-certificate cacert.pem --load-ca-privkey cakey.pem \
--template server.info --outfile servercert.pem
这里用到了我们上一步的cakey.pem
,注意保证这个文件在当前目录中
这里我们的证书也是签了相当长的时间
之后我们会获得两个文件
- serverkey.pem - 这是服务端的私钥
- servercert.pem - 这是服务端的公钥
如何就是安装这两个文件了,我们把这两个文件移动到对应的目录中去
mkdir -p /etc/pki/libvirt/private/
cp serverkey.pem /etc/pki/libvirt/private/serverkey.pem
cp servercert.pem /etc/pki/libvirt/servercert.pem
注意这不是一个目录
chgrp qemu /etc/pki/libvirt \
/etc/pki/libvirt/private \
/etc/pki/libvirt/servercert.pem \
/etc/pki/libvirt/private/serverkey.pem
chmod 750 /etc/pki/libvirt \
/etc/pki/libvirt/private
chmod 440 /etc/pki/libvirt/servercert.pem \
/etc/pki/libvirt/private/serverkey.pem
到这里请确认以下位置的证书是否存在
/etc/pki/CA/cacert.pem
/etc/pki/libvirt/servercert.pem
/etc/pki/libvirt/private/serverkey.pem
ok,确认之后为我们的客户端生成证书吧
三. 客户端证书的生成
还是一样的生成密钥
certtool --generate-privkey > clientkey.pem
之后编辑文件
vim client.info
写入
country = CN
state = HK
locality = HK
organization = Test
cn = ubuntu
tls_www_client
encryption_key
signing_key
expiration_days = 700
- 注意这里的cn写你客户端的hostname
之后生成
certtool --generate-certificate --load-privkey clientkey.pem \
--load-ca-certificate cacert.pem --load-ca-privkey cakey.pem \
--template client.info --outfile clientcert.pem
我们生成了这两个文件
- clientkey.pem - 客户端的私钥
- clientcert.pem - 客户端的公钥
然后呢在你本地的机器上下载生成的两个文件
注意是本地的机器,刚刚我们的操作是在kvm服务器上进行的
还有cacert.pem
这个文件
ok,我们在本地的机器上安装这三个证书,首先是cacert.pem
(我的本地机器是ubuntu)
sudo cp cacert.pem /etc/pki/CA/
之后呢安装剩下的
sudo mkdir -p /etc/pki/libvirt/private/
sudo cp clientkey.pem /etc/pki/libvirt/private
sudo cp clientcert.pem /etc/pki/libvirt/
这是配置了我们的virsh
的连接
接下来我们还要配置vnc
的加密连接
不然virt-manager
打不开vnc
的窗口
sudo mkdir -p /etc/pki/libvirt-vnc/private
sudo chmod 750 /etc/pki/libvirt-vnc
chgrp qemu /etc/pki/libvirt-vnc
sudo ln -s /etc/pki/libvirt/private/clientkey.pem /etc/pki/libvirt-vnc/private/clientkey.pem
sudo ln -s /etc/pki/libvirt/clientcert.pem /etc/pki/libvirt-vnc/clientcert.pem
这里有个小问题,就是我们的文件用sudo
移动之后,文件会变成root:root
的用户和组
我们移动到目标位置之后,用chown
来修改一下证书的用户和组属性
比如我们本地的ubuntu用户为test
,那么这样
sudo chown test:test /etc/pki/libvirt/private/clientkey.pem
sudo chown test:test /etc/pki/libvirt/clientcert.pem
sudo chown test:test /etc/pki/CA/cacert.pem
不然libvritd
读不到这个文件的
然后为了安全起见设置权限
sudo chmod 400 /etc/pki/libvirt/private/clientkey.pem
sudo chmod 644 /etc/pki/libvirt/clientcert.pem
sudo chmod 644 /etc/pki/CA/cacert.pem
之后我们为VNC的证书做一个软链接,直接套用TLS的证书就可以了
ln -s /etc/pki/CA/cacert.pem /etc/pki/libvirt-vnc/ca-cert.pem
ln -s /etc/pki/libvirt/servercert.pem /etc/pki/libvirt-vnc/server-cert.pem
ln -s /etc/pki/libvirt/private/serverkey.pem /etc/pki/libvirt-vnc/server-key.pem
OK,本地的配置就算完了
四. 修改配置文件和其他
我们修改一下KVM服务器上的配置文件
vim /etc/libvirt/libvirtd.conf
将以下参数取消注释并修改为所示的值
listen_tls = 1
tls_port = "16514"
listen_addr = "0.0.0.0"
key_file = "/etc/pki/libvirt/private/serverkey.pem“
cert_file = "/etc/pki/libvirt/servercert.pem"
ca_file = "/etc/pki/CA/cacert.pem"
当然,其他的参数你也可以配置,这里就不细说了
然后我们修改另一个配置文件(这个是保证我们的VNC使用TLS的)
vim /etc/libvirt/qemu.conf
将以下选项取消注释并设置所示的值
vnc_listen = "0.0.0.0"
vnc_tls = 1
vnc_tls_x509_cert_dir = "/etc/pki/libvirt-vnc"
vnc_tls_x509_verify = 1
之后修改文件
vim /etc/sysconfig/libvirtd
将以下选择取消注释
LIBVIRTD_ARGS="--listen"
然后重启服务
systemctl restart libvirtd
五. 测试连接
我们先用命令行来测试一下
virsh -c qemu://192.168.1.2/system
如验证通过
那么说明配置的没有问题了,然后我们用virt-manager
打开就是了
点连接即可
可以看到我们的URL已经变成qemu+tls
了
然后我们测试一下我们的VNC能否在virt-manager
中正常使用(这里如果不能正常显示图像,请到第四步的后半部分检查设置,正常情况是可以直接点开的)
如果能正常使用,我们用其他的VNC客户端来打开看看
比如这里我们打开一个5922
的端口
用ubuntu自带的Remmina
连接
这时候就要你提供证书来完成这个连接了
你这里这里可以把我们本地的那三个证书指定一下,就可以完成VNC的连接了
好了,本问大概总结了一下安全的使用KVM的一些姿势
当然比起大神还是有差距的
参考文章