14.3. 建立和控制 Jail

部份管理者將 Jail 分成兩種類型:完整的 Jail,它像一個真正的 FreeBSD 系統以及 服務的 Jail,專門用於某個應用程式或服務,可能使用管理權限執行。但這些只是概念上的區分,建立 Jail 的程序並不受這個概念的影響。當要建立一個 完整的 Jail,Userland 有兩個來源選項:使用預先編譯的 Binary (如安裝媒體上提供的 Binary) 或從原始碼編譯。

要從安裝媒體安裝 Userland,需要先建立根目錄供 Jail 使用。這個動作可以透過設定 DESTDIR 來到適當的位置來完成。

啟動 Shell 並定義 DESTDIR

# sh
# export DESTDIR=/here/is/the/jail

當使用安裝 ISO 時,可依 mdconfig(8) 中的說明掛載安裝媒體:

# mount -t cd9660 /dev/`mdconfig -f cdimage.iso` /mnt

從安裝媒體上的 Tarball 中取出 Binary 並放到宣告的位置,至少需要取出 Base set 的部份,若需要也可完整安裝。

只安裝基礎系統 (Base system):

# tar -xf /mnt/usr/freebsd-dist/base.txz -C $DESTDIR

安裝全部不含核心:

# for sets in BASE PORTS; do tar -xf /mnt/FREEBSD_INSTALL/USR/FREEBSD_DIST/$sets.TXZ -C $DESTDIR ; done

jail(8) 操作手冊說明的程序建置 Jail:

# setenv D /here/is/the/jail
# mkdir -p $D      1
# cd /usr/src
# make buildworld  2
# make installworld DESTDIR=$D  3
# make distribution DESTDIR=$D  4
# mount -t devfs devfs $D/dev   5

1

選擇 Jail 的位置是建置 Jail 最好的起點,這是在 Jail 主機上儲存 Jail 的實體位置。較好的選擇是 /usr/jail/jailname,其中 jailname 是用來辦識 Jail 的主機名稱。通常在 /usr/ 會有足夠的空間供 Jail 檔案系統使用,對 完整的 Jail 來說,便是複製 FreeBSD 基礎系統預設安裝的每一個檔案。

2

若您已經使用 make worldmake buildworld 重新編譯您的 Userland,您可以跳過這個步驟並安裝您已存在的 Userland 到新的 Jail。

3

這個指令將會在檔案系統中 Jail 所在的實體位置產生樹狀目錄及必要的 Binary、程式庫、操作手冊與相關檔案。

4

makedistribution 目標會安裝所有需要的設定檔。簡單來說,它會安裝所有 /usr/src/etc/ 中可安裝的檔案到 Jail 環境的 /etc目錄:$D/etc/

5

在 Jail 中掛載 devfs(8) 檔案系統並非必要的動作。從另一個角度來說,任何或大部份的應用程式會依該程式的目的會需要存取至少一個裝置,在 Jail 中控制存取的裝置非常重要,不恰當的設定可能會讓攻擊者可以在 Jail 中做不軌的事。對 devfs(8) 的控制是透過 Ruleset,在 devfs(8)devfs.conf(5) 操作手冊中有詳細說明。

Jail 安裝完成之後,便可使用 jail(8) 工具來啟動。jail(8) 工具需要四個必要參數,在 節 14.1, “概述” 有說明。其他參數也可能需要指定,例如要使用特定使用者的身份來執行要 Jail 的程序。command 參數依 Jail 的類型所需而定,對一個 虛擬系統 來說,/etc/rc 是不錯的選擇,因為該檔案可以模仿真實 FreeBSD 的啟動順序。對於 服務的 Jail 來說,則看在 Jail 中要執行的服務或應用程式來決定。

Jail 通常會需要隨著開機執行,使用 FreeBSD rc 機制可讓以簡單的達成這件事。

  1. 要在開機時啟動的 Jail 應加入到 rc.conf(5) 檔案中:

    jail_enable="YES"   # Set to NO to disable starting of any jails
    jail_list="www"     # Space separated list of names of jails

    注意:

    jail_list 中的 Jail 名稱只允許使用英數字元。

  2. 針對每個列在 jail_list 中的 Jail 圴需加入一組 rc.conf(5) 設定來描述指定的 Jail:

    jail_www_rootdir="/usr/jail/www"     # jail's root directory
    jail_www_hostname="www.example.org"  # jail's hostname
    jail_www_ip="192.168.0.10"           # jail's IP address
    jail_www_devfs_enable="YES"          # mount devfs in the jail

    rc.conf(5)中會假設 Jail 是完整的虛擬系統,預設會啟動 Jail 的 /etc/rc Script。針對服務的 Jail 則需設定適當的 jail_jailname_exec_start 選項來修改預設啟動的指令。

    注意:

    要取得完整可用選項的清單,請參考 rc.conf(5) 操作手冊。

若該 Jail 已經在 rc.conf 中設定,可以用 service(8) 來啟動或停止 Jail:

# service jail start www
# service jail stop www

Jail 可以使用 jexec(8) 來關機。先使用 jls(8) 來辦識 Jail 的 JID,然後使用 jexec(8) 在該 Jail 中執行關機 Script。

# jls
   JID  IP Address      Hostname                      Path
     3  192.168.0.10    www                           /usr/jail/www
# jexec 3 /etc/rc.shutdown

更多有關 Jail 的資訊可在 jail(8) 操作手冊取得。

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

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

關於本文件的問題,請洽詢 <doc@FreeBSD.org>。