OpenStack中加固VNC访问安全

2024-09-08 10:48

本文主要是介绍OpenStack中加固VNC访问安全,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

OpenStack中加固VNC访问安全


目录

  • OpenStack中加固VNC访问安全
    • 1.问题发现
    • 2.流程分析
    • 3.潜在后果
    • 4.解决方案
      • ④配置IPtables
      • ⑤VNC添加访问密码
    • 5.参考链接


1.问题发现

很多同学使用noVNC之后都没有退出终端的习惯,往往都是用完了就直接关闭网页窗口。说这样隐患很大,如果内网里面有一些script kiddie随时都能将我们线上的虚拟机VNC端口扫出来。
下面使用nmap测试一下开发环境中的计算节点的端口开放情况。

ubuntu@ubuntu:~ $ nmap 192.168.23.12
Starting Nmap 7.70 ( https://nmap.org ) at 2019-06-13 19:22 CST
Nmap scan report for 192.168.23.12
Host is up (0.0099s latency).
Not shown: 992 closed ports
PORT     STATE SERVICE
22/tcp   open  ssh
4000/tcp open  remoteanything
5900/tcp open  vnc
5901/tcp open  vnc-1
5902/tcp open  vnc-2
5903/tcp open  vnc-3
5904/tcp open  unknown
8000/tcp open  cvdNmap done: 1 IP address (1 host up) scanned in 0.31 seconds
ubuntu@ubuntu:~ $

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

2.流程分析

OpenStack VNC Proxy 流程分析

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

一个VNC Proxy在OpenStack里的处理流程

  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的工作。
    参考:https://www.jianshu.com/p/b91dc99c5b77

3.潜在后果

知道IP地址,扫描出端口号,直接通过VNC连接虚拟机进行操作。

4.解决方案

  • ①从交换和防火墙的ACL控制IP访问
  • ②修改各计算节点 nova.conf中 vncserver_listen 配置为内网 IP ,保证新建虚机没问题
  • ③现有以及之后新建的的虚拟机,修改 libvirt.xml 中的 vnc 的监听端口,保证虚机重启后不会向公网开放端口
  • ④修改IPtables配置规则,屏蔽端口访问,把除内网以外网段的5900~5999端口给封禁
  • ⑤vnc增加访问密码
    下面针对方法④和方法⑤进行详细的说明。

④配置IPtables

根据OpenStack VNC Proxy 流程分析中的,第16步, nova-novncproxy是通过连接host:vncport的方式提供vnc访问服务。即,计算节点的VNC端口只需要允许让nova-novncporxy服务能够访问就行。

在所有计算节点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的端口。

$ nmap 192.168.23.12

⑤VNC添加访问密码

对应的配置文件为:virt/libvirt/config.py

libvirtd在<graphics>域里面是支持配置VNC的访问密码

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

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

1482 class LibvirtConfigGuestGraphics(LibvirtConfigGuestDevice):
1483 
1484     def __init__(self, **kwargs):
1485         super(LibvirtConfigGuestGraphics, self).__init__(root_name="graphics",
1486                                                          **kwargs)
1487 
1488         self.type = "vnc"
1489         self.autoport = True
1490         self.keymap = None
1491         self.listen = None
1492 
1493     def format_dom(self):
1494         dev = super(LibvirtConfigGuestGraphics, self).format_dom()
1495 
1496         dev.set("type", self.type)
1497         if self.autoport:
1498             dev.set("autoport", "yes")
1499         else:
1500             dev.set("autoport", "no")
1501         if self.keymap:
1502             dev.set("keymap", self.keymap)
1503         if self.listen:
1504             dev.set("listen", self.listen)
1505 #       dev.set("passwd", "123456")
1506         return dev

其中dev.set("passwd", "123456")是新加入的一行,如果不需要vnc访问输入密码,直接注释掉即可。
下面是一次解决过程,因开发环境使用的是容器化部署,文件路径比较长。
解决过程
查找文件

root@controller1:~# find /var/lib/docker/aufs/diff  -name config.py | grep nova
/var/lib/docker/aufs/diff/pr0XDEZwLDflwwzUPc0mNVYwf6b3wJ4wxEwxNBRlmKMD7qRurdlBck41J8hAkjd3/usr/lib/python2.7/dist-packages/nova/config.py
/var/lib/docker/aufs/diff/pr0XDEZwLDflwwzUPc0mNVYwf6b3wJ4wxEwxNBRlmKMD7qRurdlBck41J8hAkjd3/usr/lib/python2.7/dist-packages/nova/virt/libvirt/config.py
/var/lib/docker/aufs/diff/pr0XDEZwLDflwwzUPc0mNVYwf6b3wJ4wxEwxNBRlmKMD7qRurdlBck41J8hAkjd3/usr/lib/python2.7/dist-packages/nova/common/config.py

进入配置文件所在路径

root@controller01:~# cd /var/lib/docker/aufs/diff/pr0XDEZwLDflwwzUPc0mNVYwf6b3wJ4wxEwxNBRlmKMD7qRurdlBck41J8hAkjd3/usr/lib/python2.7/dist-packages/nova/virt/libvirt/
root@controller01:/var/lib/docker/aufs/diff/pr0XDEZwLDflwwzUPc0mNVYwf6b3wJ4wxEwxNBRlmKMD7qRurdlBck41J8hAkjd3/usr/lib/python2.7/dist-packages/nova/virt/libvirt# ls
blockinfo.py   compat.py   config.py          config.pyc   designer.pyc  driver.pyc   firewall.pyc  guest.pyc  host.pyc         imagebackend.pyc  imagecache.pyc  __init__.pyc           instancejobtracker.pyc  migration.pyc  utils.py   vif.py   volume
blockinfo.pyc  compat.pyc  config.py.bak.ori  designer.py  driver.py     firewall.py  guest.py      host.py    imagebackend.py  imagecache.py     __init__.py     instancejobtracker.py  migration.py            storage        utils.pyc  vif.pyc

修改配置文件

root@controller1:/var/lib/docker/aufs/diff/pr0XDEZwLDflwwzUPc0mNVYwf6b3wJ4wxEwxNBRlmKMD7qRurdlBck41J8hAkjd3/usr/lib/python2.7/dist-packages/nova/virt/libvirt# vim config.py

在这里插入图片描述
修改后,重启nova-compute服务,即在下次创建虚拟机的时候生效,其结果如下:
在这里插入图片描述
输入密码virt/libvirt/config.py配置中新增的密码123456即可正进入虚拟机。

5.参考链接

关于OpenStack中虚拟机VNC访问安全问题
民生银行 OpenStack 安全加固探索与实践

openstack VNC安全问题
OpenStack的VNC配置
OpenStack的VNC安全

这篇关于OpenStack中加固VNC访问安全的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1147903

相关文章

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

浅谈主机加固,六种有效的主机加固方法

在数字化时代,数据的价值不言而喻,但随之而来的安全威胁也日益严峻。从勒索病毒到内部泄露,企业的数据安全面临着前所未有的挑战。为了应对这些挑战,一种全新的主机加固解决方案应运而生。 MCK主机加固解决方案,采用先进的安全容器中间件技术,构建起一套内核级的纵深立体防护体系。这一体系突破了传统安全防护的局限,即使在管理员权限被恶意利用的情况下,也能确保服务器的安全稳定运行。 普适主机加固措施:

客户案例:安全海外中继助力知名家电企业化解海外通邮困境

1、客户背景 广东格兰仕集团有限公司(以下简称“格兰仕”),成立于1978年,是中国家电行业的领军企业之一。作为全球最大的微波炉生产基地,格兰仕拥有多项国际领先的家电制造技术,连续多年位列中国家电出口前列。格兰仕不仅注重业务的全球拓展,更重视业务流程的高效与顺畅,以确保在国际舞台上的竞争力。 2、需求痛点 随着格兰仕全球化战略的深入实施,其海外业务快速增长,电子邮件成为了关键的沟通工具。

安全管理体系化的智慧油站开源了。

AI视频监控平台简介 AI视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。用户只需在界面上进行简单的操作,就可以实现全视频的接入及布控。摄像头管理模块用于多种终端设备、智能设备的接入及管理。平台支持包括摄像头等终端感知设备接入,为整个平台提

2024网安周今日开幕,亚信安全亮相30城

2024年国家网络安全宣传周今天在广州拉开帷幕。今年网安周继续以“网络安全为人民,网络安全靠人民”为主题。2024年国家网络安全宣传周涵盖了1场开幕式、1场高峰论坛、5个重要活动、15场分论坛/座谈会/闭门会、6个主题日活动和网络安全“六进”活动。亚信安全出席2024年国家网络安全宣传周开幕式和主论坛,并将通过线下宣讲、创意科普、成果展示等多种形式,让广大民众看得懂、记得住安全知识,同时还

两个月冲刺软考——访问位与修改位的题型(淘汰哪一页);内聚的类型;关于码制的知识点;地址映射的相关内容

1.访问位与修改位的题型(淘汰哪一页) 访问位:为1时表示在内存期间被访问过,为0时表示未被访问;修改位:为1时表示该页面自从被装入内存后被修改过,为0时表示未修改过。 置换页面时,最先置换访问位和修改位为00的,其次是01(没被访问但被修改过)的,之后是10(被访问了但没被修改过),最后是11。 2.内聚的类型 功能内聚:完成一个单一功能,各个部分协同工作,缺一不可。 顺序内聚:

【Kubernetes】K8s 的安全框架和用户认证

K8s 的安全框架和用户认证 1.Kubernetes 的安全框架1.1 认证:Authentication1.2 鉴权:Authorization1.3 准入控制:Admission Control 2.Kubernetes 的用户认证2.1 Kubernetes 的用户认证方式2.2 配置 Kubernetes 集群使用密码认证 Kubernetes 作为一个分布式的虚拟

企业安全之WiFi篇

很多的公司都没有安全团队,只有运维来负责整个公司的安全,从而安全问题也大打折扣。我最近一直在给各个公司做安全检测,就把自己的心得写下来,有什么不足之处还望补充。 0×01  无线安全 很多的公司都有不怎么注重公司的无线电安全,有钱的公司买设备,没钱的公司搞人力。但是人的技术在好,没有设备的辅助,人力在牛逼也没有个卵用。一个好的路由器、交换机、IDS就像你装备了 无尽、狂徒、杀人书一

Linux 安全弹出外接磁盘

命令行操作 首先,需要卸载硬盘上的所有分区,可以使用umount来卸载分区 清空系统缓存,将所有的数据写入磁盘 sync 列出已挂载的文件系统 使用lsblk或者df命令来查找要卸载的分区 lsblk or df -h 确保没有文件正在使用 使用lsof 命令来检查 sudo lsof |grep /dev/sdc 卸载分区 假设硬盘的分区是 /dev/sdc1,使用u

3.比 HTTP 更安全的 HTTPS(工作原理理解、非对称加密理解、证书理解)

所谓的协议 协议只是一种规则,你不按规则来就无法和目标方进行你的工作 协议说白了只是人定的规则,任何人都可以定协议 我们不需要太了解细节,这些制定和完善协议的人去做的,我们只需要知道协议的一个大概 HTTPS 协议 1、概述 HTTPS(Hypertext Transfer Protocol Secure)是一种安全的超文本传输协议,主要用于在客户端和服务器之间安全地传输数据