2012年11月25日 星期日

以 schroot 在 chroot 環境下執行 firefox

由於前陣子 google 公佈說在 chrome 中執行 flash 已經 “fully sandboxed”(註1),就算 adobe flash 有漏洞,也不容易影響到系統。

但對於 firefox 使用者來說就沒這麼好康了,由於 adobe flash 的安全性一向是滿糟的,在 mozilla 沒做好防護前,只好自己來,這篇是在 debian wheezy 下將 firefox 放到 chroot 底下去執行,以達到隔離目的。

當然最安全的是建立另一台虛擬器,只拿來跑 firefox,但是這樣很麻煩,消耗的系統資源又多,實在不划算。用 lxc 的話也滿不錯,但是只跑 firefox,殺雞焉用牛刀,chroot 就很夠用。

使用 chroot 麻煩地方在於,要掛載原本 root 底下的 /proc、/dev/pts 到 chroot 環境,要有音效,還要掛載 /dev/snd,webcam 的話,就要將整個 /dev 也掛載,就要手動建立 /dev/video0 這個裝置,再將 /dev/shm 也掛載到 chroot 底下才行。

若僅使用一次,那手動掛載沒問題,可是一天要使用幾十次的話,真的會煩死人。因此就要使用 schroot 來做 chroot 的功能,會自動幫忙掛載預先設定好的 filesystem,而且可以一般使用者來呼叫 schroot (因為有 setuid),chroot 則一定要使用 root 才行,在只有單人的桌面系統上使用 schroot 沒什麼問題,多人系統就比較危險了。


首先以 debootstrap 建立一個基本的 chroot 環境:
$ sudo apt-get install debootstrap

$ sudo debootstrap wheezy /media/share/chroots/wheezy http://free.nchc.org.tw/debian

裝上 schroot
$ sudo apt-get install schroot

設定 schroot
/etc/schroot/schroot.conf

[wheezy]
description=Debian Wheezy compiling environment
type=directory
directory=/media/share/chroots/wheezy/
users=john
setup.fstab=mysetup/fstab.wheezy

[iceweasel]
description=Debian Wheezy only run iceweasel
type=directory
directory=/media/share/chroots/iceweasel
users=john
preserve-environment=true
setup.fstab=mysetup/fstab.iceweasel

上面有二個 chroot 的範例,第一台是 wheezy,平常拿來編譯程式用,因為想讓平常的桌面環境乾淨點,沒有裝如 build-essential gcc make 等工具,要編程式,就到 chroot 底下去編譯。

第二個 iceweasel 則是專門用來執行 firefox,而且只執行 firefox,由於 license 的問題,在 debian 中的 firefox 叫做 iceweasel(註2)。

description: 文字說明
type: chroot 種類,可分成 plain(註3), directory, file, loopback, block-device, btrfs-snapshot, lvm-snapshot
directory: 若 type 為 plain 或 directory,則這裡指向 chroot 所在目錄
users: 以哪個身份來執行
setup.fstab: 進入 chroot 要自動掛載哪些 filesystem,檔案在 /etc/schroot 底下,不能指定絕對路徑,否則會失敗。
preserve-environment: 保留目前環境變數,方便執行 chroot 裡的圖形介面程式,否則還要手動 export DISPLAY, xauth 等等。

還有很多其他參數,請自行 man schroot.conf

接著設定進入 chroot 後要掛載的檔案系統
/etc/schroot/mysetup/fstab.wheezy
/proc /proc none rw,bind 0 0
/dev/pts /dev/pts none rw,bind 0 0

/etc/schroot/mysetup/fstab.iceweasel
/proc /proc none rw,bind 0 0
/dev/pts /dev/pts none rw,bind 0 0
/dev/snd /dev/snd none rw,bind 0 0


自動執行 script
schroot 會自動執行 /etc/schroot/setup.d/ 底下所找到的 scripts,當 chroot 啟動時會用檔名順序並且以 「setup-start」選項執行,而離開 chroot 時會用相反順序並以「setup-stop」選項執行。可以在現有的檔案中增加你想進行的動作,也可以自己建立新的 script。


設定好後以指令檢查是否正確:

列出所有 chroots:
$ schroot --list
chroot:iceweasel
chroot:wheezy

檢視某個 chroot 詳細資訊:
$ schroot --info wheezy

檢視所有參數及目前設定值:
$ schroot --config

只執行一行指令就跳出:
$ schroot -c wheezy -- ls /tmp

進入 chroot:
$ schroot -c wheezy

在進入 chroot 後,再安裝其他相關程式
$ schroot -c iceweasel
(iceweasel)$ sudo apt-get install iceweasel xfonts-arphic-ukai xfonts-arphic-uming

以後要執行 chroot 裡的 firefox 就下指令:
$ schroot -c iceweasel iceweasel &

小弟都是用 xbindkeys 熱鍵啟動,放在 ~/.xbindkeysrc 中即可,和在原本的環境中沒二樣。也可自己寫個 desktop file 放在桌面( ~/.local/share/applications/ ),一點擊就啟動,完全忘了是在 chroot 環境中。


要共享下載的東西,也要將 /home/john/Downloads 目錄也加入才行。
/etc/schroot/mysetup/fstab.iceweasel
/home/john/Downloads /home/john/Downloads none rw,bind 0 0


至於更新,將 /var/cache/apt/archives 也掛載到 chroot 中即可,才不用重覆下載更新檔。


schroot 真的是非常好用,讓原本麻煩的 chroot 一下子就變得輕鬆多了,另外還支援 union fs 或 aufs 讓多個 chroot 可共享一個 base,又可同時寫入資料,可節省很多空間。



參考連結:

1. http://thenextweb.com/google/2012/11/13/google-declares-flash-is-now-fully-sandboxed-in-chrome-for-windows-mac-linux-and-chrome-os/

2. 大致上是因為 firefox 官方只支援少數 2,3 個平台 debian 為了支援 10 幾個平台,所以有對 firefox 上了很多 patch,但 mozilla 又不接受 debian 所做的 patch 整合到 firefox 裡,然後 mozilla 不允許 debian 改過的版本還叫 firefox,所以 debian 只好用 fork 出一個 iceweasel。而 thunderbird 則改用 icedove。
http://en.wikipedia.org/wiki/Iceweasel
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=354622
http://lists.debian.org/debian-legal/2004/12/msg00328.html

3. 基本上 plain 和 directory 是一樣的,差別在於 plain 就和一般 chroot 一模一樣,全部都手動來,而 directory 則會自動幫忙掛載 filesystem 等等。

4. 好用的 chroot
http://novus.pixnet.net/blog/post/29322140

沒有留言:

張貼留言