轉自:我見過最好的vsftpd配置教程html
環境:CentOS 5.0 操做系統
一.安裝:
1.安裝Vsftpd服務相關部件:
[root@KcentOS5 ~]# yum install vsftpd*
Dependencies Resolved=============================================================================
Package Arch Version Repository Size
=============================================================================
Installing:
vsftpd i386 2.0.5-10.el5 base 137 kTransaction Summary
=============================================================================
Install 1 Package(s)
Update 0 Package(s)
Remove 0 Package(s)
2.確認安裝PAM服務相關部件:
[root@KcentOS5 ~]# yum install pam*
Dependencies Resolved
=============================================================================
Package Arch Version Repository Size
=============================================================================
Installing:
pam-devel i386 0.99.6.2-3.14.el5 base 186 kTransaction Summary
=============================================================================
Install 1 Package(s)
Update 0 Package(s)
Remove 0 Package(s)
開發包,其實不裝也沒有關係,主要的目的是確認PAM。
3.安裝DB4部件包:
這裏要特別安裝一個db4的包,用來支持文件數據庫。
[root@KcentOS5 ~]# yum install db4*
Dependencies Resolved
=============================================================================
Package Arch Version Repository Size
=============================================================================
Installing:
db4-devel i386 4.3.29-9.fc6 base 2.0 M
db4-java i386 4.3.29-9.fc6 base 1.7 M
db4-tcl i386 4.3.29-9.fc6 base 1.0 M
db4-utils i386 4.3.29-9.fc6 base 119 kTransaction Summary
=============================================================================
Install 4 Package(s)
Update 0 Package(s)
Remove 0 Package(s)java
二.系統賬戶
1.創建Vsftpd服務的宿主用戶:
[root@KcentOS5 ~]# useradd vsftpd -s /sbin/nologin
默認的Vsftpd的服務宿主用戶是root,可是這不符合安全性的須要。這裏創建名字爲vsftpd的用戶,用他來做爲支持Vsftpd的服務宿主用戶。因爲該用戶僅用來支持Vsftpd服務用,所以沒有許可他登錄系統的必要,並設定他爲不能登錄系統的用戶。linux
2.創建Vsftpd虛擬宿主用戶:
[root@KcentOS5 nowhere]# useradd overlord -s /sbin/nologin
本篇主要是介紹Vsftp的虛擬用戶,虛擬用戶並非系統用戶,也就是說這些FTP的用戶在系統中是不存在的。他們的整體權限實際上是集中寄託在一個在系統中的某一個用戶身上的,所謂Vsftpd的虛擬宿主用戶,就是這樣一個支持着全部虛擬用戶的宿主用戶。因爲他支撐了FTP的全部虛擬的用戶,那麼他自己的權限將會影響着這些虛擬的用戶,所以,處於安全性的考慮,也要非分注意對該用戶的權限的控制,該用戶也絕對沒有登錄系統的必要,這裏也設定他爲不能登錄系統的用戶。(這裏插一句:本來在創建上面兩個用戶的時候,想連用戶主路徑也不打算給的。原本想加上 -d /home/nowhere 的,據man useradd手冊上講述:「 -d, --home HOME_DIR
The new user will be created using HOME_DIR as the value for the
user鈙 login directory. The default is to append the LOGIN name to
BASE_DIR and use that as the login directory name. The directory
HOME_DIR does not have to exist but will not be created if it is
missing.
使用-d參數指定用戶的主目錄,用戶主目錄並非必須存在的。若是沒有存在指定的目錄的話,那麼它將不會被創建」。shell
三.調整Vsftpd的配置文件:
1.編輯配置文件前先備份
[root@KcentOS5 ~]# cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.backup2.編輯主配置文件Vsftpd.conf
[root@KcentOS5 ~]# vi /etc/vsftpd/vsftpd.conf
這裏我將原配置文件的修改徹底記錄,凡是修改的地方我都會保留註釋原來的配置。其中加入我對每條配置項的認識,對於一些比較關鍵的配置項這裏我作了個人觀點,而且本來英語的說明我也不刪除,供參考對比用。
------------------------------------------------------------------------------
# Allow anonymous FTP? (Beware - allowed by default if you comment this out).
#anonymous_enable=YES
anonymous_enable=NO
設定不容許匿名訪問
#
# Uncomment this to allow local users to log in.
local_enable=YES
設定本地用戶能夠訪問。注意:主要是爲虛擬宿主用戶,若是該項目設定爲NO那麼全部虛擬用戶將沒法訪問。
#
# Uncomment this to enable any form of FTP write command.
write_enable=YES
設定能夠進行寫操做。
#
# Default umask for local users is 077. You may wish to change this to 022,
# if your users expect that (022 is used by most other ftpd's)
local_umask=022
設定上傳後文件的權限掩碼。
#
# Uncomment this to allow the anonymous FTP user to upload files. This only
# has an effect if the above global write enable is activated. Also, you will
# obviously need to create a directory writable by the FTP user.
#anon_upload_enable=YES
anon_upload_enable=NO
禁止匿名用戶上傳。
#
# Uncomment this if you want the anonymous FTP user to be able to create
# new directories.
#anon_mkdir_write_enable=YES
anon_mkdir_write_enable=NO
禁止匿名用戶創建目錄。
#
# Activate directory messages - messages given to remote users when they
# go into a certain directory.
dirmessage_enable=YES
設定開啓目錄標語功能。
#
# Activate logging of uploads/downloads.
xferlog_enable=YES
設定開啓日誌記錄功能。
#
# Make sure PORT transfer connections originate from port 20 (ftp-data).
connect_from_port_20=YES
設定端口20進行數據鏈接。
#
# If you want, you can arrange for uploaded anonymous files to be owned by
# a different user. Note! Using "root" for uploaded files is not
# recommended!
#chown_uploads=YES
chown_uploads=NO
設定禁止上傳文件更改宿主。
#chown_username=whoever
#
# You may override where the log file goes if you like. The default is shown
# below.
xferlog_file=/var/log/vsftpd.log
設定Vsftpd的服務日誌保存路徑。注意,該文件默認不存在。必需要手動touch出來,而且因爲這裏更改了Vsftpd的服務宿主用戶爲手動創建的Vsftpd。必須注意給與該用戶對日誌的寫入權限,不然服務將啓動失敗。
#
# If you want, you can have your log file in standard ftpd xferlog format
xferlog_std_format=YES
設定日誌使用標準的記錄格式。
#
# You may change the default value for timing out an idle session.
#idle_session_timeout=600
設定空閒鏈接超時時間,這裏使用默認。將具體數值留給每一個具體用戶具體指定,固然若是不指定的話,仍是使用這裏的默認值600,單位秒。
#
# You may change the default value for timing out a data connection.
#data_connection_timeout=120
設定單次最大連續傳輸時間,這裏使用默認。將具體數值留給每一個具體用戶具體指定,固然若是不指定的話,仍是使用這裏的默認值120,單位秒。
#
# It is recommended that you define on your system a unique user which the
# ftp server can use as a totally isolated and unprivileged user.
#nopriv_user=ftpsecure
nopriv_user=vsftpd
設定支撐Vsftpd服務的宿主用戶爲手動創建的Vsftpd用戶。注意,一旦作出更改宿主用戶後,必須注意一塊兒與該服務相關的讀寫文件的讀寫賦權問題。好比日誌文件就必須給與該用戶寫入權限等。
#
# Enable this and the server will recognise asynchronous ABOR requests. Not
# recommended for security (the code is non-trivial). Not enabling it,
# however, may confuse older FTP clients.
async_abor_enable=YES
設定支持異步傳輸功能。
#
# By default the server will pretend to allow ASCII mode but in fact ignore
# the request. Turn on the below options to have the server actually do ASCII
# mangling on files when in ASCII mode.
# Beware that on some FTP servers, ASCII support allows a denial of service
# attack (DoS) via the command "SIZE /big/file" in ASCII mode. vsftpd
# predicted this attack and has always been safe, reporting the size of the
# raw file.
# ASCII mangling is a horrible feature of the protocol.
ascii_upload_enable=YES
ascii_download_enable=YES
設定支持ASCII模式的上傳和下載功能。
#
# You may fully customise the login banner string:
ftpd_banner=This Vsftp server supports virtual users ^_^
設定Vsftpd的登錄標語。
#
# You may specify a file of disallowed anonymous e-mail addresses. Apparently
# useful for combatting certain DoS attacks.
#deny_email_enable=YES
# (default follows)
#banned_email_file=/etc/vsftpd/banned_emails
#
# You may specify an explicit list of local users to chroot() to their home
# directory. If chroot_local_user is YES, then this list becomes a list of
# users to NOT chroot().
#chroot_list_enable=YES
chroot_list_enable=NO數據庫
chroot_local_user=YES
禁止用戶登出本身的FTP主目錄。注意:chroot_list_enable=NO時須要設置 chroot_local_user=YES才能將用戶限制在指定的目錄。
# (default follows)
#chroot_list_file=/etc/vsftpd/chroot_list
#
# You may activate the "-R" option to the builtin ls. This is disabled by
# default to avoid remote users being able to cause excessive I/O on large
# sites. However, some broken FTP clients such as "ncftp" and "mirror" assume
# the presence of the "-R" option, so there is a strong case for enabling it.
#ls_recurse_enable=YES
ls_recurse_enable=NO
禁止用戶登錄FTP後使用"ls -R"的命令。該命令會對服務器性能形成巨大開銷。若是該項被容許,那麼擋多用戶同時使用該命令時將會對該服務器形成威脅。
# When "listen" directive is enabled, vsftpd runs in standalone mode and
# listens on IPv4 sockets. This directive cannot be used in conjunction
# with the listen_ipv6 directive.
listen=YES
設定該Vsftpd服務工做在StandAlone模式下。順便展開說明一下,所謂StandAlone模式就是該服務擁有本身的守護進程支持,在ps -A命令下咱們將可用看到vsftpd的守護進程名。若是不想工做在StandAlone模式下,則能夠選擇SuperDaemon模式,在該模式下 vsftpd將沒有本身的守護進程,而是由超級守護進程Xinetd全權代理,與此同時,Vsftp服務的許多功能將得不到實現。
#
# This directive enables listening on IPv6 sockets. To listen on IPv4 and IPv6
# sockets, you must run two copies of vsftpd whith two configuration files.
# Make sure, that one of the listen options is commented !!
#listen_ipv6=YESpam_service_name=vsftpd
設定PAM服務下Vsftpd的驗證配置文件名。所以,PAM驗證將參考/etc/pam.d/下的vsftpd文件配置。
userlist_enable=YES
設定userlist_file中的用戶將不得使用FTP。
tcp_wrappers=YES
設定支持TCP Wrappers。#KC: The following entries are added for supporting virtual ftp users.
如下這些是關於Vsftpd虛擬用戶支持的重要配置項目。默認Vsftpd.conf中不包含這些設定項目,須要本身手動添加配置。guest_enable=YES
設定啓用虛擬用戶功能。
guest_username=overlord
指定虛擬用戶的宿主用戶。
virtual_use_local_privs=YES
設定虛擬用戶的權限符合他們的宿主用戶。
user_config_dir=/etc/vsftpd/vconf
設定虛擬用戶我的Vsftp的配置文件存放路徑。也就是說,這個被指定的目錄裏,將存放每一個Vsftp虛擬用戶個性的配置文件,一個須要注意的地方就是這些配置文件名必須和虛擬用戶名相同。
-------------------------------------------------------------------------
保存退出。
3.創建Vsftpd的日誌文件,並更該屬主爲Vsftpd的服務宿主用戶:
[root@KcentOS5 ~]# touch /var/log/vsftpd.log
[root@KcentOS5 ~]# chown vsftpd.vsftpd /var/log/vsftpd.log 4.創建虛擬用戶配置文件存放路徑:
[root@KcentOS5 ~]# mkdir /etc/vsftpd/vconf/
三.製做虛擬用戶數據庫文件
1.先創建虛擬用戶名單文件:
[root@KcentOS5 ~]# touch /etc/vsftpd/virtusers
創建了一個虛擬用戶名單文件,這個文件就是來記錄vsftpd虛擬用戶的用戶名和口令的數據文件,我這裏給它命名爲virtusers。爲了不文件的混亂,我把這個名單文件就放置在/etc/vsftpd/下。安全
2.編輯虛擬用戶名單文件:
[root@KcentOS5 ~]# vi /etc/vsftpd/virtusers
----------------------------
kanecruise
123456
near
123456near
mello
123456mello
----------------------------
編輯這個虛擬用戶名單文件,在其中加入用戶的用戶名和口令信息。格式很簡單:「一行用戶名,一行口令」。服務器
3.生成虛擬用戶數據文件:
[root@KcentOS5 ~]# db_load -T -t hash -f /etc/vsftpd/virtusers /etc/vsftpd/virtusers.db
這裏我順便把這個命令簡單說明一下
----------------------------------------------------------------------
察看db4的db_load命令使用方法:
[root@KSRV2 vsftpd]# db_load
usage: db_load [-nTV] [-c name=value] [-f file]
[-h home] [-P password] [-t btree | hash | recno | queue] db_file
usage: db_load -r lsn | fileid [-h home] [-P password] db_file
解釋在本篇中,db_load命令幾個相關選項很參數-T
The -T option allows non-Berkeley DB applications to easily load text files into databases.
If the database to be created is of type Btree or Hash, or the keyword keys is specified as set, the input must be paired lines of text, where the first line of the pair is the key item, and the second line of the pair is its corresponding data item. If the database to be created is of type Queue or Recno and the keywork keys is not set, the input must be lines of text, where each line is a new data item for the database.
選項-T容許應用程序可以將文本文件轉譯載入進數據庫。因爲咱們以後是將虛擬用戶的信息以文件方式存儲在文件裏的,爲了讓Vsftpd這個應用程序可以經過文原本載入用戶數據,必需要使用這個選項。If the -T option is specified, the underlying access method type must be specified using the -t option.
若是指定了選項-T,那麼必定要追跟子選項-t-t
Specify the underlying access method. If no -t option is specified, the database will be loaded into a database of the same type as was dumped; for example, a Hash database will be created if a Hash database was dumped.
Btree and Hash databases may be converted from one to the other. Queue and Recno databases may be converted from one to the other. If the -k option was specified on the call to db_dump then Queue and Recno databases may be converted to Btree or Hash, with the key being the integer record number.
子選項-t,追加在在-T選項後,用來指定轉譯載入的數據庫類型。擴展介紹下,-t能夠指定的數據類型有Btree、Hash、Queue和Recon數據庫。這裏,接下來咱們須要指定的是Hash型。
----------------------------------------------------------------------------session
4.察看生成的虛擬用戶數據文件
[root@KcentOS5 ~]# ll /etc/vsftpd/virtusers.db
-rw-r--r-- 1 root root 12288 Sep 16 03:51 /etc/vsftpd/virtusers.db
須要特別注意的是,之後再要添加虛擬用戶的時候,只須要按照「一行用戶名,一行口令」的格式將新用戶名和口令添加進虛擬用戶名單文件。可是光這樣作還不夠,不會生效的哦!還要再執行一遍「 db_load -T -t hash -f 虛擬用戶名單文件 虛擬用戶數據庫文件.db 」的命令使其生效才能夠!多線程
四.設定PAM驗證文件,並指定虛擬用戶數據庫文件進行讀取
1.察看原來的Vsftp的PAM驗證配置文件:
[root@KcentOS5 ~]# cat /etc/pam.d/vsftpd
----------------------------------------------------------------
#%PAM-1.0
session optional pam_keyinit.so force revoke
auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
auth required pam_shells.so
auth include system-auth
account include system-auth
session include system-auth
session required pam_loginuid.so
----------------------------------------------------------------併發
2.在編輯前作好備份:
[root@KcentOS5 ~]# cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd.backup3.編輯Vsftpd的PAM驗證配置文件
[root@KcentOS5 ~]# vi /etc/pam.d/vsftpd
----------------------------------------------------------------
#%PAM-1.0
auth sufficient /lib/security/pam_userdb.so db=/etc/vsftpd/virtusers
account sufficient /lib/security/pam_userdb.so db=/etc/vsftpd/virtusers
若是是64位的 須要改爲: auth sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/virtusers account sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/virtusers
以上兩條是手動添加的,內容是對虛擬用戶的安全和賬戶權限進行驗證。
注意:這兩條必定要放在最前面
這裏的auth是指對用戶的用戶名口令進行驗證。
這裏的accout是指對用戶的賬戶有哪些權限哪些限制進行驗證。
其後的sufficient表示充分條件,也就是說,一旦在這裏經過了驗證,那麼也就不用通過下面剩下的驗證步驟了。相反,若是沒有經過的話,也不會被系統當即擋之門外,由於sufficient的失敗不決定整個驗證的失敗,意味着用戶還必須將經歷剩下來的驗證審覈。
再後面的/lib/security/pam_userdb.so表示該條審覈將調用pam_userdb.so這個庫函數進行。
最後的db=/etc/vsftpd/virtusers則指定了驗證庫函數將到這個指定的數據庫中調用數據進行驗證。
#KC: The entries for Vsftpd-PAM are added above.session optional pam_keyinit.so force revoke
auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
auth required pam_shells.so
auth include system-auth
account include system-auth
session include system-auth
session required pam_loginuid.so
----------------------------------------------------------------
五.虛擬用戶的配置
1.規劃好虛擬用戶的主路徑:
[root@KcentOS5 ~]# mkdir /opt/vsftp/
2.創建測試用戶的FTP用戶目錄:
[root@KcentOS5 ~]# mkdir /opt/vsftp/kanecruise/ /opt/vsftp/mello/ /opt/vsftp/near/
3.創建虛擬用戶配置文件模版:[root@KcentOS5 ~]# cp /etc/vsftpd/vsftpd.conf.backup /etc/vsftpd/vconf/vconf.tmp
4.定製虛擬用戶模版配置文件:
[root@KcentOS5 ~]# vi /etc/vsftpd/vconf/vconf.tmp
--------------------------------
local_root=/opt/vsftp/virtuser
指定虛擬用戶的具體主路徑。
anonymous_enable=NO
設定不容許匿名用戶訪問。
write_enable=YES
設定容許寫操做。
local_umask=022
設定上傳文件權限掩碼。
anon_upload_enable=NO
設定不容許匿名用戶上傳。
anon_mkdir_write_enable=NO
設定不容許匿名用戶創建目錄。
idle_session_timeout=600
設定空閒鏈接超時時間。
data_connection_timeout=120
設定單次連續傳輸最大時間。
max_clients=10
設定併發客戶端訪問個數。
max_per_ip=5
設定單個客戶端的最大線程數,這個配置主要來照顧Flashget、迅雷等多線程下載軟件。
local_max_rate=50000
設定該用戶的最大傳輸速率,單位b/s。
--------------------------------
這裏將原vsftpd.conf配置文件通過簡化後保存做爲虛擬用戶配置文件的模版。這裏將並不須要指定太多的配置內容,主要的框架和限制交由 Vsftpd的主配置文件vsftpd.conf來定義,即虛擬用戶配置文件當中沒有提到的配置項目將參考主配置文件中的設定。而在這裏做爲虛擬用戶的配置文件模版只須要留一些和用戶流量控制,訪問方式控制的配置項目就能夠了。這裏的關鍵項是local_root這個配置,用來指定這個虛擬用戶的FTP主路徑。5.更改虛擬用戶的主目錄的屬主爲虛擬宿主用戶:
[root@KcentOS5 ~]# chown -R overlord.overlord /opt/vsftp/6.檢查權限:
[root@KcentOS5 ~]# ll /opt/vsftp/
total 24
drwxr-xr-x 2 overlord overlord 4096 Sep 16 05:14 kanecruise
drwxr-xr-x 2 overlord overlord 4096 Sep 16 05:00 mello
drwxr-xr-x 2 overlord overlord 4096 Sep 16 05:00 near
六.給測試用戶定製:
1.從虛擬用戶模版配置文件複製:
[root@KcentOS5 ~]# cp /etc/vsftpd/vconf/vconf.tmp /etc/vsftpd/vconf/kanecruise
2.針對具體用戶進行定製:
[root@KcentOS5 ~]# vi /etc/vsftpd/vconf/kanecruise
---------------------------------
local_root=/opt/vsftp/kanecruise
anonymous_enable=NO
write_enable=YES
local_umask=022
anon_upload_enable=NO
anon_mkdir_write_enable=NO
idle_session_timeout=300
data_connection_timeout=90
max_clients=1
max_per_ip=1
local_max_rate=25000
---------------------------------
七.啓動服務:
[root@KcentOS5 ~]# service vsftpd start
Starting vsftpd for vsftpd: [ OK ]
八.測試:
1.在虛擬用戶目錄中預先放入文件:
[root@KcentOS5 ~]# touch /opt/vsftp/kanecruise/kc.test
2.從其餘機器做爲客戶端登錄FTP:
[root@Yum ~]# ftp
ftp> open 192.168.1.22
Connected to 192.168.1.22.
220 This Vsftp server supports virtual users ^_^
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (192.168.1.22:root): kanecruise
331 Please specify the password.
Password: 123456
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
3.測試列單操做
ftp> ls
227 Entering Passive Mode (192,168,1,22,220,24)
150 Here comes the directory listing.
-rw-r--r-- 1 501 501 0 Sep 15 21:14 kc.test
226 Directory send OK.(目錄列單成功)
4.測試上傳操做:
ftp> put
(local-file) KC.repo
(remote-file) KC.repo
local: KC.repo remote: KC.repo
227 Entering Passive Mode (192,168,1,22,230,1)
150 Ok to send data.
226 File receive OK. (上傳成功)
699 bytes sent in 0.024 seconds (29 Kbytes/s)
ftp>
5.測試創建目錄操做:
ftp> mkdir test
257 "/opt/vsftp/kanecruise/test" created (目錄創建成功)
6.測試下載操做:
ftp> get kc.test
local: kc.test remote: kc.test
227 Entering Passive Mode (192,168,1,22,164,178)
150 Opening BINARY mode data connection for kc.test (0 bytes).
226 File send OK.(下載成功)
7.測試超時:
ftp> dir
421 Timeout.(超時有效)
ftp> user
Not connected.注意:
在/etc/vsftpd/vsftpd.conf中,local_enable的選項必須打開爲Yes,使得虛擬用戶的訪問成爲可能,不然會出現如下現象:
----------------------------------
[root@KcentOS5 ~]# ftp
ftp> open 192.168.1.22
Connected to 192.168.1.22.
500 OOPS: vsftpd: both local and anonymous access disabled!
----------------------------------
緣由:虛擬用戶再豐富,其實也是基於它們的宿主用戶overlord的,若是overlord這個虛擬用戶的宿主被限制住了,那麼虛擬用戶也將受到限制。
補充:
500 OOPS:錯誤
有多是你的vsftpd.con配置文件中有不能被實別的命令,還有一種多是命令的YES 或 NO 後面有空格。
我遇到的是命令後面有空格。由於我是用GEDIT來編輯的配置文件
550 權限錯誤,不能建立目錄和文件
解決方法: 關閉selinux
# vi /etc/selinux/config
將 SELINUX=XXX -->XXX 表明級別
改成
SELINUX=disabled
重啓
虛擬用戶配置文件
全部權限
write_enable=YES anonymous_enable=NO anon_world_readable_only=NO anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES local_umask=022 download_enable=Yes local_root=/data/user1
上傳權限
write_enable=YES anon_world_readable_only=NO anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES local_umask=022 download_enable=NO local_root=/data/user2
只能下載
write_enable=NO anon_world_readable_only=NO anon_upload_enable=NO anon_mkdir_write_enable=NO anon_other_write_enable=NO local_umask=022 download_enable=yes local_root=/data/user3