2012年11月29日 星期四

將 firefox 及 adobe flash 與目前系統隔離完整版


上次寫了將 firefox 執行於 chroot 環境下,用來與目前系統隔離,但由於 chroot 只隔離檔案系統,而核心卻還是共用的,依然沒有很安全,只保護了半套。這篇就直接將 firefox 跑在 kvm 虛擬機器上,畫面及聲音傳回目前桌面系統。

有很多種方法來達到這功能,包括 vnc,nx server,xspice server + spice client,x2go server,ssh x11 forwarding,以及最古早的 X11 access control (xhost),另外還有 dxpc,也就是今天的主角。

但由於 vnc 及 nx server 和 xpice server + spice client 都是出現一個完整的 root window,裡面再有一些應用程式,等於直接操作二台機器,使用上滿不方便的,因此在這邊就不使用。


範例有二台機器,一台是 desktop-host, 另一台為 firefox-host,記憶體給至少 768M 以上,不用啟動 X。


首先介紹最簡單的 ssh x11 forwarding:

ssh x11 forward 是最簡單的,不用安裝額外軟體,直接使用即可。
預設 ssh server 的 x11 forwarding 已經是開啟的,只要直接在本機下指令:
$ ssh -X firefox-host firefox

這時虛擬機器上的 firefox 視窗就會開啟,和平常本機上執行沒二樣,不過檔案就要使用如 sshfs 來分享。
有一點要注意的,就是要先將本機的 firefox 給關掉,若沒關的話,就算是在別台機器開 firefox,也會變成是開啟本機的 firefox,這個功能很奇怪,之前被騙過,下載檔案在別台機器上找不到。

但是,有一個大問題,就是在看 youtube 時 “沒有聲音”,因為是在另一台機器上執行,所以聲音沒傳過來。

沒關係,有功能強大的 pulseaudio 可用,可取代以前的 esd,在本機設定 pulseaudio sound server,由遠端將聲音傳送過來。

on desktop-host 端設定:
$ sudo apt-get install pulseaudio paprefs

$ paprefs
設定 Network Server 標籤,將 Enable network access to localhost sound devices 打抅

然後將 ~/.pulse-cookie 給拷貝到虛擬機器中同樣位置即可。
$ scp -p ~/.pulse-cookie firefox-host:~/.pulse-cookie

若不想這麼麻煩,直接設定同樣 Network Server 標籤下
Don’t require authentication 也打抅,就不用認證即可連接。


 啟動 pulseaudio
$ pulseaudio --start

此時用 netstat -an 可看到 pulseaudio listen tcp port 4713
firewall 記得打開給 firefox-host 連

on firefox-host 端設定:
$ sudo apt-get install pulseaudio

執行:
$ export PULSE_SERVER=desktop-host:4713
$ firefox &

這樣看 youtube 時就有影像及聲音了,從 firefox 下載後也可透過 sshfs 來取得。

當然多開 port 總是不好的,而且聲音流量不大,也可透過 ssh port forwarding 來取代開 port。
將 desktop-host 的 4713 port 由 ssh tunnel 轉到 firefox-host 的 4713 port,這樣在 firefox-host 就可直接將聲音送到 localhost:4713,desktop-host 也就不用防火牆打開 tcp 4713 。

on desktop-host:
$ ssh -X -R 4713:localhost:4713 firefox-host

on firefox-host:
$ export PULSE_SERVER=localhost:4713
$ firefox &

寫個 script start-firefox-ssh-x11-forwarding
#!/bin/bash
export PULSE_SERVER=localhost:4713
firefox &
firefox 下載回來的檔案如何取得,直接安裝 sshfs 掛載起來即可。

簡化上面步驟,一切設定完整後,以後只要下指令:
on desktop-host:
$ ssh -X -R 4713:localhost:4713 firefox-host start-firefox-ssh-x11-forwarding
$ sshfs firefox-host:/home/username/Downloads/ /home/username/Downloads 

即可遠端使用 firefox



使用 x2go server :

x2go server 基本上和 nx server 差不多,之前介紹過,這次就不多做說明。
x2go server 可以單獨執行某一程式,做到 rootless 的功能,只會有一個應用程式的視窗,和本機開啟的看起來一樣。
而聲音部份,x2go 也支援 pulseaudio, arts, esd 等,在設定裡抅好即可,其他的 x2go 會處理,也不用在 desktop-host 上 listen tcp 4713 的設定。
至於檔案分享部份,也在設定裡面直接設定即可,後端也是採用 sshfs。

設定時選擇 Session 標籤 -> 最下方 Session type 改成 single application,並於 Command: 空格中打上 firefox 指令即可,按 ok 關閉視窗。

