VSFTP是一個在UNIX/Linux操作系統上運行的FTP服務器,安全性是它的一個最大的特點。它可以運行在諸如Linux、BSD、Solaris、 HP-UNIX等系統上面,是一個完全免費的、開發源代碼的FTP服務器軟件,支持很多其他的FTP服務器所不支持的特征。比如:非常高的安全性需求、帶寬限制、良好的可伸縮性、可創建虛擬用戶、支持IPv6、速率高等。
本文所有配置是在CentOS 5.8-64位系統上進行,配置的是vsftp虛擬用戶模式,虛擬用戶的特點是只能訪問服務器為其提供的FTP服務,而不能訪問系統的其它資源。所以,如果想讓用戶對FTP服務器站內具有寫權限,但又不允許訪問系統其它資源,可以使用虛擬用戶來提高系統的安全性。
VSFTP安裝與配置
安裝
使用yum命令來安裝vsftpd和DB軟件包:
yum -y install vsftpd db4-utils
建立口令庫文件
建立虛擬用戶口令庫文件,使用文本編輯器創建一個文本文件,第一行寫:用戶名;第二行寫:密碼,依此類推:
vim logins.txt sunkai <--虛擬用戶名 123456 <--密碼
生成認證文件
使用db_load命令生成vsftpd的認證文件,將用戶信息文件轉換為數據庫並使用hash加密:
db_load -T -t hash -f logins.txt /etc/vsftpd/vsftpd_login.db
賦權:
chmod 600 /etc/vsftpd/vsftpd_login.db
數據庫生成后最好清空該文本文件,並在安全的地方記錄用戶名和密碼:
rm -f logins.txt
db_load參數解釋:
- 選項
-T
允許應用程序能夠將文本文件轉譯載入進數據庫。由於我們之后是將虛擬用戶的信息以文件方式存儲在文件里的,為了讓Vsftpd這個應用程序能夠通過文本來載入用戶數據,必須要使用這個選項。如果指定了選項-T
,那么一定要追跟子選項-t
。 - 子選項
-t
,追加在在-T
選項后,用來指定轉譯載入的數據庫類型。擴展介紹下,-t
可以指定的數據類型有Btree、Hash、Queue和Recon數據庫。 - 選項
-f
的參數是包含用戶名和密碼的文本文件,文件的內容是:奇數行用戶名、偶數行密碼。
建立PAM配置文件
建立虛擬用戶所需的PAM配置文件,目的是對虛擬用戶的安全和賬戶權限進行驗證。
- auth是對用戶密碼進行驗證。
- accout是對用戶的權限進行驗證。
vim /etc/pam.d/vsftpd 加入下面內容,其他行全部注釋: auth required /lib/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login account required /lib/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login 64位系統: auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login account required /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login
創建賬戶和設置權限
創建虛擬用戶
創建一個不能登錄系統的用戶ftpuser用於映射虛擬用戶,用戶名ftpuser可以隨意設置:
useradd -d /home/ftpsite -s /sbin/nologin ftpuser chmod 700 /home/ftpsite/
在vsftpd.conf
中添加配置項:
guest_enable=YES guest_username=ftpuser
當guest_enable
激活(YES)時,guest_username
是定義了虛擬用戶在系統中的用戶名。
創建宿主目錄,也可以指定系統其他目錄:
mkdir /home/ftpsite/sunkai
設置權限
對不同虛擬用戶設置不同權限,創建虛擬用戶配置文件存放位置:
mkdir /etc/vsftpd/vsftpd_user_conf
vim /etc/vsftpd/vsftpd_user_conf/sunkai #建立用戶單獨配置文件,文件名就是虛擬用戶名。 local_root=/home/ftpsite/sunkai #這里的目錄可以是系統中其他目錄,根據用途定義。 file_open_mode=0777 write_enable=YES virtual_use_local_privs=YES #配置虛擬用戶具有寫權限(上傳、下載、刪除、重命名)
在vsftpd.conf
添加配置項:
user_config_dir=/etc/vsftpd/vsftpd_user_conf
禁錮FTP用戶在宿主目錄
將需要禁錮的用戶名寫入chroot_list
文件,將用戶固定在local_root
定義的目錄內。當chroot_list_enable
激活(YES)時,在chroot_list_file
指定文件中的用戶將會禁錮在宿主目錄中。
vim /etc/vsftpd/chroot_list chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list #每一行寫一個用戶名。
其他權限配置方案
虛擬用戶和本地用戶有相同的權限 virtual_use_local_privs=YES 虛擬用戶和匿名用戶有相同的權限,默認是NO virtual_use_local_privs=NO 虛擬用戶具有寫權限(上傳、下載、刪除、重命名) virtual_use_local_privs=YES write_enable=YES 虛擬用戶不能瀏覽目錄,只能上傳文件,無其他權限 virtual_use_local_privs=NO write_enable=YES anon_world_readable_only=YES anon_upload_enable=YES 虛擬用戶只能下載文件,無其他權限 virtual_use_local_privs=NO write_enable=YES anon_world_readable_only=NO anon_upload_enable=NO 虛擬用戶只能上傳和下載文件,無其他權限 virtual_use_local_privs=NO write_enable=YES anon_world_readable_only=NO anon_upload_enable=YES 虛擬用戶只能下載文件和創建文件夾,無其他權限 virtual_use_local_privs=NO write_enable=YES anon_world_readable_only=NO anon_mkdir_write_enable=YES 虛擬用戶只能下載、刪除和重命名文件,無其他權限 virtual_use_local_privs=NO write_enable=YES anon_world_readable_only=NO anon_other_write_enable=YES
FTP的主動端口與被動端口配置
大多數的TCP服務是使用單個的連接,一般是客戶端向服務器的一個已知端口發起連接,然后使用這個連接進行通訊。但FTP協議卻是例外,它使用雙向的多個連接 ,而且使用的端口很難預計。
FTP協議連接和端口
- 一個控制連接(control connection):用於傳遞客戶端和服務器端之間的命令響應。使用TCP 21端口,生存期是整個FTP會話時間。
- N個數據連接(data connection):用於傳輸數據,這種連接是在數據傳輸時建立的,一旦數據傳輸完畢就關閉,每次使用的端口也不一定相同。而且,這種數據 連接既可能是客戶端發起的,也可能是服務器端發起的。
- FTP協議使用一個標准的端口20作為ftp-data端口,但是這個端口只用於連接的源地址是服務器端的情況,在這個端口上根本就沒有監聽進程。
ftp的端口號20、21有何區別?
一個是數據端口,一個是控制端口,控制端口一般為21,而數據端口不一定是20,這和FTP的應用模式有關,如果是主動模式,應該為20,如果為被動模式,由服務器端和客戶端協商而定
主動與被動模式
FTP的數據連接和控制連接一般是相反方向,即服務器向客戶端發起一個用於數據傳輸的連接。連接的端口是由服務器端和客戶端協商確定的,這就是vsftpd的主動模式(port mod)。FTP協議的這個特征對iptables防火牆和NAT的配置增加了很多困難。在FTP被動模式(passive mod)下,數據連接是由客戶程序發起的,和主動模式相反。
選擇模式的原則
- 客戶端沒有防火牆時,用主動模式連接即可。
- 服務器端沒有防火牆時,用被動模式即可。
- 雙方都有防火牆時,vsftpd設置被動端口范圍,服務器端防火牆打開被動端口范圍,客戶端用被動模式連接即可。
是否采取被動模式取決於客戶程序:
- 在ftp命令行中使用
passive
命令就可以關閉/打開被動模式。 - 在Windows命令行模式下使用ftp命令連接服務器,用的是主動模式。
- 在瀏覽器方式下連接ftp服務器,可以修改訪問使用模式:
- 用FileZilla Client軟件連接服務器,在“編輯”-“設置”-“連接”選項內設置使用模式:
iptables中配置vsftp的方法
使用主動模式
配置iptables防火牆:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p tcp -m multiport --dport 20,21 -m state --state NEW -j ACCEPT
使用被動模式
方法1
加載模塊ip_conntrack_ftp
,優點:不影響ftp的配置,缺點:客戶端會感覺到連接有些延遲。
- 在
/etc/sysconfig/iptables-config
中添加:IPTABLES_MODULES="ip_conntrack_ftp"
- 加載模塊:
/sbin/modprobe ip_conntrack_ftp
- 開機啟動,在
/etc/rc.local
添加:/sbin/modprobe ip_conntrack_ftp
注意:如果需要修改FTP 21端口為2121:
- 在
vsftpd.conf
中增加:listen_port=2121
- 加載模塊:
/sbin/modprobe ip_conntrack_ftp ports=2121
最后需要在iptables開放21端口:
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
方法2
在vsftpd配置文件中配置被動端口,優點:對連接速度沒有影響。缺點:限制了客戶端並發連接的數量。
在/etc/vsftpd/vsftpd.conf
中添加:
pasv_enable=YES pasv_min_port=3000 pasv_max_port=3005
在iptables中開放這段端口:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT iptables -A INPUT -p tcp --dport 3000:3005 -j ACCEPT
解除SELinux阻止
如果開啟了SELinux,執行以下命令:
setsebool -P ftpd_disable_trans 1 service vsftpd restart