vsftp的使用者有三種型別:匿名使用者、系統使用者、虛擬使用者。
1)匿名登入:在登入FTP時使用預設的使用者名稱,一般是ftp或anonymous。
2)本地使用者登入:使用系統使用者登入,在/etc/passwd中。
3)虛擬使用者登入:這是FTP專有使用者,有兩種方式實現虛擬使用者,本地資料檔案和資料庫伺服器。
FTP虛擬使用者是FTP伺服器的專有使用者,使用虛擬使用者賬號可以提供集中管理的FTP根目錄,方便了管理員的管理,同時將用於FTP登入的使用者名稱、密碼與系統使用者賬號區別開,進一步增強了FTP伺服器的安全性。某種意義上來說,匿名使用者也是系統使用者,只是系統使用者的一個對映。公開的FTP都不會使用系統使用者作為FTP帳號,而更多的採用了虛擬使用者,這樣能保證系統的安全性。使用虛擬使用者登入FTP伺服器,可以避免使用作業系統帳號作為FTP使用者帶來的一些安全問題,也便於通過資料庫或其它程式來進行管理。虛擬使用者的特點是隻能訪問伺服器為其提供的FTP服務,而不能訪問系統的其它資源。所以,如果想讓使用者對FTP伺服器站內具有寫許可權,但又不允許訪問系統其它資源,可以使用虛擬使用者來提高系統的安全性。
在VSFTP中,認證這些虛擬使用者使用的是單獨的口令庫檔案(pam_userdb),由可插入認證模組(PAM)認證。使用這種方式更加安全,並且配置更加靈活。
基本流程:FTP使用者訪問->PAM配置檔案(由vsftpd.conf中pam_service_name指定)->PAM論證->區別使用者讀取配置檔案(由vsftpd.conf中user_config_dir指定配置檔案路徑,檔名即使用者名稱)
有兩種方式建立FTP的虛擬使用者,分別是:本地資料檔案方式、資料庫伺服器(MySQL)方式
廢話不多說,這裡記錄下centos6版本下采用本地資料檔案方式部署FTP虛擬賬號登陸環境的過程及其中遇到的問題:
1)yum安裝vsftpd [root@i-f658wfj6 ~]# yum install -y vsftpd [root@i-f658wfj6 ~]# yum install -y db4 [root@cms_web vsftpd]# pwd /etc/vsftpd 2)配置vsftpd(將vsftpd.conf檔案備份,然後將配置內容直接貼上下面內容) [root@cms_web vsftpd]# cat vsftpd.conf|grep -v "^#" anonymous_enable=NO //不允許匿名賬號訪問 local_enable=YES //本地使用者可以訪問(採用虛擬賬號訪問時,這個引數也要開啟(虛擬賬號要寄宿本地賬號),雖然開啟但是本地賬號是不可以登陸的) write_enable=YES //可寫可上傳。這個引數是全域性配置,否則上傳和下載都會報錯550! local_umask=022 dirmessage_enable=YES xferlog_enable=YES xferlog_std_format=YES ascii_upload_enable=YES ascii_download_enable=YES ftpd_banner=Welcome to FTP service //登陸FTP時顯示的歡迎資訊 listen=YES chroot_local_user=NO //限制所有的本地使用者在自家目錄,即使用者登陸系統後鎖定在自家目錄。虛擬主機配置下,在下面兩個chroot配置後,這個引數必須為NO,否則登陸FTP後還可以訪問其他目錄! chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list //指定不能離開家目錄的使用者列表檔案,一行一個使用者。使用此方法時必須chroot_local_user=NO。說明這個列表裡面的使用者登陸ftp後都只能訪問其主目錄,其他目錄都不能訪問! pam_service_name=vsftpd //指定PAM配置檔案,即下面的/etc/pam.d/vsftpd檔案要和這裡指定的一致。 userlist_enable=YES tcp_wrappers=YES virtual_use_local_privs=YES //這個引數一定要加上,虛擬使用者和本地使用者有相同的許可權;否則ftp連上後不能上傳,報錯550許可權拒絕! guest_enable=YES //啟用虛擬使用者 guest_username=nobody //將虛擬使用者對映為本地nobody使用者(前提是local_enable=YES) user_config_dir=/etc/vsftpd/vuser_conf //指定不同虛擬使用者配置檔案的存放路徑 connect_from_port_20=YES //通過20埠傳輸資料 listen_port=2021 //監聽的ftp埠 pasv_min_port=40001 //分配給ftp賬號的最小埠。被動模式下的配置 pasv_max_port=40100 //分配給ftp賬號的最大埠。每個賬號分配一個埠,即最大允許100個ftp賬號連線。 max_clients=150 //客戶端的最大連線數 accept_timeout=5 connect_timeout=1 max_per_ip=5 //每個ip最大連線數 ----------------------------------------------------------------------------------------- 溫馨提示: 上面的ftp是被動模式下的配置,配置後需要在iptables防火牆開通ftp訪問 [root@cms_web vsftpd]# cat /etc/sysconfig/iptables ............ -A INPUT -s 10.68.250.13 -m state --state NEW -m tcp -p tcp --dport 2021 -j ACCEPT -A INPUT -s 10.68.250.13 -m state --state NEW -m tcp -p tcp --dport 40001:40100 -j ACCEPT .......... ----------------------------------------------------------------------------------------- 設定登陸ftp的虛擬賬號檔案(格式依次是:第一行是賬戶名,次行是該賬號的密碼;即奇數行是賬戶名,偶數行是對應上一行的賬戶密碼)。 這個虛擬賬號是不需要手動建立的,它不是真實存在於系統中的,即/etc/passwd檔案裡沒有的,它是藉助於宿主賬號nobody。 [root@cms_web vsftpd]# cat vuser_passwd.txt hqsbcms hqsbcms_2016@huanqiu.com 生成虛擬使用者口令認證的db檔案(該檔案設定600許可權),這是本地資料庫檔案 [root@cms_web vsftpd]# db_load -T -t hash -f /etc/vsftpd/vuser_passwd.txt /etc/vsftpd/vuser_passwd.db [root@cms_web vsftpd]# chmod 600 /etc/vsftpd/vuser_passwd.db [root@cms_web vsftpd]# cat /etc/vsftpd/chroot_list //將虛擬使用者放在這個列表檔案裡,說明這些使用者登陸後都只能鎖定到對應主目錄內 hqsbcms [root@cms_web vsftpd]# mkdir vuser_conf //此目錄名是在vsftpd.conf配置中指定的,裡面是虛擬使用者配置檔案(檔名是虛擬使用者名稱) [root@cms_web vsftpd]# cat vuser_conf/hqsbcms local_root=/hqsb/ftp/ //指定虛擬賬號登陸後的主目錄,目錄許可權要是宿主賬號nobody,這樣就可以實現賬號對映 write_enable=YES //寫許可權 anon_umask=022 anon_world_readable_only=NO //下載許可權(當其他四項的YES為NO時,則此賬號登陸FTP後只有可讀和下載許可權了) anon_upload_enable=YES //上傳許可權 anon_mkdir_write_enable=YES //建立目錄許可權 anon_other_write_enable=YES //刪除和重新命名許可權 [root@bastion-IDC vsftpd]# ll /lib64/security/pam_userdb.so -rwxr-xr-x. 1 root root 10280 May 11 2016 /lib64/security/pam_userdb.so [root@cms_web vsftpd]# 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 password-auth #account include password-auth #session required pam_loginuid.so #session include password-auth # 32-bit #auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/vuser_passwd #account required /lib64/security/pam_userdb.so db=/etc/vsftpd/vuser_passwd # 64-bit auth sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/vuser_passwd //這個vuser_passwd根據的是vuser_passwd.db account sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/vuser_passwd //這裡64bit系統,必須用sufficient,否則上面vuser_conf目錄下的虛擬主機配置檔案無效! [root@bastion-IDC ~]# cat /etc/passwd|grep nobody //宿主賬號nobody的資訊不用做任何修改,shell型別是不是/sbin/nologin都可以,不影響ftp登陸限制到主目錄下,因為vsfprd裡配置了三個chroot。 nobody:x:99:99:Nobody:/:/sbin/nologin [root@cms_web vsftpd]# chown -R nobody.nobody /hqsb/ftp //設定虛擬賬號hqsbcms指定的主目錄的許可權為nobody,這樣就可以對映到宿主賬號nobody [root@cms_web vsftpd]# chmod -R 700 /hqsb/ftp [root@cms_web vsftpd]# /etc/init.d/vsftpd start [root@bastion-IDC vsftpd]# ll /hqsb/ftp/ total 4 -rwxrwxrwx. 1 nobody nobody 0 Mar 29 12:53 aaa drwxrwxrwx. 2 nobody nobody 4096 Mar 29 12:53 test
------------------------------------------------------------------------
vsftpd程式啟動報錯:
starting vsftpd for vsftpd: 500 OOPS: bad bool value in config file for: anonymous_enable
處理辦法: 要保證vsftpd.conf檔案裡每行的配置後面都不要有空格。 解決: vim編輯/etc/vsftpd/vsftpd.conf檔案,在尾行模式下輸入“:%s/\s\+$”,然後回車即可。
-----------------------------------------------------------------------------------------------------------------------------------------
vim刪除行首行尾空格和tab的命令如下(非編輯狀態下輸入):
:%s/^\s\+ 刪除行首的空格和tab
:%s/\s\+$ 刪除行尾的空格和tab
上面兩條命令的解釋:
%s 表示全域性搜尋
/ 為分隔符。
^ 代表行首
\s 代表空格和tab
\+ 代表匹配一個或多個
$ 匹配行尾
------------------------------------------------------------------------------------------------------------------------------------------
問題一:在ftp客戶端(比如FileZilla)進行連線,發現連線失敗,無法連線到伺服器!如下(103.110.186.5為上面ftp伺服器外網ip)
原因及解決:由於上面ftp配置中採用的是被動模式,而客戶端連線預設的是主動模式。所以需要手動修改下客戶端的預設配置。修改如下:
依次點選FileZilla客戶端左上角的"檔案"->"站點管理器"->"新建站點"
這樣,就能正常連線上FTP伺服器了。以後每次連線的時候,就依次開啟左上角"檔案"->"站點管理器"裡之前設定並儲存好的站點就行(如上面的185.5-ftp站點)。使用上訴虛擬賬號登陸ftp後,只能登陸到其設定的主目錄/hqsb/ftp下,伺服器上的其他目錄資源都不能訪問!
問題二:登陸ftp時出現下面報錯
500 OOPS: cannot change directory:/hqsb/ftp Login failed. 421 Service not available, remote server has closed connection 解決辦法:通常為Selinux導致,關閉Selinux即可。
---------------------------------------------------------------------------------------------------------------------------------------
溫馨提示:
瀏覽器訪問只支援FTP的被動模式,也就是說只有在FTP配置成被動模式時,才能在遠端瀏覽器裡通過url訪問。比如上面配置後,可以通過web訪問ftp://103.110.186.5:2021/
-----------------------FTP資料安全:使用SSL加密傳輸(不再使用明文傳輸)------------------------------
按照上面的配置後,FTP連線後的資料傳輸嚴格來說是不太安全的,因為是使用明文傳輸。如下截圖,客戶端連線過程中會提示“不安全的伺服器,...”
這種情況下,我們可以使用SSL加密傳輸,配置過程如下:
[root@bastion-IDC ~]# mkdir /etc/vsftpd/sslkey [root@bastion-IDC ~]# cd /etc/vsftpd/sslkey [root@bastion-IDC sslkey]# openssl req -new -x509 -nodes -out vsftpd.pem -keyout vsftpd.pem Generating a 2048 bit RSA private key .........................................................................................+++ ...................................+++ writing new private key to 'vsftpd.pem' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:CN State or Province Name (full name) []:beijing Locality Name (eg, city) [Default City]:beijing Organization Name (eg, company) [Default Company Ltd]:huanqiu Organizational Unit Name (eg, section) []:technology Common Name (eg, your name or your server's hostname) []:huanqiu Email Address []:wangshibo@huanqiu.cn [root@bastion-IDC sslkey]# ls vsftpd.pem [root@bastion-IDC sslkey]# vim /etc/vsftpd/vsftpd.conf //在檔案最底部新增下面幾行 ssl_enable=YES ssl_sslv2=NO ssl_sslv3=NO ssl_tlsv1=YES ssl_ciphers=HIGH require_ssl_reuse=NO force_local_logins_ssl=YES force_local_data_ssl=YES rsa_cert_file=/etc/vsftpd/sslkey/vsftpd.pem [root@bastion-IDC sslkey]# /etc/init.d/vsftpd restart Shutting down vsftpd: [ OK ] Starting vsftpd for vsftpd: [ OK ]
然後再次在客戶端連線FTP(注意FTP客戶端配置中的加密型別中要支援"FTP over TLS"),發現就就會建立TLS安裝連線了。(連線中,會出現是否信任證書的提示,信任即可)
不過注意:做了SSL加密傳輸後的FTP在瀏覽器裡就不能訪問了。
----------------------------新增虛擬賬號-----------------------------------
比如新增賬號ops(密碼為ops@123),指定目錄為/mnt/ops,操作如下: [root@bastion-IDC vsftpd]# pwd /etc/vsftpd [root@bastion-IDC vsftpd]# cat chroot_list hqsbcms ops [root@bastion-IDC vsftpd]# cat vuser_passwd.txt hqsbcms hqsbcms_2016@huanqiu.com ops ops@123 [root@bastion-IDC vsftpd]# db_load -T -t hash -f /etc/vsftpd/vuser_passwd.txt /etc/vsftpd/vuser_passwd.db [root@bastion-IDC vsftpd]# cat vuser_conf/ops local_root=/mnt/ops/ write_enable=YES anon_umask=022 anon_world_readable_only=NO anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES [root@bastion-IDC vsftpd]# chown -R nobody.nobody /mnt/ops [root@bastion-IDC vsftpd]# chmod -R 777 /mnt/ops 照此操作就可以新增FTP虛擬賬號了,每個虛擬賬號可以對應一個主目錄,並且限定到只能ftp訪問該主目錄 ------------------------------------------------------------ 如果想讓虛擬賬號ops許可權為只讀以及只能下載(沒有上傳、刪除、重新命名、建立檔案目錄等寫許可權),那麼它的配置修改如下: [root@bastion-IDC vsftpd]# cat vuser_conf/ops local_root=/mnt/ops/ write_enable=NO anon_umask=022 anon_world_readable_only=NO anon_upload_enable=NO anon_mkdir_write_enable=NO anon_other_write_enable=NO
--------------------------------Haproxy代理層配置上面Ftp虛擬賬號登陸環境的訪問---------------------------------------
下面配置表示本機haproxy的2021埠代理到10.68.250.198(這是後端的ftp伺服器)的2021埠(ftp服務埠)。
本機的iptables防火牆裡開放2021和40001:40100;而10.68.250.198機器的2021和40001:40100埠要對haproxy代理機開放。
Haproxy配置方法一:
[root@mysql-master ~]# cat /etc/haproxy/haproxy.cfg ....... listen ftp_198 0.0.0.0:2021 mode tcp option tcplog balance roundrobin server 10.68.250.198 10.68.250.198 check port 2021 inter 10s rise 1 fall 2 listen ftp_date_198 0.0.0.0:40001-40100 mode tcp option tcplog balance roundrobin server 10.68.250.198 10.68.250.198 check port 2021 inter 10s rise 1 fall 2
Haproxy配置方法二:
[root@mysql-master ~]# cat /etc/haproxy/haproxy.cfg ....... frontend ftp_198 0.0.0.0:2021 mode tcp bind *:2021 default_backend ftp_server frontend ftp_date_198 0.0.0.0:40001-40100 mode tcp bind *:40001-40100 default_backend ftp_server_data backend ftp_server mode tcp server ftp 10.68.250.198 check port 2021 inter 10s rise 1 fall 2 backend ftp_server_data mode tcp server ftp 10.68.250.198 check port 2021 inter 10s rise 1 fall 2