CC="egcs"
CFLAGS="-O9 -funroll-loops -ffast-math -malign-double -mcpu=pentiumpro -march=pentiumpro -fomit-frame-
pointer -fno-exceptions"
./configure
--prefix=/usr
--sysconfdir=/etc
--localstatedir=/var
--disable-dnsretry
--enable-quota
--enable-pam
--disable-daemon
--disable-newlines
--disable-virtual
--disable-plsm
--disable-pasvip
--disable-anonymous
--enable-ls
--enable-numericuid
這些編譯參數告訴編譯器如何編譯wu-ftpd:
不要用失敗的DNS查詢
加入對定額(QUOTA)的支持(如果OS支持)
加入對PAM的支持
不允許作為單獨的daemon運行
刪除過多的空行
不支持虛擬服務器
禁止PID加鎖睡眠消息(用于繁忙的站點)
被動連接的時候不要求用同樣的IP
不允許匿名ftp訪問
使用內部的“ls”命令(試驗性的)
內部的“ls”命令顯示UID而不顯示用戶名(為了提高速度)
用下面的命令編譯和安裝軟件:
make
make install
install -m 755 util/xferstats /usr/sbin
touch /var/log/xferlog
chmod 600 /var/log/xferlog
cd /usr/sbin
ln -sf in.ftpd /usr/sbin/wu.ftpd
ln -sf in.ftpd /usr/sbin/in.wuftpd
strip /usr/bin/ftpcount
strip /usr/bin/ftpwho
strip /usr/sbin/in.ftpd
strip /usr/sbin/ftpshut
strip /usr/sbin/ckconfig
strip /usr/sbin/ftprestart
上面的“make”和“make install”可以配置軟件以保證系統中有編譯所需要的函數庫,然后把所有的源文件都編譯成可執行的二進制文件,最后把二進制文件和配置文件安裝到相應的目錄里。
“install –m”安裝“xferstats”程序,用于統計傳輸了多少文件?!皌ouch”命令為xferstats在“/var/log”目錄下創建日志文件?!癱homod”把“xferlog”的權限改為只對超級用戶“root”可讀和可寫。接著,我們為“in.ftpd”二進制文件創建符號鏈接。最后,用“strip”命令減小所有二進制文件的大小以提高wu-ftpd的性能。
清除不必要的文件
[root@deep]# cd /var/tmp
[root@deep]# rm -rf wu-ftpd-version/ wu-ftpd-version.tar.gz
[page]
“rm”命令刪除所有編譯和安裝wu-ftpd所需要的源程序,并且把wu-ftpd軟件的壓縮包刪除掉。
為FTP站點的用戶建立沒有shell的帳號
首先,創建一個新的用戶,這個用戶被允許連接到ftp服務器上。因為要有“chroot”的環境,這個帳號不同于正常的用戶帳號,不能受訪問限制?!癱hroot”使用戶產生這樣的感覺好像自己已經在文件系統的最頂層了。
第一步
用下面的命令在“/etc/passwd”文件中創建用戶。對于每個允許訪問ftp服務器的新用戶都要重復這個步驟。
[root@deep]# mkdir /home/ftp
[root@deep]# useradd -d /home/ftp/ftpadmin/ -s /dev/null ftpadmin > /dev/null 2>&1
[root@deep]# passwd ftpadmin
Changing password for user ftpadmin
New UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated suclearcase/" target="_blank" >ccessfully
第二步
編輯“/etc/shells”文件并加入一個空shell,如:null。這個假的shell可以限制用戶對ftp服務器的訪問。
[root@deep]# vi /etc/shells
/bin/bash
/bin/sh
/bin/ash
/bin/bsh
/bin/tcsh
/bin/csh
/dev/null ? This is our added no existent shell
第三步
現在編輯“/etc/passwd”文件,手工加上“/./”把“/home/ftp”目錄和“/ftpadmin”目錄分開,用戶“ftpadmin”會自動轉到(chdir)“/ftpadming”目錄下。在“passwd”文件中每添加一個ftp用戶都要重復這個步驟。
編輯“passwd”文件(vi /etc/passwd),把下面這一行改為:
ftpadmin:x:502:502::/home/ftp/ftpadmin/:/dev/null
改為:
ftpadmin:x:502:502::/home/ftp/./ftpadmin/:/dev/null
帳號為“ftpadmin”,這這個帳號的家目錄有一些奇怪。第一部分“/home/ftp/”表示“chroot”時作為根目錄的目錄。被點號分開的“/ftpadmin”表示當登錄ftp服務器的時候會自動轉到這個目錄?!?dev/null”這個空shell不允許“ftpadmin”像正常用戶那樣登錄。經過這些改變,“ftpadmin”用戶用的不是真正的shell而是偽shell,這樣訪問ftp服務器就受到限制。 創建一個“chroot”用戶環境
先要創建一個簡單的根文件系統(root file system),包含有足夠的文件,如果二進制程序、口令文件,等等。當用戶登錄的時候,Unix就可以改變根文件系統(chroot)。注意一下,如果編譯的時候象上面那樣加上“--enable-ls”參數,“/home/ftp/bin”和“/home/ftp/lib”兩個目錄就可以不要了,因為WU-FTP會用自己帶的“ls”。不過我們還是介紹一下舊的方法,也就是把“/bin/ls”拷貝到“/home/ftp/bin”(chroot之后就是“/bin”)目錄下,然后把相關的運行庫拷貝到“/home/ftp/lib”目錄下。
[page]
第一步
創建改變根文件系統(chrooted)環境所需要的所有的目錄:
[root@deep]# mkdir /home/ftp/dev
[root@deep]# mkdir /home/ftp/etc
[root@deep]# mkdir /home/ftp/bin (require only if you are not using the “--enable-ls” option)
[root@deep]# mkdir /home/ftp/lib (require only if you are not using the “--enable-ls” option)
第二步
把新目錄的權限設成0511:
[root@deep]# chmod 0511 /home/ftp/dev
[root@deep]# chmod 0511 /home/ftp/etc
[root@deep]# chmod 0511 /home/ftp/bin (require only if you are not using the “--enable-ls” option)
[root@deep]# chmod 0511 /home/ftp/lib (require only if you are not using the “--enable-ls” option)
上面這些“chmod”命令把chrooted之后的“dev”、“etc”、“bin”和“lib”目錄設置成超級用戶“root”可讀、可執行,用戶組和所有用戶可執行。
第三步
把“/bin/ls”文件拷貝到“/home/ftp/bin”目錄下,并把“ls”的權限改為0111(不運行用戶改變這個文件)。
[root@deep]# cp /bin/ls /home/ftp/bin (require only if you are not using the “--enable-ls” option)
[root@deep]# chmod 0111 /bin/ls /home/ftp/bin/ls (require only if you are not using the “--enable-ls” option)
第四步
找到“ls”程序所需的共享庫:
[root@deep]# ldd /bin/ls (require only if you are not using the “--enable-ls” option)
libc.so.6 => /lib/libc.so.6 (0x00125000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x00110000)
把共享庫拷貝到“/home/ftp/lib”目錄下:
[root@deep]# cp /lib/libc.so.6 /home/ftp/lib/ (require only if you are not using the “--enable-ls” option)
[root@deep]# cp /lib/ld-linux.so.2 /home/ftp/lib/ (require only if you are not using the “--enable-ls” option)
注意:如果想用Linux的“ls”程序而不是用WU-ftpd自帶的“ls”(編譯時加上“--enable-ls”參數),才需要第三和第四步。
第五步
創建“/home/ftp/dev/null”文件:
[root@deep]# mknod /home/ftp/dev/null c 1 3
[root@deep]# chmod 666 /home/ftp/dev/null
第六步
把“group”和“passwd”文件拷貝到“/home/ftp/etc”目錄下,然后再改變這兩個文件。
[root@deep]# cp /etc/passwd /home/ftp/etc/
[root@deep]# cp /etc/group /home/ftp/etc/
編輯“passwd”文件(vi /home/ftp/etc/passwd)把除了“root”和允許使用ftp的用戶之外的所有其它項刪掉。這對于改變根文件系統的環境很重要,改變之后的“passwd”文件會是象下面這樣的:
root:x:0:0:root:/:/dev/null
ftpadmin:x:502:502::/ftpadmin/:/dev/null
編輯“group”文件(vi /home/ftp/etc/group),把除了“root”和允許使用ftp的用戶之外的所有其它項刪掉。改變之后的“group”文件會是象下面這樣的:
root:x:0:root
ftpadmin:x:502:
配置
可以到這去下載“floppy.tgz”文件:http://pages.infinit.net/lotus1/doc/opti/floppy.tgz。把“floppy.tgz”文件解開之后,可以在相應的目錄下發現我們在這本書中介紹的所有軟件的配置文件。這樣就沒有必要手工重新生成這些文件,或者用拷貝粘貼的方法把它們粘貼到配置文件中去。不管是打算自己動手生成配置文件還是拷貝現成的,你都要學會自己修改配置文件并且把配置文件拷貝到正確的目錄下。下面將具體說明。
[page]
為了運行FTP服務器,必須創建或者把下面的文件拷貝到相應的目錄下:
把“ftpaccess”文件拷貝到“/etc”目錄下
把“ftpusers”文件拷貝到“/etc”目錄下
把“ftphosts”文件拷貝到“/etc”目錄下
把“ftpgroups”文件拷貝到“/etc”目錄下
把“ftpconversion”文件拷貝到“/etc”目錄下
把“ftp”文件拷貝到“/etc/pam.d”目錄下
把“ftpd”文件拷貝到“/etc/logrotate.d”目錄下
可以把“floppy.tgz”解壓之后,找到上面列出來的文件,并拷貝到相應的目錄下,或者用拷貝粘貼的方法從本書中直接粘貼出。
配置“/etc/ftpaccess”文件
“/etc/ftpaccess”文件是用來配置“ftpd”的。這個文件主要是設置允許哪個用戶、多少用戶訪問ftp服務器,以及一些安全方面的問題。配置文件的每一行或者定義一個屬性或者設定一個屬性值,。對于非匿名的“chroot”訪問,必須創建一些“guestgroup”,每一個都要對應“/home/ftp/etc/group”文件中的項。
創建ftpaccess文件(touch /etc/ftpaccess),在文件中加入:
class openarch guest 208.164.186.*
limit openarch 20 MoTuWeTh,Fr0000-1800 /home/ftp/.too_many.msg
email admin@openarch.com
loginfails 3
readme README* login
readme README* cwd=*
message /home/ftp/.welcome.msg login
message .message cwd=*
compress yes all
tar yes all
chmod yes guest
delete yes guest
overwrite yes guest
rename yes guest
log commands real,guest
log transfers real,guest inbound,outbound
guestgroup ftpadmin
guestgroup webmaster
# We don‘t want users being able to upload into these areas.
upload /home/ftp/* / no
upload /home/ftp/* /etc no
upload /home/ftp/* /dev no
# We‘ll prevent downloads with noretrieve.
noretrieve /home/ftp/etc
noretrieve /home/ftp/dev
log security real,guest
guest-root /home/ftp ftpadmin webmaster
restricted-uid ftpadmin webmaster
restricted-gid ftpadmin webmaster
greeting terse
Keepalive yes
noretrieve .notar
現在把文件的權限設成600:
[root@deep]# chmod 600 /etc/ftpaccess
下面解釋配置文件中的設置:
class
“class”用來定義一個允許訪問ftp服務器的用戶類別??梢远x任意多的類別(class)。每一個“class”行的格式如下:
class <classname> <typelist> <addrglob>
?。糲lassname>是class的名字,<typelist>是允許加到類別(class)中的用戶類型,<addrglob>是這個class允許的IP地址范圍。
?。紅ypelist>中的項是用逗號隔開的,每一個項有三種可能的取值:anonymous、guest或real。anonymous用戶是用anonymous或ftp帳號訪問ftp服務器而且只需要訪問公用文件的那些用戶。guest用戶有一些特殊因為他們在系統中沒有帳號,但是卻又是guest組的成員。real用戶必須在FTP服務器上有帳號,而且需要經過服務器的安全驗證。
[page]
<addrglob>可以用通配符,例如:“*”表示所有的站點。下面這一行:
class openarch guest 208.164.186.*
表示只有在系統中有自己帳號的guest用戶而且IP地址為“208.164.186.*”才能訪問ftp服務器。
limit
“limit”根據class和時間范圍來限制登錄ftp服務器的用戶數?!發imit”的格式是:
limit <class> <n> <times> <message_file>
其中<class>是受限制的類別(class),<n>表示在這個類別中受到限制的最多用戶數,<times>表示“limit”有效的時間段,<message_file>是當達到最大的用戶數目的時候,別的用戶還想登錄時顯示的信息。
?。紅imes>中的字符串用逗號隔開,每一個字串表示一天。星期一到星期日分別用Mo、Tu、We、Th、Fr、Sa和Su表示,周末也可以用Wk表示。表示時間的小時和分鐘之間不要用冒號隔開?!?”用來表示范圍。
例如,限制“openarch”這個類別,最多可以有20個用戶,訪問時間是星期一道星期四全天,星期五從半夜到下午六點。用下面這一行來表示: limit openarch 20 MoTuWeTh,Fr0000-1800 /home/ftp/.too_many.msg
如果一旦達到最大的用戶數,還有別的用戶想連接ftp服務器,就會把“/home/ftp/.too_mang.msg”中的信息傳給用戶。
loginfails
“loginfails”設置最多允許的登錄失敗的次數??梢杂孟旅孢@一行來表示:
loginfails <n>
?。糿>表示最多允許的登錄失敗的次數。例如,只允許失敗兩次可以這樣表示:
loginfails 3
readme
“readme”設置在什么條件下,一旦當前目錄中的文件發生了變化需要提醒用戶。
這個命令的格式為:
readme <path> <when>
?。紁ath>是用來提醒用戶的文件的名字(例如:README),<when>設置出現這個提示信息的條件。
?。紈hen>可以為下面兩種形式:LOGIN或CWD=<dir>。如果為LOGIN,當用戶成功登錄的時候就會出現提示信息。如果為CWD=<dir>,當用戶進入<dir>目錄的時候就會有提示信息。
請記住當給匿名(anonymous)用戶設置提示信息的路徑的時候,這個路徑必須是相對于匿名ftp目錄。