声明:
本博客欢迎转载,但请保留原作者信息!
作者:华为云计算工程师 林凯
团队:华为杭州研发中心OpenStack社区团队
VNC (Virtual Network Computer)是虚拟网络计算机的缩写。VNC 是一款优秀的远程控制工具软件,由著名的 AT&T 的欧洲研究实验室开发的。VNC 是在基于 UNIX 和 Linux 操作系统的免费的开源软件,远程控制能力强大,高效实用,其性能可以和 Windows 和 MAC 中的任何远程控制软件媲美。
Openstack在Nova组件中集成了VNC功能,在运用VNC功能的过程中,逐渐产生了以下两点疑问:
(1) VNC鉴权问题
(2) VNC日志信息问题
1.VNC鉴权问题
用户在Openstack环境下通过nova get-vnc-console myTestVm novnc命令来获取URL信息。URL信息如下所示
+-------+-----------------------------------------------------------------------------------+
| Type | Url |
+-------+-----------------------------------------------------------------------------------+
| novnc |http://192.168.28.4:6080/vnc_auto.html?token=f5abd84d-708f-4486-af61-40c6e5a876c0|
+-------+-----------------------------------------------------------------------------------+
通过查看Nova源码,发现在这个过程中,Nova会将token信息存储入memcache的缓存中,且它是开放的,进入不需要任何鉴权,于是就可能引发这样一个问题:Openstack的运维人员或者其他人员均可以很容易地在memcache中,获取token信息,进而通过VNC功能对用户的虚拟机进行操作,这种情况明显是比较危险的。
2.VNC日志信息问题
在运用和调试Openstack的VNC功能的过程中,有时候需要查看VNC的日志信息,但是在日志目录下却找不到VNC的日志文件,那么VNC是不是就没有日志信息呢?
通过对Openstack的源码走读,发现在Openstack中,在运行获取VNC的URL命令之后,会在/var/log/nova/nova-consoleauth.log中存储一系列的相关信息,其中也包括token等信息,同样其中的token信息同样是以明码的形式写入到日志文件,这样同样会造成安全问题,但是这个比较好解决,之后对log中的token信息进行加密即可,因为log中的内容仅在调试等时候观察用,不需要做其他用途。
3.VNC鉴权问题解决方案
对于1中提到的memcache的鉴权问题,有几个改进的想法如下:
方案1:对memcache和log中的token信息进行加密
方案2:将VNC的token信息的使用次数限制为1次,即在用户使用过一次VNC的URL信息之后,直接将memcache中token信息删除,防止被其他人员利用;
方案3:在VNC的token信息基础上加上其他认证信息,每次使用VNC都要验证这个信息,这个信息不存储在memcache中。
对比以上三种方案,发现方案1的方案为最优的选择
方案2的缺点:
如果其他人员比用户更快地获取到token信息,这种情况是有可能发生的,因为没有VNC信息的有效时间是10分钟,所以用户并不一定会很快去使用VNC信息(而且如果“其他人员”有心的话,肯定有办法比用户更快),这样就导致有个问题出现,VNC信息被“其他人员”给用了,用户反而不能使用这个VNC信息,只能重新申请。而且token次数被限制后,用户每次都要重新申请一次VNC信息。
方案3的缺点:
需要重新设定鉴权信息,相对于方案1来说,较为繁琐,对原有程序改动也较大。
方案1的优点:
只要将VNC的token信息加密存储到memcache中,然后在读取的时候,将加密的信息取出进行解密即可。
具体的实现方法如下:
1) 在authorize_console函数将token加密之后存储入memcache中
2) 在check_token函数中首先将获取的token加密之后作为从memcache中取出token信息的key,然后去查找memcache中是否存在对应的token信息。
3)将加密的token信息写入日志之后,将token信息解密后给相关的方法使用。
以上是个人对Openstack中的VNC功能的一些拙见,其中必然有错误和不足之处,希望大家能够多多指出,谢谢。