2007年12月25日 星期二

檸檬紅茶開發首部曲

這時候肯定又要有人跳出來說話了。明明這個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服務?恩,這個嘛,下回再解。

沒有留言: