在KVM中设置TLS证书认证TCP和VNC连接(填坑版)

本文是一篇散文

今天我们就来说一下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

ca

执行之后就是这里,我们可以看到证书的过期时间是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,注意保证这个文件在当前目录中

server

这里我们的证书也是签了相当长的时间

之后我们会获得两个文件

  • 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

client

我们生成了这两个文件

  • 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打开就是了

virt-manager

点连接即可

TLS

可以看到我们的URL已经变成qemu+tls

然后我们测试一下我们的VNC能否在virt-manager中正常使用(这里如果不能正常显示图像,请到第四步的后半部分检查设置,正常情况是可以直接点开的)

virt-vnc

如果能正常使用,我们用其他的VNC客户端来打开看看

比如这里我们打开一个5922的端口

用ubuntu自带的Remmina

Remmina

连接

connect

这时候就要你提供证书来完成这个连接了

你这里这里可以把我们本地的那三个证书指定一下,就可以完成VNC的连接了

connect

好了,本问大概总结了一下安全的使用KVM的一些姿势

当然比起大神还是有差距的

参考文章

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值