FTP能夠說是Internet上使用很是普遍的一種通信協議了。它工做在OSI模型的第7層,是TCP/IP的一種具體應用。FTP採用基於TCP的可靠鏈接:監聽21端口來等待控制鏈接請求,當鏈接創建後,採用20號端口來創建數據傳輸通道。ubuntu
FTP中使用的一些典型消息:vim
125 數據鏈接打開,傳輸開始安全
200 命令OK服務器
331 用戶名OK,須要輸入密碼session
425 不能打開數據鏈接app
452 錯誤寫文件socket
500 命令沒法識別async
Vsftp是Linux系統下的一套開源FTP服務器軟件,具備結構簡單、性能優良的特色,是一款輕量型穩定安全的FTP。tcp
1.安裝Vsftp。(測試環境:ContOS 6.5)工具
查看本機有沒有vsftp安裝源:
~# rpm -qa | grep svftpd
若是有,則會顯示vsftp的版本,這樣就能夠直接安裝:
~# yum install vsftpd
但個人上面貌似沒有,只能下載源碼編譯了。Vsftp官網主頁:http://vsftpd.beasts.org ,貌似進不去,網上找了下,能夠在這裏下載:站長之家 。版本是Vsftp v2.3.2 For Linux。解壓編譯:
~# tar xvf vsftpd-2.3.2.tar.gz ~# cd ./vsftpd-2.3.2
在此說明一下vsftpd-2.3.2目錄下的builddefs.h文件,該文件主要用來設定FTP服務器的一些安全配置:CTP_Wrappers、PAM和SSL。能夠按須要選擇/取消。
vim ./builddefs.h #ifndef VSF_BUILDDEFS_H #define VSF_BUILDDEFS_H #undef VSF_BUILD_TCPWRAPPERS //對TCP包進行解析的工具,用於限制某種服務的訪問權限進而達到保護系統的目的。 #define VSF_BUILD_PAM //一種高效便利的用戶級別的認證方式,用來增強服務器的安全性能。 #undef VSF_BUILD_SSL //利用加密技術,保障在傳輸過程當中數據不會被竊聽。 #endif /* VSF_BUILDDEFS_H */
2.配置vsftpd.conf文件
vsftpd.conf文件是主配置文件,在/etc/vsftpd/目錄下.
# Allow anonymous FTP? (Beware - allowed by default if you comment this out). anonymous_enable=YES //設置是否容許匿名訪問 # # Uncomment this to allow local users to log in. local_enable=YES //設置是否容許本地用戶登陸 # # 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 //設置是否容許匿名上傳文件 # # Uncomment this if you want the anonymous FTP user to be able to create # new directories. #anon_mkdir_write_enable=YES //設置是否容許匿名創建目錄 # # Activate directory messages - messages given to remote users when they # go into a certain directory. dirmessage_enable=YES //設置是否在改變目錄後發送消息 # # The target log file can be vsftpd_log_file or xferlog_file. # This depends on setting xferlog_std_format parameter xferlog_enable=YES //設置是否激活日誌功能 # # Make sure PORT transfer connections originate from port 20 (ftp-data). connect_from_port_20=YES //設置是否使用20端口傳輸數據(PORT模式) # # 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_username=whoever # # The name of log file when xferlog_enable=YES and xferlog_std_format=YES # WARNING - changing this filename affects /etc/logrotate.d/vsftpd.log #xferlog_file=/var/log/xferlog //設置日誌文件保存位置 # # Switches between logging into vsftpd_log_file and xferlog_file files. # NO writes to vsftpd_log_file, YES to xferlog_file xferlog_std_format=YES //設置是否使用標準文件日誌 # # You may change the default value for timing out an idle session. #idle_session_timeout=600 //設置會話的超時時間 # # You may change the default value for timing out a data connection. #data_connection_timeout=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 //設置非特權用戶帳戶 # # 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 //設置是否容許客戶端使用sync等命令 # # 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形式傳輸文件 # ASCII mangling is a horrible feature of the protocol. #ascii_upload_enable=YES #ascii_download_enable=YES # # You may fully customise the login banner string: #ftpd_banner=Welcome to blah FTP service. //設置登陸後的歡迎信息 # # 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 //加入用戶列表(前提是上面已經設置爲YES) # # 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_local_user=YES //與下面配置有關 #chroot_list_enable=YES //設置是否容許本地用戶離開其主目錄 # (default follows) # //若是使用該項,則上面的chroot_local_user=YES需設置爲NO。指定不能離開主目錄的用戶,將用戶名一個一行寫入指定文件。 #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 // # # 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 //設置是否開啓IPV4監聽 # # This directive enables listening on IPv6 sockets. To listen on IPv4 and IPv6 # sockets, you must run two copies of vsftpd with two configuration files. # Make sure, that one of the listen options is commented !! #listen_ipv6=YES //設置是否開啓IPV6監聽 pam_service_name=vsftpd //設置訪問所使用的PAM模塊 userlist_enable=YES //若是激活該選項,將禁止所指定文件中的用戶登陸 tcp_wrappers=YES //設置是否使用TCP_Wrappers做爲主機訪問控制方式
3.配置ftpusers文件
ftpusers文件用於限定系統中那些用戶能/不能使用FTP服務。能夠根據實際狀況添加/刪除。
#User that are not allowed to login via ftp root ... ... ...
4.配置user_list文件
user_list文件指定的用戶可否訪問FTP服務器取決於userlist_deny選項的設置。默認爲YES,即禁止user_list文件的用戶訪問FTP服務器,這與ftpusers文件類似。可是若是設置爲NO,則徹底相反,即只容許該文件列表裏的用戶訪問該FTP服務器。
# vsftpd userlist # If userlist_deny=NO,only allow users in this file # If userlist_deny=YES(default),never allow users in this file,and do not even prompt for a password. # ... # ... root ...
若是要限制指定的本地用戶(即user_list文件的用戶)不能訪問FTP服務器,能夠相應地修改vsftpd.conf文件:
userlist_enable=YES userlist_deny=YES userlist_file=/etc/vsftpd/user_list
一樣,若是要限制指定的本地用戶(即user_list文件的用戶)可以訪問FTP服務器,而其餘的本地用戶不能訪問,能夠相應地修改vsftpd.conf文件:
userlist_enable=YES userlist_deny=NO userlist_file=/etc/vsftpd/user_list
5.配置容許匿名用戶使用FTP服務器
建立用戶ftp-anon和目錄/var/ftp-pub:
mkdir /var/ftp-pub useradd -d /var/ftp-pub ftp-anon //-d 指定用戶的主文件目錄,vsftpd默認登陸成功後的目錄是該用戶的home目錄。
做爲匿名訪問,/var/ftp-pub不該該屬於用戶ftp-anon,也不該該有寫權限,因此能夠用如下方法修改其權限:
~# chown root.root /var/ftp-pub ~# og-w -d /var/ftp-pub
修改vsftpd.conf文件:
anonymous_enable=YES //設置容許匿名訪問(默認開啓) //設置容許匿名上傳和建立目錄(非必須,慎用!) anon_upload_enable=YES anon_mkdir_write_enable=YES
6.虛擬用戶使用Vsftp服務器
上面的(包括通常的)ftp訪問都是經過創建系統賬號來訪問服務器的,這樣很不安全,若是權限配置錯誤將會使服務器受到威脅。可是,經過創建虛擬FTP帳戶(與系統賬號分離),就能夠大大加強系統的安全性。虛擬FTP帳戶只能用於文件傳輸,也叫guest用戶。它是把用戶名/密碼保存起來,再驗證的。因此Vsftp須要一個系統用戶的身份來讀取數據(用戶名/密碼)文件,即guest用戶,用以映射虛擬用戶。
具體配置以下:
(1)生成虛擬用戶口令庫文件。如下爲例:
~# vim login.txt zhangsan //username1 hehe //passwd1 lisi //username2 mimanicai //passwd2 ......
(2)配置生成Vsftp的認證文件
保存並退出,使用db_load命令生成口令庫文件:
~# db_load -T -t hash -f login.txt /etc/vsftpd/vsftpd_login.db
修改口令庫文件的權限:
chmod 600 /etc/vsftpd/vsftpd_login.db
編輯虛擬用戶所需的PAM配置文件
~# vim /etc/pam.d/vsftpd //加入如下兩行: auth required /lib/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login.db account required /lib/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login.db
(3)創建虛擬用戶訪問的目錄,並設置相應的訪問權限
~# useradd -d /home/ftp virtual ~# chmod 700 /home/ftp
(4)創建配置文件
~# cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak ~# vim /etc/vsftpd/vsftpd.conf //配置以下: anonymous_enable=YES local_enable=YES write_enable=YES anon_upload_enable=NO anon_mkdir_write_enable=NO listen=YES guest_enable=YES guest_username=virtual
(5)重啓Vsftp服務器
~# service vsftpd restart
至此,虛擬用戶使用Vsftp服務器配置將完成了。可使用login.txt裏的用戶賬號登陸FTP服務器了。
7.改變Vsftp的端口號
在vsftpd.conf文件里加入以下,並重啓vsftp。
~# listen_port=2121
8.配置Vstfp服務器的chroot
chroot就是爲登陸用戶指定一個固定的目錄,這個目錄通常是用戶的主目錄,用戶被限制在該目錄下,相似與WEB服務器的虛擬目錄,從而保護了系統安全。
設置指定的用戶執行chroot:
chroot_local_user=NO chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list
相關參考文章: http://wiki.ubuntu.org.cn/Vsftpd