15.4 建立和控制 Jail

有些系統管理者把 jail 分為下列兩種:“complete(完全)” jail —— 通常包括完整的 FreeBSD 系統;另一種則為 “service(服務)” jail —— 專門只跑某單一可能要用特殊權限的程式或 service。 這只是一種概念上的區分 ,並不影響如何建立 jail 的過程。 至於如何建立 jail 在 jail(8) 內有更詳細的說明:

# setenv D /here/is/the/jail
# mkdir -p $D (1)
# cd /usr/src
# make world DESTDIR=$D (2)
# cd etc/ [1]
# make distribution DESTDIR=$D (3)
# mount -t devfs $D/dev (4)
(1)
首先就是先為 jail 找個家。 該路徑是在 host 系統中的 jail 實體位置。 習慣是放在 /usr/jail/jailnamejailname 請替換為該 jail 的 hostname 以便辨別。 通常 /usr 會有足夠空間來存放 jail 檔案系統,對於 “complete” jail 而言,它通常包括了 FreeBSD 預設安裝 base system 所有檔案的拷貝檔。
(2)
該指令將會在 jail 目錄中安裝所需的 binary、library、manual 說明等 。 這些是以傳統的 FreeBSD 方式完成 —— 即首先先編譯所有檔案, 接著再裝到目的地。
(3)
使用 distribution 這個 make target 來裝所有會用到的設定檔。 簡單來說該動作就是把 /usr/src/etc/ 複製到 jail 環境內的 /etc,也就是 $D/etc/
(4)
對於 jail 環境而言,devfs(8) 檔案系統的掛載並非必須, 但另一方面,幾乎所有應用程式都會需要存取至少一個設備(device), 這主要取決於該程式目的而定。 控制 jail 所能存取的設備非常重要, 因為不正確的設定,會讓攻擊者對 jail 有機可趁。 至於如何透過 devfs(8) 來控制的規則,可以參閱 devfs(8)devfs.conf(5) 說明。

裝好 jail 之後,就可以用 jail(8) 工具。 jail(8) 需要四項必填參數,這些參數在 Section 15.3.1 有介紹過。 除了這四個參數之外,還可以指定其他參數,像是以特定帳號在 jail 中執行 process。 command 參數取決於 jail 類型而定;對於 virtual system(虛擬系統) ,那麼就選擇 /etc/rc, 因為它會完成真正 FreeBSD 系統啟動所需的操作。 對於 service(服務) jail 而言,執行的指令取決於將在 jail 內執行的 service 或應用程式而定。

Jail 通常要在系統開機時啟動,因此 FreeBSD 的 rc 機制提供一些便利的方式來簡化這些工作:

  1. 開機時要啟動的 jail 清單要加到 rc.conf(5) 設定檔:

    jail_enable="YES"   # 若設為 NO 則表示不自動啟動 jail
    jail_list="www"     # 若有許多 jail 則請以空白隔開來寫
    
  2. 對於每一筆在 jail_list 所列出的 jail, 也要在 rc.conf(5) 做出相對應的設定:

    jail_www_rootdir="/usr/jail/www"     # jail 的根目錄
    jail_www_hostname="www.example.org"  # jail 的 hostname
    jail_www_ip="192.168.0.10"           # jail 的 IP address
    jail_www_devfs_enable="YES"          # 在 jail 內 mount devfs
    jail_www_devfs_ruleset="www_ruleset" # jail 內所用的 devfs 規則表
    

    rc.conf(5) 所預設的 jail 啟動設定會跑 /etc/rc 內的 jail script,也就是說會假設 jail 是完整的虛擬系統。 若要用 service jail 類型,則要另外指定啟動指令, 方法是設定對應的 jail_jailname_exec_start 設定。

    Note: 若欲知道所有可用的選項清單,請參閱 rc.conf(5) 說明。

也可以透過手動執行 /etc/rc.d/jail script 來啟動或停止 rc.conf 所設定的 jail:

# /etc/rc.d/jail start www
# /etc/rc.d/jail stop www

目前尚無任何方法來很乾淨地關閉 jail(8)。 此乃因為正常用來關閉系統的指令,目前尚不能在 jail 中使用。 目前關閉 jail 最佳的方式,是在 jail 內執行下列指令,或者 jail 外面透過 jexec(8) 執行下列指令:

# sh /etc/rc.shutdown

詳情請參閱 jail(8) 說明。

Notes

[1]

FreeBSD 6.0(含) 之後就不需這步驟。

本文及其他文件,可由此下載:ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/

若有 FreeBSD 方面疑問,請先閱讀 FreeBSD 相關文件,如不能解決的話,再洽詢 <questions@FreeBSD.org>。
關於本文件的問題,請洽詢 <doc@FreeBSD.org>。