1、准備基本的chroot環境 在進入chroot環境之前要先准備好相應的設置,在本例中我們打算將ftpd chroot到/var/chroot目錄中。 因為系統自帶的ftpd在/usr/libexec/目錄,所以我們需要在/var/chroot中執行以下操作: matthew@bsd# mkdir -p /var/chroot/usr/lib
1、准備基本的chroot環境 在進入chroot環境之前要先准備好相應的設置,在本例中我們打算將ftpd chroot到/var/chroot目錄中。
因為系統自帶的ftpd在/usr/libexec/目錄,所以我們需要在/var/chroot中執行以下操作:
matthew@bsd# mkdir -p /var/chroot/usr/libexec
然後將ftpd復制到該目錄中:
matthew@bsd# install -C /usr/libexec/ftpd /var/chroot/usr/libexec
接下來要做的就是將ftpd需要的庫也復制到chroot目錄中,我們可以使用ldd來檢測ftpd運行時需要哪些庫:
matthew@bsd# ldd /usr/libexec/ftpd
/usr/libexec/ftpd:
libskey.so.2 => /usr/lib/libskey.so.2 (0x28074000)
libmd.so.2 => /usr/lib/libmd.so.2 (0x2807b000)
libcrypt.so.2 => /usr/lib/libcrypt.so.2 (0x28084000)
libutil.so.3 => /usr/lib/libutil.so.3 (0x2809d000)
libpam.so.1 => /usr/lib/libpam.so.1 (0x280a6000)
libc.so.4 => /usr/lib/libc.so.4 (0x280af000)
ldd的運行結果顯示了ftpd運行時需要庫,現在我們只要把這些庫安裝到我們的chroot的相應目錄中便可:
matthew@bsd# mkdir -p /var/chroot/usr/lib
matthew@bsd# install -C /usr/lib/libskey.so.2 /var/chroot/usr/lib
matthew@bsd# install -C /usr/lib/libmd.so.2 /var/chroot/usr/lib
matthew@bsd# install -C /usr/lib/libcrypt.so.2 /var/chroot/usr/lib
matthew@bsd# install -C /usr/lib/libutil.so.3 /var/chroot/usr/lib
matthew@bsd# install -C /usr/lib/libpam.so.1 /var/chroot/usr/lib
matthew@bsd# install -C /usr/lib/libc.so.4 /var/chroot/usr/lib
2、第一次進入chroot環境 現在我們可以試試看ftpd能不能在我們的chroot環境中運行:
matthew@bsd# chroot /var/chroot /usr/libexec/ftpd
ELF interpreter /usr/libexec/ld-elf.so.1 not found
程序出錯,根據提示在/usr/libexec中還缺少文件ld-elf.so.1,由於我們的ftpd是在chroot環境中運行,所以我們應該將ld-elf.so.1復制到我們的chroot環境中,即/var/chroot/usr/libexec中:
matthew@bsd# install -C /usr/libexec/ld-elf.so.1 /var/chroot/usr/libexec
現在我們再次試著進入我們的chroot環境:
matthew@bsd# chroot /var/chroot /usr/libexec/ftpd
這次沒有任何提示說明我們的運行庫已經准備好了,但是由於ftpd在不帶-D參數的時候運行完後就會自動退出,所以現在我們還無法從遠程登錄ftp服務,那麼我們試著在ftpd後面加上參數-D:
matthew@bsd# chroot /var/chroot /usr/libexec/ftpd -D
結果與上次一樣,通過查閱chroot(8)的手冊,我們可以看到chroot的語法是:
chroot newroot [command]
也就是說command後面不能帶參數,即然這樣我們就寫一個簡單的shell腳本來運行ftpd,這個腳本命名為ftpd.sh,存放於/var/chroot/usr/libexec中,內容為:
#!/bin/sh
/usr/libexec/ftpd -D -4
由於我們不需要支持IPv6,所以這裡加上了參數-4只對IPv4提供支持,當然你也可以加上一些其它參數。
接下來為腳本加上執行權限:
matthew@bsd# chmod a+x /var/chroot/usr/libexec/ftpd.sh
為了要運行這個腳本程序,我們還需要將/bin/sh復制到我們的chroot環境中:
matthew@bsd# mkdir /var/chroot/bin
matthew@bsd# install -C /bin/sh /var/chroot/bin
接下來我們就要為chroot環境准備/etc目錄了。首先要復制的就是/etc/services文件,因為它定義了ftpd使用的端口號和協議:
matthew@bsd# mkdir /var/chroot/etc
matthew@bsd# cp /etc/services /var/chroot/etc
因為需要驗證用戶,所以需要復制master.passwd和group:
matthew@bsd# cp /etc/group /var/chroot/etc
matthew@bsd# cp /etc/master.passwd /var/chroot/etc
編輯/var/chroot/etc/master.passwd和/var/chroot/etc/group,刪除不需要使用ftp的用戶和不必要的組,注意,當更改了master.passwd後一定要使用pwd_mkdb來生成密碼
數據庫,由於此時我們需要將密碼數據庫文件存放在/var/chroot/etc中,而不是默認/etc中,所以在pwd_mkdb後面加上-d參數來指定數據庫存放位置:
matthew@bsd# pwd_mkdb -d /var/chroot/etc /var/chroot/etc/master.passwd
此時如果執行成功的話你將看到在/var/chroot/etc/目錄中多了兩個文件:pwd.db、spwd.db。
讓我們再次進入我們的chroot環境:
matthew@bsd# chroot /var/chroot /usr/libexec/ftpd.sh
現在我們便可以登錄到我們的這個chroot的ftp
服務器了。
3、結尾工作 為每一個用戶建立home目錄,注意是在建在/var/chroot/home之中。
在/var/chroot/etc/中生成ftpusers文件,將禁止登錄ftp的用戶的用戶名加入其中,以禁止部分用戶登錄。
在/var/chroot/etc/中生成ftpchroot文件,它的作用是限制用戶只能訪問自己的home目錄中的文件,而不能訪問home外的任何內容。將你要限制的用戶的用戶名加入其中。
在/var/chroot/etc/中生成ftpwelcome文件,它的作用是當用戶連接上我們的服務器的時候顯示歡迎信息。
在/var/chroot/etc/中生成ftpmo
td文件,它的作用是當用戶登錄進服務器的時候顯示歡迎信息。