連接後只會出現 firefox 視窗,而不是整個桌面環境。




最古早的 X11 access control (xhost):

因為直接用 X protocol,沒經過 ssh 什麼的加密,因此是效能最好的,可惜要在本機 desktop-host 上開 tcp 6000 port 給 firefox-host 連,不建議用這個方法,因為這裡是用虛擬機器,基本上是沒出去這台 desktop-host 外面,所以才勉強用看看,若為真實二台機器透過網路連接,千萬不要用這方法。

on desktop-host:
現在預設啟動 X 時,都會自動加上 -nolisten tcp 參數,因此要修改 gdm 類的工具,將這參數拿掉。
若是使用 startx 來啟動 X,則修改:
/etc/X11/xinit/xserverrc
exec /usr/bin/X -nolisten tcp "$@"
改成
exec /usr/bin/X "$@"

這樣在啟動 X 後,就會 listen tcp port 6000
firewall 打開 tcp 6000 給 firefox-host 連

然後設定那幾台機器可以連 X server
$ xhost +firefox-host

on firefox-host:
$ export DISPLAY=desktop-host:0
$ firefox

這樣畫面就會丟過來,而且看 youtube 什麼的,都和原本本機上執行差不多。
聲音一樣使用 pulseaudio,檔案分享一樣用 sshfs。

不過,這樣風險滿大的,如果 firefox-host 被入侵,有現成工具(之前在管系統時,有遇到這種後門),可以由 firefox-host 連到 desktop-host 6000 port,並截取所有鍵盤按鍵及畫面,包括密碼什麼的,所以就違反了當初安全的目的。



使用 dxpc 來執行遠端程式,並丟到目前 display 來:

當初 nx server 就是受這套 dxpc 所啟發,而開始發展的。

由於 dxpc 的 client 要先啟動,因此先從 firefox-host 開始
on firefox-host:
$ sudo apt-get install dxpc
$ dxpc &
會 listen tcp port 4000 及 6008 port,4000 是 client 及 server 端溝通的,而 6008 是 X 的 display :8 所用的 port
firefox-host 的防火牆只需要開 tcp port 4000 給 desktop-host 連即可。

將 display 指向 localhost:8
$ export DISPLAY=localhost:8

聲音一樣用 pulseaudio
$ export PULSE_SERVER=desktop-host:4713

等 desktop-host 連結過來後,再來執行 firefox,我的 script 裡面是設定 sleep 5 秒

start-firefox-dxpc
#!/bin/bash
export DISPLAY=localhost:8
export PULSE_SERVER=desktop-host:4713
sleep 5
firefox &

$ start-firefox-dxpc
執行後在5秒內趕快去另一端執行 dxpc


on desktop-host:
$ sudo apt-get install dxpc

$ dxpc firefox-host &

預設 dxpc 和 dxpc 間是用 lzo 來壓縮再傳送,若 cpu 不夠力(如虛擬機器),可以關掉。
$ dxpc -i 0 firefox-host &

通道建立後,就會彈出 firefox 視窗,像平常一樣的使用。
播放 youtube 上 html5 的影片很正常,有點頓就是,應該是機器不夠高檔。不過,好像 flash 及 dxpc 有點不相容,若是去播放 flash 的影片,很容易就將整個 X 都卡住,完全不會動,要按 Ctrl-Alt-F1 回到 console 底下,將 dxpc 給砍了,再按 Alt-F7 回來才正常。

那古早 xhost 方式和這個 dxpc 有什麼不同,其實差很多。
最主要差別在:
xhost 方式是由 desktop-host listen tcp 6000,然後由 firefox-host 連進來
dxpc 是由 firefox-host listen tcp 4000,然後由 desktop-host 連進來,方向不同,自然安全性也不同。當然 dxpc 也可以下 -w 參數,來讓連線方向對調,某些狀況下會用到,如 firefox-host 在 nat 底下。


基本上,這麼多種方法可用,大致上為:
ssh x11 forwarding: 一般使用及瀏覽網頁沒問題,但要看影片滿頓的,手動搭配 pulseaudio 及 sshfs
古早 xhost: 效能最好,但最危險,手動搭配 pulseaudio 及 sshfs
x2go server: 最簡單,看影片滿頓的,聲音及檔案分享都幫你做好
dxpc: 介於中間,安全性不錯及效能勉強可接受,手動搭配 pulseaudio 及 sshfs,不過會 hang,要再多測試看看。

 感覺機器要再高檔些,才有辦法應付影片播放。

沒有留言:

張貼留言