這時候肯定又要有人跳出來說話了。明明這個blog的名字、Domain Name是紅茶Blacktea,這又跟檸檬紅茶有啥關係?
喔,簡單的說,紅茶裡面加點檸檬,就是檸檬紅茶了。加了奶,我們就說是奶茶,如果再來點珍珠,這就是珍珠奶茶了。所以說紅茶比較偉大,檸檬不算什麼。而且檸檬不可以跟奶一起攪和,這就是三種茶的基本定位。
鬼扯淡,當然不是這麼簡單。 ok,主機名字的確是LemonTea,同時也看起來是BlackTea。如何辦到?對不起,跟你猜想的不一樣,我還沒有啟用apache的虛擬網域。而是使用FreeBSD的jail(8)技術。在jail之前, 有個簡單的技術叫做chroot(8),就是變更程式的存取根目錄起點,最簡單的目的就是為了ftp程式的安全。如果你開一個公共的ftp,並且提供上傳服務,你不會希望任何有上傳權限的人可以遊走超出他的上傳區,比如說他可以遊走到/etc然後下載master.passwd,然後修改toor帳號後回傳,省了你幫他開帳號的時間。
而jail比較變態一點,基本上它的所有程序都是跟系統程序一起跑的,沒有任何模擬,變態的是它虛擬了一個"假的系統",jail使用者基本上無法逃獄,除非管理者的刻意放水。而這個優點就是可以得到幾乎就像是在原生系統一樣的執行效率,缺點是你比較難對它的使用資源作總量管制。
所以我在lemontea主機上開始建立第一個jail隔離所,用來把APACHE及相關服務與主系統隔離。而這個隔離所的名字就是blacktea。
不過本篇的主要重點是檸檬紅茶的開發過程,那勉強把jail的創建與網路設定寫在這章好了。
jail的運行需要的基礎設定是
1.一個ip位址
2.一個主機名稱(hostname)
3.存取的目錄基礎點
在手冊裡,使用setenv這個tcsh內建的設定環境變數功能來簡化指令(當然你也可以愛用set)。這樣作有很大的好處,就是可以流暢你的思考邏輯,不用老是花時間亂敲一長串的目錄位址,然後打錯字。等改正錯字,又忘記剛剛是要幹啥來著...。假設你要把jail整個目錄放在/home/jail001,那只要
setenv dir /home/jail001
接下來使用echo驗證一下變數有沒有正確
echo $dir
是的,如果你是初學者,就會發現宣告變數只要直接打,而以後存取一律要使用$開頭,這樣shell才會知道這是變數。
接下來
mkdir -p $dir
如果你有參考過書籍裡面如何對FreeBSD升級、編譯核心一章,那就對於make world見過面,有點熟囉。而make world有一個特殊參數,是用來搞jail的:
cd /usr/src
make world DESTDIR=$dir
至此系統會把監獄裡面的各種基礎設施建設起來,比如說建築物的大小,圖書館(函式庫)。不過裡面還空空的,沒有設定檔。如果你像我一樣把CMOS時間設定為CST(就是中原標準時間),你很可能會就會被Error Code 1轟炸。解決方法就是adjkerntz -i。
cd /usr/src/etc
make distribution DESTDIR=$dir
接下來只需要裝置節點製造出來,基本上只需要硬掛,script就會搞出來。
mount_devfs devfs $dir/dev
以前的書會說用MAKEDEV來創建裝置節點,但是現在的新版FreeBSD根本沒有MAKEDEV這個Script,而另有其他script負責。
然後我們就可以準備進監獄....喔,是進去設定。假設你把ip位址是alias在網卡xl0上:
ifconfig xl0 alias 172.16.64.10
有書建議把alias動作加入/etc/rc.conf,但是我發現在jail區塊設定好以後,啟動jail就會自動去alias,不勞多此一舉。
/dev掛上以後,接下來要掛上/proc,來管理各執行緒。
mount -t procfs proc $dir/proc
然後辦完手續,終於要入獄了...
jail $dir jailname 172.16.64.10 /bin/tcsh
這是用jail指令要求以上述參數值給個tcsh用用,滿流氓的行為....等會而設定好ssh,以後就可以用ssh連線進入(好像也沒有別的辦法了)。
首先入獄第一件事,建立/etc/rc.conf
portmap_enable="NO"
network_interfaces=""
ssh_enable="YES"
然後開始到處作假貨騙人(主要也是有些程式的特殊癖好要求)
ln -s /dev/null kernel
touch /etc/fstab
下一步,因為sendmail會抱怨找不到alias資料庫,所以手動一下
newalias
然後重要的一件事,請更改密碼、創建ssh連線帳號
passwd root && adduser
然後隨你高興,你可以調整時鐘。你也知道,坐牢最重要的,是要有個滴答響的、準時的時鐘。第一次試著啟動jail可以用這指令
jail $dis jailname jail'sIP /bin/sh /etc/rc
如果你發現jail運行的很正常,可以ssh連線進入,那麼就可以參考/etc/default/rc.conf裡面jail的設定修改自己的/etc/rc.conf,像lemontea 的設定檔是
##############################################################
### Jail Configuration #######################################
##############################################################jail_enable="YES" # Set to NO to disable starting of any jails
jail_list="blacktea" # milktea"
# Space separated list of names of jails
jail_set_hostname_allow="NO"
# Allow root user in a jail to change its hostname
# 千萬不要讓jail的使用者自己改名
jail_socket_unixiproute_only="YES"
# Route only TCP/IP within a jail
# 其他任何通訊方式都是不允許的
jail_sysvipc_allow="NO" # Allow SystemV IPC use from within a jail
# 覺得jail應該共享記憶體嗎
#
# To use rc's built-in jail infrastructure create entries for
# each jail, specified in jail_list, with the following variables.
# NOTES:
# global jail variables if you don't specify a jail name (ie. jail_interface).# First Jail==================== 第一示範監獄 #####
jail_blacktea_rootdir="/home/blacktea" # Jail's root directory
jail_blacktea_hostname="blacktea" # Jail's hostname
jail_blacktea_ip="172.16.64.10" # Jail's IP number
jail_blacktea_interface="xl0" # Interface to create the IP alias on
#jail_blacktea_interface="lo0" # Interface to create the IP alias on
jail_blacktea_exec_start="/bin/sh /etc/rc"
# command to execute in jail for starting
jail_blacktea_exec_stop="/bin/sh /etc/rc.shutdown"
# command to execute in jail for stopping
jail_blacktea_devfs_enable="YES" # mount devfs in the jail
#jail_blacktea_fdescfs_enable="NO" # mount fdescfs in the jail
jail_blacktea_procfs_enable="YES" # mount procfs in jail
#jail_blacktea_mount_enable="NO" # mount/umount jail's fs
#jail_blacktea_devfs_ruleset="ruleset_name" # devfs ruleset to apply to jail
#jail_blacktea_fstab="" # fstab(5) for mount/umount
jail_blacktea_flags="-l -U root" # flags for jail(8)
這樣你只需要再主機lemontea用啟動稿/etc/rc.d/jail stop(or start)就可以啟動、關閉監獄。這倒是挺方便的,有個滿容易開關機的方法。
不過如果你眼睛很尖,發現blacktea怎麼是使用私有的IP,卻又提供blog服務?恩,這個嘛,下回再解。
沒有留言:
張貼留言