Linux下FTP虛擬賬號環境部署總結

散盡浮華發表於2016-06-15

 

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

相關文章