关于OpenStack中虚拟机VNC访问安全问题

背景

这两天收到安全部门同事的邮件,说线上OpenStack环境的物理机VNC端口能够自由访问,要求整改。我这随机抽查了两台宿主机的VNC端口,确实很多业务的同学使用noVNC后没有退出终端的习惯,往往都是用完了就直接关闭窗口。不得不说这样隐患很大啊,首先不说通过外部方式规避风险,如果内网里面有一些script kiddie随时都能将我们线上的虚拟机VNC端口扫出来干些坏事。我这里也用过nmap测试了下开发环境的网络端口,如下:

$ nmap 192.168.68.0/24

Nmap scan report for kvm54.com (192.168.68.54)
Host is up (0.00017s latency).
Not shown: 996 closed ports
PORT     STATE SERVICE
111/tcp  open  rpcbind
5900/tcp open  vnc
5901/tcp open  vnc-1
6789/tcp open  ibm-db2-admin

Nmap scan report for kvm55.com (192.168.68.55)
Host is up (0.00020s latency).
Not shown: 996 closed ports
PORT     STATE SERVICE
111/tcp  open  rpcbind
5900/tcp open  vnc
5901/tcp open  vnc-1
5902/tcp open  vnc-2

Nmap scan report for kvm56.com (192.168.68.56)
Host is up (0.00023s latency).
Not shown: 997 closed ports
PORT     STATE SERVICE
5900/tcp open  vnc
5901/tcp open  vnc-1
5902/tcp open  vnc-2

Nmap scan report for kvm57.com (192.168.68.57)
Host is up (0.00018s latency).
Not shown: 996 closed ports
PORT     STATE SERVICE
5900/tcp open  vnc
5901/tcp open  vnc-1
5902/tcp open  vnc-2
6789/tcp open  ibm-db2-admin

这个结果很恐怖啊,如果有业务同学在使用noVNC之后没有退出终端,那么另一个人如果知道了宿主机的IP和端口是完全可以登录这台虚拟机的。

解决

知道了问题,那就有对应的解决方案!

我这里目前暂时只想到两个方法来解决这个问题,也希望有大牛可以指点。

  • 方案一
    通过IPTABLES限制INPUT表对5900:5999的访问规则

  • 方案二
    添加密码访问VNC

操作

IPTABLES

我们知道OpenStack通过VNC Proxy将管理网和业务网隔离开来,以便我们可以使用管理网络的6080端口访问虚拟机VNC,同时提供Token用于验证访问的合法性。一个VNC Proxy在OpenStack里的处理流程如下:

VNC Porxy处理流程

1. 一个用户试图从浏览器里面打开连接到虚拟机的VNC Client
2. 浏览器向nova-api发送请求,要求返回访问vnc的url
3. nova-api调用nova-compute的get vnc console方法,要求返回连接VNC的信息
4.nova-compute调用libvirt的get vnc console函数
5.libvirt会通过解析虚拟机运行的/etc/libvirt/qemu/instance-0000000c.xml文件来获得VNC Server的信息
6.libvirt将host, port等信息以json格式返回给nova-compute
7.nova-compute会随机生成一个UUID作为Token
8.nova-compute将libvirt返回的信息以及配置文件中的信息综合成connect_info返回给nova-api
9.nova-api会调用nova-consoleauth的authorize_console函数
10.nova-consoleauth会将instance –> token, token –> connect_info的信息cache起来
11.nova-api将connect_info中的access url信息返回给浏览器:http://172.24.1.1:6080/vnc_auto.html?token=7efaee3f-eada-4731-a87c-e173cbd25e98&title=helloworld%289169fdb2-5b74-46b1-9803-60d2926bd97c%29
12.浏览器会试图打开这个链接
13.这个链接会将请求发送给nova-novncproxy
14.nova-novncproxy调用nova-consoleauth的check_token函数
15.nova-consoleauth验证了这个token,将这个instance对应的connect_info返回给nova-novncproxy
16.nova-novncproxy通过connect_info中的host, port等信息,连接compute节点上的VNC Server,从而开始了proxy的工作

