2008年3月10日 星期一

sftp + chroot (by rssh)

對於apache的應用上,有個很大的幫手ftp。不管你想要編修網頁,或是上傳檔案,你一定需要ftp來幫上這個大忙。但是ftp實在是很不安全的通訊方式,最好是改成採用ssh的子系統:sftp。

sftp是包含在ssh通訊中的一個ftp類介面,不同於於傳統ftp的不只是不開啟port 21/20傳輸資料,更重要的是它過程都用ssh 包裝起來,具有防止竊聽的基本能力,而且對防火牆設定上,你不需要多開port 21/20,而只需要打開port 22。

不過sftp連線進入系統後,使用者就有如進入家一樣,依照本身的權限可以摸到檔案系統裡的任何東西,包含其他人沒設定好權限的電子郵件,如果他有意願而且知道在哪裡。所以這需要另一個技術,chroot。chroot基本上就是良深打造一個「貴賓室」,讓貴賓一進門的時候就待在接待中心,沒有後門通到後面的工地去。在這個chroot環境中,被限制住的使用者所用的/根目錄就不是主機本系統的/,而有可能是/home/foo之類的目錄。這樣使用者就無法超出這個chroot環境去看到他不該看到的東西。要完成這件事,你可以選擇rssh。

解釋完基本概念,首先我們就來安裝rssh

cd /usr/ports/shells/rssh ; make install

然後你就安裝完了rssh,不過接下來就需要靠自己。基本上要先修改/urs/local/etc/rssh.conf,你可以研讀裡面的設定。你可以把所有使用者統統引導到你想要的chroot path底下去,也可以讓不同使用者摸到不同的區段,有如瞎子摸象一般。以我來說,我希望有一個$user可以存取apache的網站,這樣讓我的Dreamweaver可以直接編輯網頁。但是我不希望$user離開/usr/local/www/apache22這個目錄去閒逛。很顯然我的$chroot_path就是/usr/local/www/apache22。

首先你要新增一使用者$user,家目錄設定隨意($chroot_path),shell一定要指定為rssh。

接下來確認$user在rssh.conf裡面是否有確定的設定,以及群組的設定(如加入www群組)。然後我們就要進入蓋碉堡的階段,要製造出一個貴賓室,裡面剛好夠執行sftp。

cd $chroot_path
mkdir -p usr/bin usr/libexec usr/local/libexec usr/lib lib libexec bin dev etc
cp /usr/bin/scp usr/bin/
cp /usr/libexec/sftp-server  usr/libexec/
cp /usr/local/libexec/rssh_chroot_helper  usr/local/libexec/

搬好了基本程式以後,千萬不要忘記程式的函式庫。為了確認這點,所以我們要用ldd來確認

ldd /usr/bin/scp
ldd /usr/bin/sftp

得到的結論就是

cp /usr/lib/libssh.so.3 /usr/lib/libgssapi.so.8 /usr/lib/libkrb5.so.8
/usr/lib/libasn1.so.8 /usr/lib/libcom_err.so.3 /usr/lib/libroken.so.8
usr/lib/
cp /lib/libcrypt.so.3 /lib/libcrypto.so.4 /lib/libz.so.3 /lib/libc.so.6
/lib/libmd.so.3 lib/

然後繼續複製重要的輔助

cp /libexec/ld-elf.so.1 libexec/
cp /bin/sh bin/

接著幫這個chroot環境製造出/dev這個檔案系統,不然在裡面執行的程式將會沒有stdin、stderr這種超基礎建設。

echo "none $chroot_path devfs   rw 0 0" >> /etc/fstab
echo "devfs_set_rulesets="$chroot_path/dev=devfsrules_jail"" >> /etc/rc.conf

不過在本機的例子,要注意的是因為blacktea本身就已經是個被chroot過的jail,在裡面又在疊一層chroot,所以在fstab裡面你所寫的參數傳遞給mount時,就會出現「認知落差」。這時候你要在fstab寫出完整的、真實的路徑才能成功掛載devfs。

然後我們要幫這個環境製造出一個保全的密碼檔。方法不難:

grep $user /etc/passwd etc/passwd
grep $user /etc/master.passwd etc/passwd

pwd_mkdb -d $chroot_path/etc
$chroot_path/etc/master.passwd

這樣製造出只有一個使用者的密碼檔(呵!裡面沒有牽拖到其他任何使用者,所以失竊的結果就是只有一個人倒楣)。測試的方法就是從別機器用sftp $user@$host ,就可以看看這個chroot有沒有囚著自己。

不過上述的方法有個缺點,就是如果你make world 升級後,有可能產生程式的連結不同步。所以要手動的再次複製函式庫。解決的辦法就是寫個script 吧!

附記述一點,如果你要讓Dreamweaver使用sftp連線方式,你還要修改/etc/ssh/ssd_config 這個設定檔,將PasswordAuthentication yes。這樣就可以用Dreamwaever來吸下整個網站回本機編輯啦!

還有一個用法,如果你覺得Gallery2的上傳方式有檔案大小的限制,也可以使用上述方法建立一個專門帳號及chroot到一個"dropzone",然後到Gallery2介面裡設定,就可以直接抓各種支援格式的檔案到Gallery裡面。

沒有留言: