本文檔基于RedHat Linux 9和VSFTPD-1.1.3-8。如果有不同版本,則有專門文字說(shuō)明。
1、VSFTPD簡(jiǎn)述
如果試問(wèn)哪種FTP服務(wù)器最安全?那么在UNIX和Linux中,首推的就是VSFTP(Very Secure FTP Daemon,非常安全的FTP服務(wù)器)。顧名思義,VSFTPD設(shè)計(jì)的出發(fā)點(diǎn)就是安全性。同時(shí)隨著版本的不斷升級(jí),VSFTPD在性能和穩(wěn)定性上也取得了極大的進(jìn)展。象RedHat、SUSE、Debian、GNU、GNOME、KDE等一些大型站點(diǎn)都采用VSFTPD作為它們的FTP服務(wù)器。大家可以到http://vsftpd.beasts.org/了解它的最新情況。
2、VSFTPD的安裝
2.1、RHL9+vsftpd-.1.1.3-8.i386.rpm包的安裝
VSFTPD的安裝很簡(jiǎn)單。在RHL9中,在圖形界面下依次執(zhí)行“Main Menu”-“System Settings”-“Add/Remove Applications”-選擇FTP服務(wù)器-“更新”,或者在字符界面中執(zhí)行以下命令,就可以完成安裝。
rpm -ivh vsftpd-1.1.3-8.i386.rpm
2.2、vsftpd-1.2.0.tar.gz的安裝
⑴準(zhǔn)備條件
VSFTPD默認(rèn)配置中需要“nobody”用戶。在系統(tǒng)中添加此用戶,如果用戶已經(jīng)存在,useradd命令有相應(yīng)提示。
[root@hpe45 root]# useradd nobody
useradd: user nobody exists
VSFTPD默認(rèn)配置中需要“/usr/share/empty”目錄。在系統(tǒng)中此目錄,如果目錄已經(jīng)存在,mkdir命令有相應(yīng)提示。
[root@hpe45 root]# mkdir /usr/share/empty/
mkdir: cannot create directory '/usr/share/empty': File exists
VSFTPD提供匿名FTP服務(wù)時(shí),需要“ftp”用戶和一個(gè)有效的匿名目錄。
[root@hpe45 root]# mkdir /var/ftp/
[root@hpe45 root]# useradd -d /var/ftp ftp
接下來(lái)的操作對(duì)于ftp用戶是否已經(jīng)存在都是有用的。
[root@hpe45 root]# chown root.root /var/ftp
[root@hpe45 root]# chmod og-w /var/ftp
⑵編譯VSFTPD
從官方站點(diǎn)下載到/root目錄,執(zhí)行以下命令:
[root@hpe45 root]# tar zxvf vsftpd-1.2.0.tar.gz
[root@hpe45 root]# cd vsftpd-1.2.0
[root@hpe45 vsftpd-1.2.0]# make
⑶安裝編譯好的VSFTPD
執(zhí)行“make install”將編譯好的二進(jìn)制文件、手冊(cè)等復(fù)制到相應(yīng)目錄。在RHL9上,可能需要手動(dòng)執(zhí)行以下復(fù)制:
[root@hpe45 vsftpd-1.2.0]# cp vsftpd /usr/local/sbin/vsftpd
[root@hpe45 vsftpd-1.2.0]# cp vsftpd.conf.5 /usr/local/share/man/man5
[root@hpe45 vsftpd-1.2.0]# cp vsftpd.8 /usr/local/share/man/man8
此外,“make install”沒有復(fù)制簡(jiǎn)單的配置文件,建議執(zhí)行以下命令:
[root@hpe45 vsftpd-1.2.0]# cp vsftpd.conf /etc
⑷為本地用戶設(shè)置PAM
如果允許本地用戶登錄VSFTPD,執(zhí)行以下操作:
[root@hpe45 vsftpd-1.2.0]# cp RedHat/vsftpd.pam /etc/pam.d/ftp
3、VSFTPD的文件結(jié)構(gòu)
VSFTPD的文件結(jié)構(gòu)是很簡(jiǎn)潔的,主要包括:
/usr/sbin/vsftpd ---- VSFTPD的主程序
/etc/rc.d/init.d/vsftpd ---- 啟動(dòng)腳本
/etc/vsftpd/vsftpd.conf ---- 主配置文件
/etc/pam.d/vsftpd ---- PAM認(rèn)證文件
/etc/vsftpd.ftpusers ---- 禁止使用VSFTPD的用戶列表文件
/etc/vsftpd.user_list ---- 禁止或允許使用VSFTPD的用戶列表文件
/var/ftp ---- 匿名用戶主目錄
/var/ftp/pub ---- 匿名用戶的下載目錄
此外,還有一些說(shuō)明文檔和手冊(cè)文件。
此外VSFTPD的日志文件位于/etc/logrotate.d/vsftpd.log。
4、VSFTPD的啟動(dòng)與停止
VSFTPD可以單獨(dú)(Standalone)方式運(yùn)行,如同httpd、named這類的服務(wù)器的運(yùn)行方式,這是RHL9中默認(rèn)的方式;也可以采用xinetd方式運(yùn)行,這是RHL7.x、8中的默認(rèn)方式。具體的運(yùn)行方式由參數(shù)listen決定。從RHL中VSFTPD的運(yùn)行方式,也可以看出VSFTPD的逐步發(fā)展。
當(dāng)listen參數(shù)值為YES時(shí),RHL9中的默認(rèn)值,VSFTPD單獨(dú)運(yùn)行,我們可以使用腳本/etc/rc.d/init.d/vsftpd來(lái)啟動(dòng)、關(guān)閉以及重啟VSFTPD。命令如下:
/etc/rc.d/init.d/vsftpd start|stop|restart
如果說(shuō)在RHL9上,您還希望使用Xinetd啟動(dòng)VSFTPD的運(yùn)行方式,那么首先要將vsftpd.conf配置文件中的listen參數(shù)值改為NO。其次,生成一個(gè)/etc/xinetd.d/vsftpd文件,內(nèi)容如下:
service vsftpd
{
disable = no
socket_type = stream
wait = no
user = root
server = /usr/sbin/vsftpd
port = 21
log_on_success += PID HOST DURATION
log_on_failure += HOST
}
通過(guò)修改disable值為no或yes,并重新啟動(dòng)xinetd,從而啟動(dòng)或停止VSFTPD。
由于VSFTPD的單獨(dú)模式已經(jīng)擁有足夠的能力,所以后面6中討論到的應(yīng)用,都是以單獨(dú)模式來(lái)運(yùn)行的,而非Xinetd方式。
注:還可以直接執(zhí)行vsftpd來(lái)啟動(dòng)FTP服務(wù),關(guān)閉時(shí)使用“kill”命令。
[root@hpe45 root]# /usr/local/sbin/vsftpd &
5、VSFTPD的設(shè)置選項(xiàng)
VSFTPD的配置文件/etc/vsftpd/vsftpd.conf是個(gè)文本文件。以“#”字符開始的行是注釋行。每個(gè)選項(xiàng)設(shè)置為一行,格式為“option=value”,注意“=”號(hào)兩邊不能留空白符。除了這個(gè)主配置文件外,還可以給特定用戶設(shè)定個(gè)人配置文件,具體介紹見后。
VSFTPD包中所帶的vsftpd.conf文件配置比較簡(jiǎn)單,而且非常偏執(zhí)狂的(文檔自稱:-))。我們可以根據(jù)實(shí)際情況對(duì)其進(jìn)行一些設(shè)置,以使得VSFTPD更加可用。
5.1、連接選項(xiàng)
本部分主要是一些與建立FTP鏈接相關(guān)的選項(xiàng)。
5.1.1、監(jiān)聽地址與控制端口
listen_address=ip address
此參數(shù)在VSFTPD使用單獨(dú)(standalone)模式下有效。此參數(shù)定義了在主機(jī)的哪個(gè)IP地址上監(jiān)聽FTP請(qǐng)求,即在哪個(gè)IP地址上提供FTP服務(wù)。對(duì)于只有一個(gè)IP地址的主機(jī),不需要使用此參數(shù)。對(duì)于多址主機(jī),不設(shè)置此參數(shù),則監(jiān)聽所有IP地址。默認(rèn)值為無(wú)。
listen_port=port_value
指定FTP服務(wù)器監(jiān)聽的端口號(hào)(控制端口),默認(rèn)值為21。此選項(xiàng)在standalone模式下生效。
5.1.2、FTP模式與數(shù)據(jù)端口
FTP 分為兩類,PORT FTP和PASV FTP,PORT FTP是一般形式的FTP。這兩種FTP在建立控制連接時(shí)操作是一樣的,都是由客戶端首先和FTP服務(wù)器的控制端口(默認(rèn)值為21)建立控制鏈接,并通過(guò)此鏈接進(jìn)行傳輸操作指令。它們的區(qū)別在于使用數(shù)據(jù)傳輸端口(ftp-data)的方式。PORT FTP由FTP服務(wù)器指定數(shù)據(jù)傳輸所使用的端口,默認(rèn)值為20。PASV FTP由FTP客戶端決定數(shù)據(jù)傳輸?shù)亩丝凇ASV FTP這種做法,主要是考慮到存在防火墻的環(huán)境下,由客戶端與服務(wù)器進(jìn)行溝通(客戶端向服務(wù)器發(fā)出數(shù)據(jù)傳輸請(qǐng)求中包含了數(shù)據(jù)傳輸端口),決定兩者之間的數(shù)據(jù)傳輸端口更為方便一些。
port_enable=YES|NO
如果你要在數(shù)據(jù)連接時(shí)取消PORT模式時(shí),設(shè)此選項(xiàng)為NO。默認(rèn)值為YES。
connetc_from_port_20=YES|NO
控制以PORT模式進(jìn)行數(shù)據(jù)傳輸時(shí)是否使用20端口(ftp-data)。YES使用,NO不使用。默認(rèn)值為NO,但RHL自帶的vsftpd.conf文件中此參數(shù)設(shè)為YES。
ftp_data_port=port number
設(shè)定ftp數(shù)據(jù)傳輸端口(ftp-data)值。默認(rèn)值為20。此參數(shù)用于PORT FTP模式。
port_promiscuous=YES|NO
默認(rèn)值為NO。為YES時(shí),取消PORT安全檢查。該檢查確保外出的數(shù)據(jù)只能連接到客戶端上。小心打開此選項(xiàng)。
pasv_enable=YES|NO
YES,允許數(shù)據(jù)傳輸時(shí)使用PASV模式。NO,不允許使用PASV模式。默認(rèn)值為YES。
pasv_min_port=port number
pasv_max_port=port number
設(shè)定在PASV模式下,建立數(shù)據(jù)傳輸所可以使用port范圍的下界和上界,0 表示任意。默認(rèn)值為0。把端口范圍設(shè)在比較高的一段范圍內(nèi),比如50000-60000,將有助于安全性的提高。
pasv_promiscuous=YES|NO
此選項(xiàng)激活時(shí),將關(guān)閉PASV模式的安全檢查。該檢查確保數(shù)據(jù)連接和控制連接是來(lái)自同一個(gè)IP地址。小心打開此選項(xiàng)。此選項(xiàng)唯一合理的用法是存在于由安全隧道方案構(gòu)成的組織中。默認(rèn)值為NO。
pasv_address=
此選項(xiàng)為一個(gè)數(shù)字IP地址,作為PASV命令的響應(yīng)。默認(rèn)值為none,即地址是從呼入的連接套接字(incoming connectd socket)中獲取。
5.1.3 ASCII模式
默認(rèn)情況下,VSFTPD是禁止使用ASCII傳輸模式。即使FTP客戶端使用asc命令,指明要使用ASCII模式,但是,VSFTPD表面上接受了asc命令,而在實(shí)際傳輸文件時(shí),還是使用二進(jìn)制方式。下面選項(xiàng)控制VSFTPD是否使用ASCII傳輸模式。
ascii_upload_enable=YES|NO
控制是否允許使用ascii模式上傳文件,YES允許,NO不允許,默認(rèn)為NO。
ascii_download_enable=YES|NO
控制是否允許使用ascii模式下載文件,YES允許,NO不允許,默認(rèn)為NO。
5.2、性能與負(fù)載控制
5.2.1、超時(shí)選項(xiàng)
idle_session_timeout=
空閑(發(fā)呆)用戶會(huì)話的超時(shí)時(shí)間,若是超出這時(shí)間沒有數(shù)據(jù)的傳送或是指令的輸入,則會(huì)強(qiáng)迫斷線。單位為秒,默認(rèn)值為300。
data_connection_timeout=
空閑的數(shù)據(jù)連接的超時(shí)時(shí)間。默認(rèn)值為300 秒。
accept_timeout=numerical value
接受建立聯(lián)機(jī)的超時(shí)設(shè)定,單位為秒。默認(rèn)值為60。
connect_timeout=numerical value
響應(yīng)PORT方式的數(shù)據(jù)聯(lián)機(jī)的超時(shí)設(shè)定,單位為秒。默認(rèn)值為60。以上兩個(gè)選項(xiàng)針對(duì)客戶端的,將使客戶端空閑1分鐘后自動(dòng)中斷連接,并在中斷1分鐘后自動(dòng)激活連接。
5.2.2 負(fù)載控制
max_clients=numerical value
此參數(shù)在VSFTPD使用單獨(dú)(standalone)模式下有效。此參數(shù)定義了FTP服務(wù)器最大的并發(fā)連接數(shù),當(dāng)超過(guò)此連接數(shù)時(shí),服務(wù)器拒絕客戶端連接。默認(rèn)值為0,表示不限最大連接數(shù)。
max_per_ip=numerical value
此參數(shù)在VSFTPD使用單獨(dú)(standalone)模式下有效。此參數(shù)定義每個(gè)IP地址最大的并發(fā)連接數(shù)目。超過(guò)這個(gè)數(shù)目將會(huì)拒絕連接。此選項(xiàng)的設(shè)置將影響到象網(wǎng)際快車這類的多進(jìn)程下載軟件。默認(rèn)值為0,表示不限制。
anon_max_rate=value
設(shè)定匿名用戶的最大數(shù)據(jù)傳輸速度value,以Bytes/s為單位。默認(rèn)無(wú)。
local_max_rate=value
設(shè)定用戶的最大數(shù)據(jù)傳輸速度value,以Bytes/s為單位。默認(rèn)無(wú)。此選項(xiàng)對(duì)所有的用戶都生效。此外,也可以在用戶個(gè)人配置文件中使用此選項(xiàng),以指定特定用戶可獲得的最大數(shù)據(jù)傳輸速率。
步驟如下:
①在vsftpd.conf中指定用戶個(gè)人配置文件所在的目錄,如:
user_config_dir=/etc/vsftpd/userconf
②生成/etc/vsftpd/userconf目錄。
③用戶個(gè)人配置文件是在該目錄下,與特定用戶同名的文件,如:
/etc/vsftpd/userconf/xiaowang
④在用戶的個(gè)人配置文件中設(shè)置local_max_rate參數(shù),如:
local_max_rate=80000
以上步驟設(shè)定FTP用戶xiaowang的最大數(shù)據(jù)傳輸速度為80KBytes/s。
VSFTPD 對(duì)于速度控制的變化范圍大概在80%到120%之間。比如我們限制最高速度為100KBytes/s, 但實(shí)際的速度可能在80KBytes/s 到120KBytes/s 之間。當(dāng)然,若是線路帶寬不足時(shí),速率自然會(huì)低于此限制。
5.3 用戶選項(xiàng)
VSFTPD的用戶分為三類:匿名用戶、本地用戶(local user)以及虛擬用戶(guest)。
5.3.1、匿名用戶
anonymous_enable=YES|NO
控制是否允許匿名用戶登錄,YES允許,NO不允許,默認(rèn)值為YES。
ftp_username=
匿名用戶所使用的系統(tǒng)用戶名。默認(rèn)下,此參數(shù)在配置文件中不出現(xiàn),值為ftp。
no_anon_password=YES|NO
控制匿名用戶登入時(shí)是否需要密碼,YES不需要,NO需要。默認(rèn)值為NO。
deny_email_enable=YES|NO
此參數(shù)默認(rèn)值為NO。當(dāng)值為YES時(shí),拒絕使用banned_email_file參數(shù)指定文件中所列出的e-mail地址進(jìn)行登錄的匿名用戶。即,當(dāng)匿名用戶使用banned_email_file文件中所列出的e-mail進(jìn)行登錄時(shí),被拒絕。顯然,這對(duì)于阻擊某些Dos攻擊有效。當(dāng)此參數(shù)生效時(shí),需追加banned_email_file參數(shù)
banned_email_file=/etc/vsftpd.banned_emails
指定包含被拒絕的e-mail地址的文件,默認(rèn)文件為/etc/vsftpd.banned_emails。
anon_root=
設(shè)定匿名用戶的根目錄,即匿名用戶登入后,被定位到此目錄下。主配置文件中默認(rèn)無(wú)此項(xiàng),默認(rèn)值為/var/ftp/。
anon_world_readable_only=YES|NO
控制是否只允許匿名用戶下載可閱讀文檔。YES,只允許匿名用戶下載可閱讀的文件。NO,允許匿名用戶瀏覽整個(gè)服務(wù)器的文件系統(tǒng)。默認(rèn)值為YES。
anon_upload_enable=YES|NO
控制是否允許匿名用戶上傳文件,YES允許,NO不允許,默認(rèn)是不設(shè)值,即為NO。除了這個(gè)參數(shù)外,匿名用戶要能上傳文件,還需要兩個(gè)條件:一,write_enable參數(shù)為YES;二,在文件系統(tǒng)上,F(xiàn)TP匿名用戶對(duì)某個(gè)目錄有寫權(quán)限。
anon_mkdir_write_enable=YES|NO
控制是否允許匿名用戶創(chuàng)建新目錄,YES允許,NO不允許,默認(rèn)是不設(shè)值,即為NO。當(dāng)然在文件系統(tǒng)上,F(xiàn)TP匿名用戶必需對(duì)新目錄的上層目錄擁有寫權(quán)限。
anon_other_write_enable=YES|NO
控制匿名用戶是否擁有除了上傳和新建目錄之外的其他權(quán)限,如刪除、更名等。YES擁有,NO不擁有,默認(rèn)值為NO。
chown_uploads=YES|NO
是否修改匿名用戶所上傳文件的所有權(quán)。YES,匿名用戶所上傳的文件的所有權(quán)將改為另外一個(gè)不同的用戶所有,用戶由chown_username參數(shù)指定。此選項(xiàng)默認(rèn)值為NO。
chown_username=whoever
指定擁有匿名用戶上傳文件所有權(quán)的用戶。此參數(shù)與chown_uploads聯(lián)用。不推薦使用root用戶。
5.3.2、本地用戶
在使用FTP服務(wù)的用戶中,除了匿名用戶外,還有一類在FTP服務(wù)器所屬主機(jī)上擁有賬號(hào)的用戶。VSFTPD中稱此類用戶為本地用戶(local users),等同于其他FTP服務(wù)器中的real用戶。
local_enable=YES|NO
控制vsftpd所在的系統(tǒng)的用戶是否可以登錄vsftpd。默認(rèn)值為YES。
local_root=
定義所有本地用戶的根目錄。當(dāng)本地用戶登入時(shí),將被更換到此目錄下。默認(rèn)值為無(wú)。
user_config_dir=
定義用戶個(gè)人配置文件所在的目錄。用戶的個(gè)人配置文件為該目錄下的同名文件。個(gè)人配置文件的格式與vsftpd.conf格式相同。例如定義user_config_dir=/etc/vsftpd/userconf,并且主機(jī)上有用戶xiaowang,lisi,那我們可以在user_config_dir的目錄新增名為xiaowang、lisi的兩個(gè)文件。當(dāng)用戶lisi 登入時(shí),VSFTPD則會(huì)讀取user_config_dir下lisi這個(gè)文件中的設(shè)定值,應(yīng)用于用戶lisi。默認(rèn)值為無(wú)。
5.3.3、虛擬用戶
guest_enable=YES|NO
若是啟動(dòng)這項(xiàng)功能,所有的非匿名登入者都視為guest。默認(rèn)值為關(guān)閉。
guest_username=
定義VSFTPD的guest用戶在系統(tǒng)中的用戶名。默認(rèn)值為ftp。
5.4、安全措施
5.4.1、用戶登錄控制
pam_service_name=vsftpd
指出VSFTPD進(jìn)行PAM認(rèn)證時(shí)所使用的PAM配置文件名,默認(rèn)值是vsftpd,默認(rèn)PAM配置文件是/etc/pam.d/vsftpd。
/etc/vsftpd.ftpusers
VSFTPD禁止列在此文件中的用戶登錄FTP服務(wù)器。這個(gè)機(jī)制是在/etc/pam.d/vsftpd中默認(rèn)設(shè)置的。
userlist_enable=YES|NO
此選項(xiàng)被激活后,VSFTPD將讀取userlist_file參數(shù)所指定的文件中的用戶列表。當(dāng)列表中的用戶登錄FTP服務(wù)器時(shí),該用戶在提示輸入密碼之前就被禁止了。即該用戶名輸入后,VSFTPD查到該用戶名在列表,VSFTPD就直接禁止掉該用戶,不會(huì)再進(jìn)行詢問(wèn)密碼等后續(xù)步聚。默認(rèn)值為NO。
userlist_file=/etc/vsftpd.user_list
指出userlist_enable選項(xiàng)生效后,被讀取的包含用戶列表的文件。默認(rèn)值是/etc/vsftpd.user_list。
userlist_deny=YES|NO
決定禁止還是只允許由userlist_file指定文件中的用戶登錄FTP服務(wù)器。此選項(xiàng)在userlist_enable 選項(xiàng)啟動(dòng)后才生效。YES,默認(rèn)值,禁止文件中的用戶登錄,同時(shí)也不向這些用戶發(fā)出輸入口令的提示。NO,只允許在文件中的用戶登錄FTP服務(wù)器。
tcp_wrappers=YES|NO
在VSFTPD中使用TCP_Wrappers遠(yuǎn)程訪問(wèn)控制機(jī)制,默認(rèn)值為YES。
5.4.2、目錄訪問(wèn)控制
chroot_list_enable=YES|NO
鎖定某些用戶在自家目錄中。即當(dāng)這些用戶登錄后,不可以轉(zhuǎn)到系統(tǒng)的其他目錄,只能在自家目錄(及其子目錄)下。具體的用戶在chroot_list_file參數(shù)所指定的文件中列出。默認(rèn)值為NO。
chroot_list_file=/etc/vsftpd/chroot_list
指出被鎖定在自家目錄中的用戶的列表文件。文件格式為一行一用戶。通常該文件是/etc/vsftpd/chroot_list。此選項(xiàng)默認(rèn)不設(shè)置。
chroot_local_users=YES|NO
將本地用戶鎖定在自家目錄中。當(dāng)此項(xiàng)被激活時(shí),chroot_list_enable和chroot_local_users參數(shù)的作用將發(fā)生變化,chroot_list_file所指定文件中的用戶將不被鎖定在自家目錄。本參數(shù)被激活后,可能帶來(lái)安全上的沖突,特別是當(dāng)用戶擁有上傳、shell訪問(wèn)等權(quán)限時(shí)。因此,只有在確實(shí)了解的情況下,才可以打開此參數(shù)。默認(rèn)值為NO。
passwd_chroot_enable
當(dāng)此選項(xiàng)激活時(shí),與chroot_local_user選項(xiàng)配合,chroot()容器的位置可以在每個(gè)用戶的基礎(chǔ)上指定。每個(gè)用戶的容器來(lái)源于/etc/passwd中每個(gè)用戶的自家目錄字段。默認(rèn)值為NO。
5.4.3、文件操作控制
hide_ids=YES|NO
是否隱藏文件的所有者和組信息。YES,當(dāng)用戶使用"ls -al"之類的指令時(shí),在目錄列表中所有文件的擁有者和組信息都顯示為ftp。默認(rèn)值為NO。
ls_recurse_enable=YES|NO
YES,允許使用"ls -R" 指令。這個(gè)選項(xiàng)有一個(gè)小的安全風(fēng)險(xiǎn),因?yàn)樵谝粋€(gè)大型FTP站點(diǎn)的根目錄下使用"ls -R"會(huì)消耗大量系統(tǒng)資源。默認(rèn)值為NO。
write_enable=YES|NO
控制是否允許使用任何可以修改文件系統(tǒng)的FTP 的指令,比如STOR、DELE、RNFR、RNTO、MKD、RMD、APPE 以及SITE。默認(rèn)值為NO,不過(guò)自帶的簡(jiǎn)單配置文件中打開了該選項(xiàng)。
secure_chroot_dir=
這選項(xiàng)指向一個(gè)空目錄,并且ftp用戶對(duì)此目錄無(wú)寫權(quán)限。當(dāng)vsftpd不需要訪問(wèn)文件系統(tǒng)時(shí),這個(gè)目錄將被作為一個(gè)安全的容器,用戶將被限制在此目錄中。默認(rèn)目錄為/usr/share/empty。
5.4.4、新增文件權(quán)限設(shè)定
anon_umask=
匿名用戶新增文件的umask 數(shù)值。默認(rèn)值為077。
file_open_mode=
上傳檔案的權(quán)限,與chmod 所使用的數(shù)值相同。如果希望上傳的文件可以執(zhí)行,設(shè)此值為0777。默認(rèn)值為0666。
local_umask=
本地用戶新增檔案時(shí)的umask 數(shù)值。默認(rèn)值為077。不過(guò),其他大多數(shù)的FTP服務(wù)器都是使用022。如果您的用戶希望的話,可以修改為022。在自帶的配置文件中此項(xiàng)就設(shè)為了022。
5.5、提示信息
ftpd_banner=login banner string
此參數(shù)定義了login banner string(登錄歡迎語(yǔ)字符串)。用戶可以自行修改。預(yù)設(shè)值為無(wú)。當(dāng)ftpd_banner設(shè)置后,將取代系統(tǒng)原來(lái)的歡迎詞。
banner_file=/directory/vsftpd_banner_file
此項(xiàng)指定一個(gè)文本文件,當(dāng)使用者登入時(shí),會(huì)顯示此該文件的內(nèi)容,通常為歡迎話語(yǔ)或是說(shuō)明。默認(rèn)值為無(wú)。與ftpd_banner相比,banner_file是文本文件的形式,而ftpd_banner是字串格式。banner_file選項(xiàng)將取代ftpd_banner選項(xiàng)。
dirmessage_enable=YES|MO
控制是否啟用目錄提示信息功能。YES啟用,NO不啟用,默認(rèn)值為YES。此功能啟用后,當(dāng)用戶進(jìn)入某一個(gè)目錄時(shí),會(huì)檢查該目錄下是否有message_file選項(xiàng)所指定的文檔,若是有,則會(huì)出現(xiàn)此文檔的內(nèi)容,通常這個(gè)檔案會(huì)放置歡迎話語(yǔ),或是對(duì)該目錄的說(shuō)明。
message_file=
此選項(xiàng),僅在dirmessage_enable選項(xiàng)激活方生效。默認(rèn)值為.message。
5.6、日志設(shè)置
xferlog_enable=YES|NO
控制是否啟用一個(gè)日志文件,用于詳細(xì)記錄上傳和下載。該日志文件由xferlog_file選項(xiàng)指定。默認(rèn)值為NO,但簡(jiǎn)單配置文件中激活此選項(xiàng)。
xferlog_file=
這個(gè)選項(xiàng)設(shè)定記錄傳輸日志的文件名。默認(rèn)值為/var/log/vsftpd.log。
xferlog_std_format=YES|NO
控制日志文件是否使用xferlog的標(biāo)準(zhǔn)格式,如同wu-ftpd一樣。使用xferlog格式,可以重新使用已經(jīng)存在的傳輸統(tǒng)計(jì)生成器。然而,默認(rèn)的日志格式更為可讀性。默認(rèn)值為NO,但自帶的配置文件中激活了此選項(xiàng)。
log_ftp_protocol=YES|NO
當(dāng)此選項(xiàng)激活后,所有的FTP請(qǐng)求和響應(yīng)都被記錄到日志中。提供此選項(xiàng)時(shí),xferlog_std_format不能被激活。這個(gè)選項(xiàng)有助于調(diào)試。默認(rèn)值為NO。
5.7、其他設(shè)置
setproctitle_enable=YES|NO
YES,VSFTPD將在系統(tǒng)進(jìn)程列表中顯示每個(gè)會(huì)話(session)的狀態(tài)。也就是說(shuō),進(jìn)程報(bào)告將顯示每個(gè)vsftpd會(huì)話在做什么(掛起、下載等),如用ps -ef|grep ftp。出于安全的目的,可以考慮將此選項(xiàng)關(guān)閉。NO,進(jìn)程報(bào)告只顯示一個(gè)vsftpd進(jìn)程在運(yùn)行。默認(rèn)值為NO。
text_userdb_names=YES|No
當(dāng)使用者登入后使用ls -al 之類指令時(shí),目錄列表的用戶和組信息域,默認(rèn)是出現(xiàn)擁有者的UID,而不是該檔案擁有者的名稱。若是希望出現(xiàn)擁有者的名稱,則將此功能開啟。默認(rèn)值為NO。
user_localtime=YES|NO
默認(rèn)為NO。YES,VSFTPD顯示目錄列表時(shí)使用你本地時(shí)區(qū)的時(shí)間。默認(rèn)是顯示GMT時(shí)間。同樣,由ftp命令“MDTM”返回的時(shí)間值也受此選項(xiàng)影響。
check_shell=YES|NO
此選項(xiàng)僅對(duì)不使用PAM方式的VSFTPD生效。當(dāng)此選項(xiàng)關(guān)閉后,當(dāng)本地用戶登錄時(shí),VSFTPD不會(huì)檢查/etc/shells文件以尋找一個(gè)有效的用戶shell。默認(rèn)為YES。
nopriv_user=
指定一個(gè)用戶,當(dāng)VSFTPD不想要什么權(quán)限時(shí),使用此用戶身份。這用戶最好是一個(gè)專用的用戶,而不是用戶nobody。在大多數(shù)的機(jī)器上,nobody用戶被用于大量重要的事情。默認(rèn)值為nobody。
pam_service_name=
指明VSFTPD使用用PAM驗(yàn)證服務(wù)時(shí)的PAM配置文件名。默認(rèn)值為ftp。
6、VSFTPD應(yīng)用
本部分介紹VSFTPD的具體應(yīng)用方法。
6.1、允許匿名用戶上傳文件
在vsftpd.conf文件中修改或增加以下選項(xiàng):
write_enable=YES
anon_world_readable_only=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
然后創(chuàng)建供匿名用戶上傳文件的目錄,并設(shè)定權(quán)限:
# mkdir /var/ftp/incoming
# chmod o+w /var/ftp/incoming
由于匿名用戶(ftp)上傳文件,需要對(duì)incoming目錄進(jìn)行操作,而incoming為root所有,匿名用戶(ftp)對(duì)于incoming來(lái)說(shuō)是其他用戶,所以要加入其他用戶(o)的寫權(quán)限。
6.2、限制用戶在自家目錄
在默認(rèn)配置中,本地用戶可以切換到自家目錄以外的目錄進(jìn)行瀏覽,并在權(quán)限范圍內(nèi)進(jìn)行上傳和下載,這無(wú)疑是個(gè)不安全因素。
我們可以設(shè)置chroot,讓本地用戶登錄后只能訪問(wèn)自家目錄,無(wú)法訪問(wèn)其他目錄。相關(guān)的選項(xiàng)有三個(gè):chroot_local_user、chroot_list_enable、chroot_list_file。限制用戶在自家目錄有兩種做法:
1、限制所有的本地用戶在自家目錄
chroot_local_user=YES
這種做法,可能會(huì)帶來(lái)一些安全性上的沖突。參見前面的chroot_local_user選項(xiàng)描述。
2、限制部分本地用戶在自家目錄
chroot_local_user=NO
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list
在/etc/vsftpd.chroot_list文件中加入要限制的本地用戶名。注意一個(gè)用戶名一行。
6.3、配置高安全級(jí)別的匿名FTP服務(wù)器
VSFTPD自帶的簡(jiǎn)單配置文件已經(jīng)自稱是偏執(zhí)狂了,這里看看能否更加偏執(zhí)一些,:)。有些選項(xiàng)默認(rèn)已經(jīng)采用安全性的設(shè)置,這里就不再寫出了。
#只允許匿名訪問(wèn),不允許本地用戶訪問(wèn)
anonymous_enable=YES
local_enable=NO
#使用ftpd_banner取代VSFTPD默認(rèn)的歡迎詞,免得泄漏相關(guān)信息
ftpd_banner=Welcome to this FTP Server
#只讓匿名用戶瀏覽可閱讀的文件,不可以瀏覽整個(gè)系統(tǒng)
anon_world_readable_only=YES
#隱藏文件的所有者和組信息,匿名用戶看到的文件的所有者和組全變?yōu)閒tp
hide_ids=YES
#取消寫權(quán)限
write_enable=NO
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO
#使用單獨(dú)模式,并指定監(jiān)聽的IP地址
listen_address=ip address
#對(duì)連接進(jìn)行控制,還有超時(shí)時(shí)間,那就根據(jù)具體情況再說(shuō)了。
connect_from_port_20=YES
pasv_min_port=50000
pasv_max_port=60000
#控制并發(fā)數(shù),限定每個(gè)IP地址的并發(fā)數(shù),這個(gè)嘛,根據(jù)用戶自已定了。
max_clients=numerical value
max_per_ip=numerical value
#限定下載速度,具體限多大,就由用戶自己定了,80KB/s,也很快了吧。
anon_max_rate=80000
#啟用詳細(xì)的日志記錄格式
xferlog_enable=YES
6.4、基于IP地址的虛擬FTP服務(wù)器
假定服務(wù)器有兩個(gè)IP地址,192.168.0.1和192.168.0.2。VSFTPD是建立在192.168.0.1上的,現(xiàn)在我們?cè)?92.168.0.2上再提供一個(gè)虛擬FTP服務(wù)器。如何在一臺(tái)服務(wù)器上使用多個(gè)IP 地址,請(qǐng)參考相關(guān)文檔。
1、創(chuàng)建虛擬FTP服務(wù)器的根目錄。
mkdir -p /var/ftp2/pub
確保/var/ftp2和/var/ftp2/pub目錄的擁有者和組均為root,掩碼為755。
2、增加虛擬FTP服務(wù)器的匿名用戶帳號(hào)。原先的FTP服務(wù)器使用系統(tǒng)用戶ftp作為其匿名用戶帳號(hào)。我們要增加一個(gè)ftp2用于虛擬FTP服務(wù)器。
useradd -d /var/ftp2 -M ftp2
3、創(chuàng)建虛擬FTP服務(wù)器的配置文件。復(fù)制原來(lái)的vsftpd.conf作為虛擬FTP服務(wù)器的配置文件,并修改相關(guān)參數(shù)。
cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd2.conf
新添或修改以下參數(shù):
listen=YES
listen_address=192.168.0.2
ftp_username=ftp2
注:由于VSFTPD默認(rèn)是監(jiān)聽所有的IP地址,當(dāng)我們?cè)O(shè)定基于IP的虛擬FTP服務(wù)器時(shí),為防止原來(lái)的FTP服務(wù)器與虛擬FTP服務(wù)器發(fā)生監(jiān)聽上的沖突,原FTP服務(wù)器需要指定監(jiān)聽的IP地址。在這里,原來(lái)的配置文件中就要設(shè)置listen_address=192.168.0.1。
4、啟動(dòng)虛擬FTP服務(wù)器。
/etc/rc.d/init.d/vsftpd腳本在啟動(dòng)時(shí),掃描/etc/vsftpd/目錄下所有的*.conf文件,按照*.conf文件的先后,依次啟用vsftpd進(jìn)程,每個(gè)vsftpd進(jìn)程對(duì)應(yīng)一個(gè).conf文件。即,“ls /etc/vsftpd/”列表的次序與“ps -aux |grep vsftpd”中的順序一樣。當(dāng)然了,“ps -aux | grep vsftpd”中也顯示出vsftpd所使用的配置文件,從中也可以看哪個(gè)vsftpd進(jìn)程對(duì)應(yīng)哪個(gè)FTP服務(wù)器。如果沒有列出配置文件,那就是默認(rèn)的vsftpd.conf,那么該進(jìn)程也就是原來(lái)的FTP服務(wù)器進(jìn)程。
由于第3步中虛擬FTP服務(wù)器的配置文件被命名為vsftpd2.conf文件,所以我們可以用/etc/rc.d/init.d/vsftpd腳本同時(shí)啟動(dòng)或關(guān)閉原FTP服務(wù)器和新加的虛擬FTP服務(wù)器。
以下命令單獨(dú)啟動(dòng)虛擬FTP服務(wù)器:
/usr/sbin/vsftpd /etc/vsftpd/vsftpd2.conf &
單獨(dú)關(guān)閉虛擬FTP服務(wù)器,用“ps -aux | grep vsftpd”查出進(jìn)程號(hào),再用kill指令殺死虛擬FTP的進(jìn)程。
6.5、虛擬用戶的配置
6.5.1、VSFTPD的虛擬用戶介紹
VSFTPD的本地用戶本身是系統(tǒng)的用戶,除了可以登錄FTP服務(wù)器外,還可以登錄系統(tǒng)使用其他系統(tǒng)資源,而VSFTPD的虛擬用戶則是FTP服務(wù)的專用用戶,虛擬用戶只能訪問(wèn)FTP服務(wù)器資源。對(duì)于只需要通過(guò)FTP對(duì)系統(tǒng)有讀寫權(quán)限,而不需要其他系統(tǒng)資源的用戶或情況來(lái)說(shuō),采用虛擬用戶方式是很適合的。
VSFTPD的虛擬用戶采用單獨(dú)的用戶名/口令保存方式,與系統(tǒng)賬號(hào)(passwd/shadow)分離,這大大增強(qiáng)了系統(tǒng)的安全性。VSFTPD可以采用數(shù)據(jù)庫(kù)文件來(lái)保存用戶/口令,如hash;也可以將用戶/口令保存在數(shù)據(jù)庫(kù)服務(wù)器中,如MySQL等。VSFTPD驗(yàn)證虛擬用戶,則采用PAM方式。由于虛擬用戶的用戶名/口令被單獨(dú)保存,因此在驗(yàn)證時(shí),VSFTPD需要用一個(gè)系統(tǒng)用戶的身份來(lái)讀取數(shù)據(jù)庫(kù)文件或數(shù)據(jù)庫(kù)服務(wù)器以完成驗(yàn)證,這就是guest用戶,這正如同匿名用戶也需要有一個(gè)系統(tǒng)用戶ftp一樣。當(dāng)然,guest用戶也可以被認(rèn)為是用于映射虛擬用戶。
配置虛擬用戶分為幾部分:guest用戶的創(chuàng)建、用戶/口令的保存、PAM認(rèn)證配置、vsftpd.conf文件設(shè)置等。具體的配置方法,參考下面小節(jié)。注:在后面的例子中,假定存在虛擬用戶xiaotong和xiaowang。
6.5.2 用戶創(chuàng)建和目錄設(shè)置
在系統(tǒng)中添加vsftpdguest用戶,作為虛擬用戶在系統(tǒng)中的代表。
useradd vsftpdguest
當(dāng)虛擬用戶登錄后,所在的位置為vsftpdguest的自家目錄/home/vsftpdguest。如果要讓虛擬用戶登錄到/var/ftp等其他目錄,修改vsftpdguest的自家目錄即可。
6.5.3、配置文件的設(shè)置
6.5.3.1、基本設(shè)置。
在vsftpd.conf配置文件中,加入以下參數(shù):
guest_enable=YES
guest_username=vsftpdguest
6.5.3.2、虛擬用戶的權(quán)限配置。
VSFTPD-1.2.0添加了virtual_use_local_privs參數(shù),當(dāng)該參數(shù)激活(YES)時(shí),虛擬用戶使用與本地用戶相同的權(quán)限。當(dāng)此參數(shù)關(guān)閉(NO)時(shí),虛擬用戶使用與匿名用戶相同的權(quán)限,這也就是VSFTPD-1.2.0之前版本對(duì)虛擬用戶權(quán)限的處理方法。這兩者種做法相比,后者更加嚴(yán)格一些,特別是在有寫訪問(wèn)的情形下。默認(rèn)情況下此參數(shù)是關(guān)閉的(NO)。
下面先介紹virtual_use_local_privs=NO時(shí),即VSFTPD-1.2.0之前版本對(duì)虛擬用戶權(quán)限的配置方法:
①控制虛擬用戶瀏覽目錄
如果讓用戶不能瀏覽目錄,但仍可以對(duì)文件操作,那么需要執(zhí)行以下二個(gè)步驟:一,配置文件中,anon_world_readable_only=YES。二,虛擬用戶目錄的權(quán)限改為只能由vsftpdguest操作:
[root@hpe45 vsftpd]# chown vsftpdguest.vsftpdguest /home/vsftpdguest
[root@hpe45 vsftpd]# chmod 700 /home/vsftpdguest
②允許虛擬用戶上傳文件
write_enable=YES
anon_upload_enable=YES
③允許虛擬用戶修改文件名和刪除文件
anon_other_write_enable=YES
由于以上選項(xiàng)的設(shè)置同樣會(huì)對(duì)匿名用戶生效。如果不想匿名用戶趁機(jī)擁有同樣的權(quán)限,最好是禁止匿名用戶登錄。
在VSFTPD-1.2.0中當(dāng)virtual_use_local_privs=YES時(shí),只需write_enable=YES,虛擬用戶就可以就擁有寫權(quán)限。
6.5.3.3、虛擬用戶的其他配置
①限定虛擬用戶在自家目錄。
chroot_local_user=NO
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list
在/etc/vsftpd.chroot_list文件中加入xiaotong和xiaowang。
或者,chroot_local_user=YES
②虛擬用戶的個(gè)人配置。
如果想讓個(gè)別的虛擬用戶擁有自己特別的配置,同樣可以建立虛擬用戶的個(gè)人配置文件。在主配置文件中加入:
user_config_dir=/etc/vsftpd/vsftpd_user_conf
生成/etc/vsftpd/vsftpd_user_conf目錄,在該目錄下建立與特定虛擬用戶同名的文件:
[root@hpe45 vsftpd]# mkdir vsftpd_user_conf
[root@hpe45 vsftpd]# cd vsftpd_user_conf
[root@hpe45 vsftpd_user_conf]# touch xiaowang
然后在xiaowang文件中就可以加入專對(duì)xiaowang生效的選項(xiàng)設(shè)置了。
注:如果在個(gè)人配置文件中加入chroot_local_user=YES是無(wú)效的。
6.5.3.4、虛擬用戶個(gè)人目錄設(shè)置
大家可以發(fā)現(xiàn),無(wú)論是哪個(gè)虛擬用戶,登錄后所在的目錄都是/home/vsftpdguest,即都是guest_username用戶的自家目錄。下面,介紹如何為每個(gè)虛擬用戶建立自家目錄。
一種作法是在虛擬用戶的個(gè)人配置文件中使用local_root選項(xiàng)指定虛擬用戶的自家目錄。以xiaowang為例,在第上步的基礎(chǔ)上,首先/etc/vsftpd/vsftpd_user_conf/xiaowang文件中加入:
local_root=/home/xiaowang
新建xiaowang目錄,并將權(quán)限設(shè)為vsftpdguest:
[root@hpe45 home]# mkdir xiaowang
[root@hpe45 home]# chown vsftpdguest.vsftpdguest ./xiaowang
6.5.4、MySQL保存虛擬用戶
本節(jié)介紹如何將虛擬用戶的用戶名和口令保存在MySQL的數(shù)據(jù)庫(kù)中。這主要分二個(gè)部分,一是將用戶和口令保存在數(shù)據(jù)庫(kù),二是設(shè)置相應(yīng)的PAM認(rèn)證。為了方便論述,做如下假定:數(shù)據(jù)庫(kù)vsftpdvu,表users,字段name和passwd用于保存虛擬用戶的用戶名和口令;為了安全,只授權(quán)vsftpdguest讀vsftpdvu數(shù)據(jù)庫(kù)的users表。
1、虛擬用戶的用戶名/口令的保存。這部分在MySQL數(shù)據(jù)庫(kù)中完成。首先,創(chuàng)建數(shù)據(jù)庫(kù)vsftpdvu以及表users,并插入虛擬用戶xiaotong、xiaowang。執(zhí)行以下命令:
[root@hpe45 vsftpd]#mysql -p
mysql>create database vsftpdvu;
mysql>use vsftpdvu;
mysql>create table users(name char(16) binary,passwd char(16) binary);
mysql>insert into users (name,passwd) values ('xiaotong',password('qqmywife'));
mysql>insert into users (name,passwd) values ('xiaowang',password('ttmywife'));
mysql>quit
然后,授權(quán)vsftpdguest只能讀vsftpdvu數(shù)據(jù)庫(kù)的users表。執(zhí)行以下命令:
[root@hpe45 vsftpd]#mysql -u root mysql -p
mysql>grant select on vsftpdvu.users to vsftpdguest@localhost identified by 'i52serial0';
mysql>quit
如果要驗(yàn)證剛才的操作是否成功可以執(zhí)行下面命令:
[root@hpe45 vsftpd]#mysql -u vsftpdguest -pi52serial0 vsftpdvu
mysql>select * from users;
如果成功,將會(huì)列出xiaotong、xiaowang和加密后的密碼。
2、設(shè)置PAM認(rèn)證。這里我們要用到一個(gè)利用mysql進(jìn)行pam驗(yàn)證的開源項(xiàng)目(http://sourceforge.net/projects/pam-mysql/)。首先從網(wǎng)站下載它的程序包pam_myql-0.5.tar.gz,復(fù)制到/root目錄中。在編譯安裝之前,要確保mysql-devel的RPM包已經(jīng)安裝在你的機(jī)器上,如果沒有請(qǐng)從RHL安裝光盤中安裝該包。然后,執(zhí)行以下命令:
[root@hpe45 root]#tar xvzf pam_mysql-0.5.tar.gz
[root@hpe45 root]#cd pam_mysql
[root@hpe45 pam_mysql]#make
[root@hpe45 pam_mysql]#make install
make install這一步可能會(huì)出現(xiàn)錯(cuò)誤,那只好手動(dòng)將該目錄下生成的pam_mysql.o復(fù)制到/lib/security目錄下。
接下來(lái),我們要設(shè)置vsftpd的PAM驗(yàn)證文件。打開/etc/pam.d/vsftpd文件,加入以下內(nèi)容:
auth required pam_mysql.o user=vsftpdguest passwd=i52serial0 host=localhost db=vsftpdvu table=users usercolumn=name passwdcolumn=passwd crypt=2
account required pam_mysql.o user=vsftpdguest passwd=i52serial0 host=localhost db=vsftpdvu table=users usercolumn=name passwdcolumn=passwd crypt=2
上面涉及到的參數(shù),只要對(duì)應(yīng)前面數(shù)據(jù)庫(kù)的設(shè)置就可以明白它們的含義。這里需要說(shuō)明的是crypt參數(shù),crypt=0,口令以明文方式(不加密)保存在數(shù)據(jù)庫(kù)中;crypt=1,口令使用UNIX系統(tǒng)的DES加密方式加密后保存在數(shù)據(jù)庫(kù)中;crypt=2,口令經(jīng)過(guò)MySQL的password()函數(shù)加密后保存。
---------------------------------------------------------------------------------------------------------------------------------
說(shuō)人之短,乃護(hù)己之短。夸己之長(zhǎng),乃忌人之長(zhǎng)。皆由存心不厚,識(shí)量太狹耳。能去此弊,可以進(jìn)德,可以遠(yuǎn)怨。
http://www.aygfsteel.com/szhswl
------------------------------------------------------------------------------------------------------ ----------------- ---------