这里重要的就是第16步, nova-novncproxy是通过连接host:vncport的方式提供vnc访问服务。
那么也就是说,计算节点的VNC端口只需要让nova-novncporxy服务能够访问就行,有了这个就好办了。

操作IPTABLES

在所有计算节点IPTABLES的INPUT表中添加如下规则:

$ iptables -A INPUT -s {{ CONTROLLER_NODE_IP }}/32 -p tcp -m multiport --dports 5900:5999 -m comment --comment "ACCEPT VNC Port only by Controller Node" -j ACCEPT

$ iptables -A INPUT -p tcp -m multiport --dports 5900:5999 -j REJECT --reject-with icmp-port-unreachable

原理很简单,就是只接受控制节点访问本机的5900到5999端口,其他的连接一律拒绝。
当下次再用nmap扫描局域网的宿主机端口时,便不能看到VNC的端口。

$ nc -vz 192.168.68.58 5900
nc: connect to 192.168.68.58 port 5900 (tcp) failed: Connection refused

VNC添加访问密码

另外我们知道Libvirtd在<graphics>域里面是支持配置VNC的访问密码的。

...
 <graphics type='vnc' port='-1' autoport='yes' listen='192.168.68.57' passwd='YOUR-PASSWORD-HERE' keymap='en-us'/>
...

那么Nova在创建虚拟机配置的方法中也可以找到对应graphics的代码,我这里修改得很简单,直接在返回的dev列表里面添加个passwd的value,而value就是VNC的访问密码。

virt/libvirt/config.py

1361 class LibvirtConfigGuestGraphics(LibvirtConfigGuestDevice):
1362 
1363     def __init__(self, **kwargs):
1364         super(LibvirtConfigGuestGraphics, self).__init__(root_name="graphics",
1365                                                          **kwargs)
1366 
1367         self.type = "vnc"
1368         self.autoport = True
1369         self.keymap = None
1370         self.listen = None
1371 
1372     def format_dom(self):
1373         dev = super(LibvirtConfigGuestGraphics, self).format_dom()
1374 
1375         dev.set("type", self.type)
1376         if self.autoport:
1377             dev.set("autoport", "yes")
1378         else:
1379             dev.set("autoport", "no")
1380         if self.keymap:
1381             dev.set("keymap", self.keymap)
1382         if self.listen:
1383             dev.set("listen", self.listen)
1384         dev.set("passwd", "magine1989")
1385 
1386         return dev

修改过后重启nova-compute服务,即在下次创建虚拟机的时候生效,其结果如下:

noVNC

关于两种方案的思考

关于上面两种方案,很显然第一种方案很简单,而且高效更安全。唯一一点不好的就是访问计算节点的VNC端口只能通过控制节点做ssh代理,有时候在界面上使用noVNC访问虚拟机,实时性没那么好。至于第二种方案,在做公有云的场景下并不适用,不可能让用户在访问VNC的过程中再加一层密码。密码的灵活性先不谈,单是用户体验上就不太友好。如果在私有云或者内网环境下,VNC的访问密码还是可以在一定程度上隔离掉脚本小子的骚扰,又不至于影响VNC端口不能访问的尴尬,不管怎样方案二还是具有一定的侵入性。但是我相信Nova的开发没将VNC访问密码作为用户安全的辅助手段还是有道理的。毕竟有了第一种比较完美解决方案,再加个不太灵活的密码就太画蛇添足了。


参考:

http://libvirt.org/formatdomain.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,264评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,549评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,389评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,616评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,461评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,351评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,776评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,414评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,722评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,760评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,537评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,381评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,787评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,030评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,304评论 1 252
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,734评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,943评论 2 336

推荐阅读更多精彩内容