VSFTP詳細配置說明
§·FTP(File Transfer Protocol 文件傳輸協議)介紹 1
§·Linux中 VSFTP基于mariadb用戶名密碼認證 7
§·FTP(File Transfer Protocol 文件傳輸協議)介紹
※·FTP: File Transfer Protocol,監聽的端口為TCP/21號端口(命令連接端口),數據傳輸端口為TCP/20號端口.
※·文件傳輸協議,應用層協議, 明文協議:認證及數據傳輸。
※·FTP為服務器端客戶端架構:
服務端實現:vsftpd, pureftpd, proftpd, …, Filezilla Server
客戶端實現:Linux: ftp, lftp ; Windows: cuteftp, Filezilla, Flashfxp, …
※·FTP簡單介紹
FTP 是File Transfer Protocol(文件傳輸協議)的英文簡稱,而中文簡稱為“文傳協議”。用于Internet上的控制文件的雙向傳輸。同時,它也是一個應用程序(Application)?;诓煌牟僮飨到y有不同的FTP應用程序,而所有這些應用程序都遵守同一種協議以傳輸文件。在FTP的使用當中,用戶經常遇到兩個概念:"下載"(Download)和"上傳"(Upload)。"下載"文件就是從遠程主機拷貝文件至自己的計算機上;"上傳"文件就是將文件從自己的計算機中拷貝至遠程主機上。用Internet語言來說,用戶可通過客戶機程序向(從)遠程主機上傳(下載)文件。
※·FTP賬戶分類
◎·Real帳戶
這類用戶是指在FTP服務上擁有帳號。當這類用戶登錄FTP服務器的時候,其默認的主目錄就是其帳號命名的目錄。但是,其還可以變更到其他目錄中去。如系統的主目錄等等。
◎·Guest用戶
在FTP服務器中,我們往往會給不同的部門或者某個特定的用戶設置一個帳戶。但是,這個賬戶有個特點,就是其只能夠訪問自己的主目錄。服務器通過這種方式來保障FTP服務上其他文件的安全性。這類帳戶,在Vsftpd軟件中就叫做Guest用戶。擁有這類用戶的帳戶,只能夠訪問其主目錄下的目錄,而不得訪問主目錄以外的文件。
◎·Anonymous(匿名)用戶
這也是我們通常所說的匿名訪問。這類用戶是指在FTP服務器中沒有指定帳戶,但是其仍然可以進行匿名訪問某些公開的資源。
在組建FTP服務器的時候,我們就需要根據用戶的類型,對用戶進行歸類。默認情況下,Vsftpd服務器會把建立的所有帳戶都歸屬為Real用戶。但是,這往往不符合企業安全的需要。因為這類用戶不僅可以訪問自己的主目錄,而且,還可以訪問其他用戶的目錄。這就給其他用戶所在的空間帶來一定的安全隱患。所以,企業要根據實際情況,修改用戶所在的類別。
§·FTP連接類型主動模式與被動模式
※·命令連接:傳輸指令,21/tcp ,客戶端發出請求,服務端21/tcp響應,數據連接:傳輸數據
※·數據連接必然是通過某個命令連接發起,由于數據連接的端口不同,FTP服務器有以下兩種工作模式:
※·主動模式(PORT)(服務器連接客戶端端口)
主動模式下,FTP客戶端從任意的非特殊的端口(N > 1023)連入到FTP服務器的命令端口–21端口。然后客戶端在N+1(N+1 >= 1024)端口監聽,并且通過N+1(N+1 >= 1024)端口發送命令給FTP服務器。服務器會反過來連接用戶本地指定的數據端口,比如20端口。以服務器端防火墻為立足點,要支持主動模式FTP需要打開如下交互中使用到的端口:
1 .FTP服務器命令(21)端口接受客戶端任意端口(客戶端初始連接)
2 .FTP服務器命令(21)端口到客戶端端口(>1023)(服務器響應客戶端命令)
3 .FTP服務器數據(20)端口到客戶端端口(>1023)(服務器初始化數據連接到客戶端數據端口)
4 .FTP服務器數據(20)端口接受客戶端端口(>1023)(客戶端發送ACK包到服務器的數據端口);
在第1步中,客戶端的命令端口與FTP服務器的命令端口建立連接,并發送命令“PORT 1027”。然后在第2步中,FTP服務器給客戶端的命令端口返回一個"ACK"。在第3步中,FTP服務器發起一個從它自己的數據端口(20)到客戶端先前指定的數據端口(1027)的連接,最后客戶端在第4步中給服務器端返回一個"ACK"。
主動方式FTP的主要問題實際上在于客戶端。FTP的客戶端并沒有實際建立一個到服務器數據端口的連接,它只是簡單的告訴服務器自己監聽的端口號,服務器再回來連接客戶端這個指定的端口。對于客戶端的防火墻來說,這是從外部系統建立到內部客戶端的連接,這是通常會被阻塞的。
※·被動模式(PASV)(客戶端連接服務器)
為了解決服務器發起到客戶的連接的問題,人們開發了一種不同的FTP連接方式。這就是所謂的被動方式,或者叫做PASV,當客戶端通知服務器它處于被動模式時才啟用。
在被動方式FTP中,命令連接和數據連接都由客戶端,這樣就可以解決從服務器到客戶端的數據端口的入方向連接被防火墻過濾掉的問題。當開啟一個FTP連接時,客戶端打開兩個任意的非特權本地端口(N >; 1024和N+1)。第一個端口連接服務器的21端口,但與主動方式的FTP不同,客戶端不會提交PORT命令并允許服務器來回連它的數據端口,而是提交PASV命令。這樣做的結果是服務器會開啟一個任意的非特權端口(P >; 1024),并發送PORT P命令給客戶端。然后客戶端發起從本地端口N+1到服務器的端口P的連接用來傳送數據。
對于服務器端的防火墻來說,必須允許下面的通訊才能支持被動方式的FTP:
1 .FTP服務器命令(21)端口接受客戶端任意端口(客戶端初始連接)
2 .FTP服務器命令(21)端口到客戶端端口(>1023)(服務器響應客戶端命令)
3 .FTP服務器數據端口(>1023)接受客戶端端口(>1023)(客戶端初始化數據連接到服務器指定的任意端口)
4 .FTP服務器數據端口(>1023)到客戶端端口(>1023)(服務器發送ACK響應和數據到客戶端的數據端口)
在第1步中,客戶端的命令端口與服務器的命令端口建立連接,并發送命令“PASV”。然后在第2步中,服務器返回命令"PORT 2024",告訴客戶端(服務器)用哪個端口偵聽數據連接。在第3步中,客戶端初始化一個從自己的數據端口到服務器端指定的數據端口的數據連接。最后服務器在第4 步中給客戶端的數據端口返回一個"ACK"響應。
被動方式的FTP解決了客戶端的許多問題,但同時給服務器端帶來了更多的問題。最大的問題是需要允許從任意遠程終端到服務器高位端口的連接。幸運的是,許多FTP守護程序,包括流行的WU-FTPD允許管理員指定FTP服務器使用的端口范圍。詳細內容參看附錄1。
第二個問題是客戶端有的支持被動模式,有的不支持被動模式,必須考慮如何能支持這些客戶端,以及為他們提供解決辦法。例如,Solaris提供的FTP命令行工具就不支持被動模式,需要第三方的FTP客戶端,比如ncftp。
隨著WWW的廣泛流行,許多人習慣用web瀏覽器作為FTP客戶端。大多數瀏覽器只在訪問ftp://這樣的URL時才支持被動模式。這到底是好還是壞取決于服務器和防火墻的配置
※·VSFTP中用戶分類
本地用戶(系統用戶):root及系統用戶(0-999);
匿名用戶(映射至某一固定的系統用戶):ftp, vsftp, /var/ftp/
虛擬用戶:(不是系統自身賬戶)
nsswitch: name service switch
PAM:Plugable Authentication Modules
※·VSFTP程序文件及其配置文件介紹
[
root@Centos7 ftp]#yum install vsftpd [root@Centos7 ftp]# rpm -ql vsftpd /etc/logrotate.d/vsftpd /etc/pam.d/vsftpd #關于vsftpd提供本地用于認證模塊 /etc/vsftpd #vsftpd配置文件目錄 /etc/vsftpd/ftpusers #禁止登陸FTP的賬戶列表 /etc/vsftpd/user_list #啟用某個功能拒絕與運行的用戶列表 /etc/vsftpd/vsftpd.conf #vsftpd主配置文件 /etc/vsftpd/vsftpd_conf_migrate.sh /usr/lib/systemd/system-generators/vsftpd-generator /usr/lib/systemd/system/vsftpd.service #systemd 控制vsftpd服務腳本文件 /usr/lib/systemd/system/vsftpd.target /usr/lib/systemd/system/vsftpd@.service /usr/sbin/vsftpd #vsftpd程序 /var/ftp #默認vsftp的下載目錄 /var/ftp/pub #默認vsftp的下載目錄
vsftpd:very secure ftp daemon
程序:/usr/sbin/vsftpd
配置文件:/etc/vsftpd/vsftpd.conf
CentOS 6:
/etc/rc.d/init.d/vsftpd
chkconfig vsftpd on
CentOS 7:
/usr/lib/systemd/system/vsftpd.service
systemctl enable vsftpd.service
vim /etc/vsftpd/vsftpd.conf anonymous_enable=YES #是否允許匿名賬戶登錄FTP服務器 local_enable=YES #是否允許本地賬戶登錄FTP服務器 write_enable=YES #是否開啟目錄上次權限(控制所有賬戶) anonymous_enable=YES #是否允許匿名賬戶登錄FTP服務器 anon_upload_enable=YES #匿名用戶的上傳操作;生效要依賴于write_enable=YES; anon_mkdir_write_enable=YES #匿名用戶創建目錄的權限; anon_other_write_enable=YES #匿名用戶的刪除及重命名操作權限; local_enable=YES #所有的非匿名的生效,都依賴于此指令; local_umask=022 #本地用戶上傳文件的權限掩碼; 目錄消息: dirmessage_enable=YES #用戶第一次進入目錄時,vsftpd會查看.message文件,并將其內容顯示給用戶; message_file #指定文件路徑,而不使用默認的.message; 數據傳輸日志: xferlog_enable #是否開啟日志功能 xferlog_std_format #日志的格式 xferlog_file=/var/log/xferlog #日志的存放路徑 數據傳輸模式: connect_from_port_20 #是否啟用PORT模式; 修改匿名用戶上傳的文件的屬主: chown_uploads #是否修改; chown_username #啟用chown_uploads指令時,將文件屬主修改為此指令指定的用戶;默認為root; chown_upload_mode #設定匿名用戶上傳的文件的權限;默認為600; 設定會話超時時長: idle_session_timeout #空閑會話超時時長; connect_timeout #PORT模式下,服務器連接客戶端的超時時長; data_connection_timeout #數據傳輸的超時時長; 命令連接的監聽端口: listen_port #默認為21; 設定連接及傳輸速率: local_max_rate #本地用戶的最大傳輸速率,單位是字節;默認為0,表示無限制; anon_max_rate #匿名用戶的最大傳輸速率; max_clients #最大并發連接數; max_per_ip #每個IP所允許發起的最大連接數; 禁錮本地用戶: chroot_local_user=YES #禁錮所有本地用戶;注意:要求用戶不能對家目錄有寫權限; chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list #禁錮指定用戶于家目錄中; 用法訪問控制 userlist_enable=YES 啟用時,vsftpd將加載一個由userlist_file指令指定的用戶列表文件;此文件中的用戶是否能訪問vsftpd服務取決于userlist_deny指令; userlist_deny=YES #表示此列表為黑名單; userlist_deny=NO #表示此列表為白名單;
pam_service_name=vsftpd #驗證本地賬戶可以登錄FTP服務器。
注意事項:
vsftpd文件為 /etc/pam.d/vsftp,查看cat /etc/pam.d/vsftp
[root@Centos7 ftp]# 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 #此處禁用 /etc/vsftpd/ftpusers的用戶登錄FTP系統 auth required pam_shells.so auth include password-auth account include password-auth session required pam_loginuid.so session include password-auth [root@Centos7 ftp]#
§·Linux中 VSFTP基于mariadb用戶名密碼認證
※·設置vsftpd主配置文件中參數設置
~]#vim /etc/vsftpd/vsftpd.conf write_enable=YES #禁止匿名賬戶登錄,所有的賬戶其實是映射到本地賬戶權限的 local_enable=YES #開啟本地賬戶登錄權限 write_enable=YES #開啟上傳總開關,實際的上次權限在獨立文件中定義 pam_service_name=vsftpd.sql #設置pam認證的選項,通過/etc/pam.d/vsftpd.sql文件認證sql用戶 guest_enable=YES #設置啟用虛擬賬戶認證功能 (啟用來賓賬號功能) guest_username=vuser #設置映射的賬戶(把來賓賬號映射的實際系統賬戶) user_config_dir=/etc/vsftpd/users_conf #在該目錄下設置虛擬賬戶同名文件控制賬戶獨立權限
※·設置vsftpd的虛擬賬戶的本地映射實際賬戶
該文件的名稱根據 /etc/vsftpd/vsftpd.conf 設置
~]# mkdir /ftproot #創建映射賬戶的家目錄 ~]# useradd -d /ftproot vuser #設置虛擬賬戶 vuser ~]# mkdir /ftproot/{pub,upload} #在家目錄中新增兩個FTP目錄 ~]# setfacl -m u:vuser:rwx /ftproot/upload #設置vuser對upload有上傳修改權限
該文件的名稱根據 /etc/vsftpd/vsftpd.conf 設置
# mkdir /etc/vsftpd/vusers_conf #touch /etc/vsftpd/vusers_conf/{tom,jerry} #vim /etc/vsftpd/vusers_conf/tom
※·設置vsftpd的pam可以訪問mysql數據庫中的賬戶
pam配置文件:/etc/pam.d/vsftpd.mysql
auth required pam_mysql.so user=vsftpd passwd=mageedu host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2 account required pam_mysql.so user=vsftpd passwd=mageedu host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
參數解釋:
auth required:驗證用戶名和密碼是否存儲 pam_mysql.so :通過pam_mysql.so共享模塊訪問mysql數據庫(模塊文件路徑為:/usr/lib64/securit/pam_mysql.so) user=vsftpd passwd=mageedu host=localhost :登錄mysql服務器的用戶名和密碼,及其mysql服務器地址 db=vsftpd : mysql服務器上的數據庫名稱 table=users : mysql服務器上的表名稱 usercolumn=name : mysql表中用戶名字段 passwdcolumn=password : mysql表中密碼字段 crypt=2 : mysql數據庫中加密類型
◎·編譯pam連接mariadb的共享庫文件pam_mysql.so
準備編譯環境,安裝編譯需要的頭文件,庫文件,下載連接程序 pam_mysql-0.7RC1
# yum -y groupinstall "Development Tools" "Server Platform Development" # yum -y install pam-devel openssl-devel mariadb-devel
下載下載連接程序 pam_mysql-0.7RC1,編譯并安裝
~]#get http://10.1.0.1/pub/pam/pam_mysql-0.7RC1 ~]#tar -xf pam_mysql-0.7RC1 ~]#cd pam_mysql-0.7RC1 ~]# ./configure --with-mysql=/usr --with-openssl=/usr --with-pam=/usr --with-pam-mods-dir=/usr/lib64/security ~]# make && make install 生成的共享模塊pam_mysql.so會自動安裝到 :/usr/lib64/securit/pam_mysql.so
◎·安裝mariadb,創建本地數據庫,建立對應的用戶名和密碼
創建數據庫,創建表,插入用戶名和密碼數據,添加訪問賬戶
mysql> CREATE DATABASE vsftpd; mysql> CREATE TABLE vsftpd.users \ (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, \ name CHAR(30) NOT NULL UNIQUE KEY, \ password CHAR(48)); mysql> INSERT INTO vsftpd.users(name,password) \VALUES ('tom',PASSWORD('mageedu')),('jerry',PASSWORD('mageedu')); mysql> GRANT ALL ON vsftpd.* TO 'vsftpd'@'localhost' IDENTIFIED BY 'mageedu'; mysql> GRANT ALL ON vsftpd.* TO 'vsftpd'@'127.0.0.1' IDENTIFIED BY 'mageedu'; mysql> FLUSH PRIVILEGES;
※·小結:關于vsftpd 基于本地MySQL認證用戶名和密碼
1 . 配置vsftpd的主配置文件基于pam認證的功能;
2 . 配置pam認證的配置文件連接mysql可以讀取mysql數據庫中的用戶名和密碼;
3 . 登錄到vsftp的虛擬用戶需要映射到本地實際的存在的用戶名和密碼,這個需要自己手工配置。
4 . 對個每個mysql數據庫中的用戶名和密碼的權限控制在 user_config_dir=/etc/vsftpd/users_conf 目錄下,新 建同名的文件,在文件中指明權限,參數為vsftpd主配置文件中對于匿名用戶的權限。
※·vsftpd基于本地用戶文件認證
vsftpd虛擬賬戶的數據保存在berkeley DB格式的數據文件中,需要安裝 db4-utils工具來創建這樣的數據文件,具體的步驟如下:
1.創建虛擬用戶的數據庫文件
(通過db4-utils把文件轉為berkeley DB格式文件)
注意:Centos 7 的安裝包為:libdb-utils-5.3.21-19.el7.x86_64
[root@Centos7 vsftpd]# rpm -ql libdb-utils-5.3.21-19.el7.x86_64 /usr/bin/db_archive /usr/bin/db_checkpoint /usr/bin/db_deadlock /usr/bin/db_dump /usr/bin/db_dump185 /usr/bin/db_hotbackup /usr/bin/db_load /usr/bin/db_log_verify /usr/bin/db_printlog /usr/bin/db_recover /usr/bin/db_replicate /usr/bin/db_stat /usr/bin/db_tuner /usr/bin/db_upgrade /usr/bin/db_verify [root@Centos7 vsftpd]#
首先需要創建明文的密碼文件,明文文件奇數行為用戶名,偶數行為密碼,然后使用db_load工具將其轉換為數據庫文件。
~]# cat vlogin sb 123456 sa 123456 sc 123456 sd 123456 ~]# db_load -T -t hash -f vlogin vlogin.db ~]# ll -rw-r--r--. 1 root root 40 Oct 14 12:32 vlogin -rw-r--r--. 1 root root 12288 Oct 14 12:33 vlogin.db ~]#
2.修改配置文件/etc/vsftpd/vsftpd.conf
pam_service_name=vlogin guest_enable=YES guest_username=vuser user_config_dir=/etc/vsftpd/users_conf
3.添加/etc/pam.d/vlogin文件內容
[root@Centos7 vsftpd]# cat /etc/pam.d/vlogin auth required /usr/lib64/security/pam_userdb.so db=/etc/vsftpd/vlogin account required /usr/lib64/security/pam_userdb.so db=/etc/vsftpd/vlogin
※·小結:關于VSFTP基于本地用戶文件認證流程:
1 . 創建本地用戶文件,并且把文件轉換成二進制格式;
2 . 配置vsftpd的主配置文件,添加pam認證的功能;
3 . 配置pam的配置文件,可以讀取本地二進制文件;
4 . 測試通過本地文件中的用戶名和密碼登陸
§·常見問題處理
原創文章,作者:linux_root,如若轉載,請注明出處:http://www.www58058.com/51606