1、FTP服務器的一些基本概念
(1)FTP連接方式
控制連接:標准端口為21,用於發送FTP命令信息。
數據連接:標准端口為20,用於上傳、下載數據。
(2)數據連接的建立類型
主動模式:服務端從20端口主動向客戶端發起連接。
被動模式:服務端在指定范圍內的某個端口被動等待客戶端發起連接。
一般都采用被動模式。主動模式存在安全隱患,客戶機很容易發起DdoS攻擊。
(3)FTP傳輸模式
文本模式:ASCII模式,以文本序列傳輸數據。
二進制模式:Binary模式,以二進制序列(比特流)傳輸數據。
ASCII模式一般只用於純文本文件傳輸,而Binary模式更適合傳輸程序、圖片等文件。尤其是對於可執行文件,如果把可執行文件以文本模式傳輸,則下載下來的文件將無法正常使用。
在rhel6中默認采用二進制模式,在rhel6以前的版本中默認采用文本模式,為了提高可靠性,rhel6不再支持文本模式。
(4)FTP用戶的類型
匿名用戶:anonymous或ftp,這兩個其實是同一個用戶。
本地用戶:帳號名稱、密碼等信息保存在passwd、shadow文件中。但是系統用戶在訪問時默認只能訪問自己的主目錄,而不是vsftpd的主目錄/var/ftp
虛擬用戶:使用獨立的帳號/密碼數據文件。
2、vdftpd服務
后台進程:vsftpd
啟動腳本:/etc/init.d/vsftpd
類型:System V 服務
使用端口:20(ftp-data),21(ftp)
所需RPM包:vsftpd
配置文件:/etc/vsftpd/vsftpd.conf
查看配置文件幫助:man vsftpd.conf
默認主目錄是:/var/ftp
3、配置匿名用戶下載和上傳
[root@test ~]# cat /etc/redhat-release
CentOS release 6.5 (Final)
3.1安裝FTP軟件包,客戶端和服務器端:
tftp-server-0.49-7.el6.i686
ftp-0.17-51.1.el6.i686
tftp-0.49-7.el6.i686
vsftpd-2.2.2-6.el6_0.1.i686
lftp-4.0.9-1.el6.i686
gvfs-obexftp-1.4.3-12.el6.i686
啟動服務,並設為開機自動
service vsftpd start
chkconfig vsftpd on
編輯主配置文件/etc/vsftpd/vsftpd.conf
anonymous_enable=YES 表示允許匿名用戶訪問。
local_enable=YES 表示允許使用系統用戶訪問,
write_enable=YES 表示允許允許匿名用戶或系統用戶具有寫入權限
將“/var/ftp/pub”目錄的屬主改為ftp,即可賦予匿名用戶寫入權限
[root@test ~]# chown ftp /var/ftp/pub/
同時在配置文件/etc/vsftpd/vsftpd.conf中增加以下幾行:
anon_upload_enable=YES #表示允許匿名用戶上傳
anon_mkdir_write_enable=YES #表示允許匿名用戶創建目錄
anon_umask=022 #表示設置匿名用戶的umask值
anon_max_rate=500000 #表示對匿名用戶的傳輸速率進行限制,單位為字節。
重啟服務:service vsftpd restart(reload)
3.2、在客戶端使用匿名用戶訪問測試
此時匿名用戶可以新建文件夾,可以上傳文件,如下圖:

4、配置本地用戶上傳和下載
(1)vsftpd可以直接使用Linux系統的本地用戶作為FTP用戶。
使用本地用戶登錄FTP服務器后,默認將位於用戶自己的主目錄中,且具有讀寫權限。
如利用test用戶訪問ftp,那么默認將進入到的目錄是/home/test。
創建系統用戶,並設置密碼,並在主目錄中放置一個測試文件:
useradd ftptest
passwd ftptest
echo ‘ftp test’ > /home/ftptest/ftptest.txt
創建系統用戶test,並設置密碼:
useradd test
passwd test
(2)實現的場景一:允許用戶test登錄,且登錄成功后位於自己的家目錄中。不允許ftptest用戶登錄
配置參數:
anonymous_enable=NO
local_enable=YES
write_enable=YES
chroot_local_user =YES
chroot_list_enable=NO
chroot_list_file=/etc/vsftpd/chroot_list
local_umask=022
userlist_enable=YES
userlist_deny=NO
將test用戶加入到
/etc/vsftpd/user_list文件。
[root@test vsftpd]# vi /etc/vsftpd/user_list
test
[root@test ~]# cd /home/test/
[root@test test]# ls
test.txt 新建文件夾
測試:



(3)實現場景二:允許ftptest用戶登錄,登錄成功后位於/data目錄,禁止test用戶登錄。
anonymous_enable=NO
local_enable=YES
write_enable=YES
chroot_local_user =YES
chroot_list_enable=NO
chroot_list_file=/etc/vsftpd/chroot_list
local_umask=022
userlist_enable=YES
userlist_deny=NO
local_root=/data
將ftptest用戶加入到 /etc/vsftpd/user_list文件。從此文件中刪除test用戶。
[root@test vsftpd]# vi /etc/vsftpd/user_list
ftptest



配置參數解釋:
-
anonymous_enable=NO //禁止匿名用戶登錄
-
local_enable=YES //是否允許本地系統用戶訪問
-
write_enable=YES // 表示允許允許匿名用戶或系統用戶具有寫入權限
-
chroot_local_user =YES // 本地用戶在訪問時只能訪問自己家目錄
-
chroot_list_enable=NO //指定一些用戶訪問限止在自己的home目錄下,就是只能訪問自己的家目錄
-
chroot_list_file=/etc/vsftpd/chroot_list //在/etc/vsftpd/chroot_list文件中中列出的是被限制的用戶的列表,文件不存在得新建
-
local_umask=022 // 設定本地用戶上傳文件所用的掩碼。
-
local_root=/data //設置用戶登陸時是訪問ftp服務的主目錄/data
對於chroot_local_user與chroot_list_enable的組合效果,可以參考下表:
|
chroot_local_user=YES
|
chroot_local_user=NO
|
chroot_list_enable=YES
|
1、所有用戶都被限制在其主目錄下; 2、使用chroot_list_file指定的用戶列表,這些用戶作為“例外”,不受限制
|
1、所有用戶都不被限制其主目錄下;
2、使用chroot_list_file指定的用戶列表,這些用戶作為“例外”,受到限制
|
chroot_list_enable=NO
|
1、所有用戶都被限制在其主目錄下; 2、不使用chroot_list_file指定的用戶列表,沒有任何“例外”用戶
|
1、所有用戶都不被限制其主目錄下;
2、不使用chroot_list_file指定的用戶列表,沒有任何“例外”用戶
|
(4)關於用戶訪問控制
vsftpd中提供了2個與本地用戶相關的配置文件:
/etc/vsftpd/ftpusers
/etc/vsftpd/user_list
/etc/vsftpd/ftpusers,包含的用戶賬號將被禁止登錄vsftpd服務器,不管該用戶是否在/etc/vsftpd/user_list文件中出現。
通常將root、bin、daemon等特殊用戶列在該文件中,禁止用於登錄FTP服務。
/etc/vsftpd/user_list,該文件中包含的用戶賬戶可能被禁止登錄,也可能被允許登錄,具體在主配置文件vsftpd.conf中決定。
當存在“userlist_enable=YES”的配置項時,/etc/vsftpd/user_list文件生效。如果配置“userlist_deny=YES”,則
僅禁止列表中的用戶賬戶登錄,如果配置“userlist_deny=NO”,則僅允許列表中的用戶賬戶登錄。
userlist_enable=YES 是系統的默認設置,表示啟用userlist用戶列表。
userlist_deny=NO 是我們后來添加的,表示只允許列表中的用戶登錄。
5、配置FTP虛擬用戶下載和上傳(多個虛擬用戶通過本地用戶進行登錄)
所謂虛擬賬戶是指:存放於獨立數據庫文件中的FTP用戶賬戶,可以將他們映射到某個不能登錄的系統用戶賬號上,進一步增強FTP服務器的安全性
(1)、創建虛擬用戶數據庫文件
使用db_load命令工具創建Berkeley DB格式的數據庫文件。db_load工具由db4-utils軟件包提供。安裝db4_utils組件。


建立一個文本格式的用戶名/密碼 列表文件,用於存放虛擬用戶賬號。文件名可以隨意,文件一般保存在/etc/vsftpd目錄
[root@test ~]# vim /etc/vsftpd/login.txt
harry
123
natasha
123 # 文件中的奇數行表示用戶名,偶數行為上一行用戶所對用的密碼。
以此文件為數據源通過db_load工具創建出Berkeley DB格式的數據庫文件:
[root@test ~]# cd /etc/vsftpd/
[root@test ~]# db_load -T -t hash -f logins.txt logins.db
db_load命令是一種固定用法,其中的“-T”選項表示允許非Berkeley DB的應用程序使用從文本格式轉換的DB數據庫文件,“-t hash”選項指定讀取數據文件的基本方法,“-f”選項用於指定數據的源文件。
最后為了提高虛擬用戶賬號的安全性,最好將這兩個存放虛擬用戶賬號的文件的權限都設為600,即只有root用戶具有讀取和寫入權限。
chmod 600 logins.txt
chmod 600 logins.db
(2)創建虛擬用戶的映射賬號
vsftpd服務對虛擬用戶其實是采用了映射的控制方式,把所有的虛擬用戶賬號都對應到了同一個系統用戶賬號上,並將這個系統用戶的主目錄作為所有虛擬用戶登錄后共用的FTP根目錄。
useradd -d /var/ftproot -s /sbin/nologin virtual
chmod 755 /var/ftproot
在useradd命令中,利用-d選項指定了用戶的主目錄,利用-s選項禁止用戶登錄。然后再修改目錄權限,使得其他用戶可以訪問。
(3)創建PAM認證文件
對虛擬用戶的身份認證是通過PAM機制來實現的,PAM是Linux系統中的一個獨立API(應用程序接口),它提供了各種驗證模塊以供其它程序調用。
當這些程序需要進行用戶身份驗證的操作時,就可以直接調用PAM的相應模塊,而無需由自己來提供驗證功能。所以PAM在Linux系統中提供了統一的身份驗證機制。
PAM的認證文件都統一存放在/etc/pam.d/目錄中,下面我們在這個目錄中創建一個FTP虛擬用戶的認證文件:
vim /etc/pam.d/vsftpd.vu【新建文件】
auth required pam_userdb.so db=/etc/vsftpd/logins
account required pam_userdb.so db=/etc/vsftpd/logins
在文件中,通過“db=/etc/vaftpd/logins”參數指定了要使用的虛擬用戶數據庫文件的位置,注意這里不需要寫“.db” 的擴展名。
(4)修改vsftp配置,添加虛擬用戶支持
原有配置:
anonymous_enable=NO
local_enable=YES * #由於需要映射本地用戶,所以此項必須啟用
write_enable=YES * #表示允許寫入。
local_umask=022
pam_service_name=vdftpd
tcp_wrappers=YES
userlist_enable=YES
anon_umask=022 * #在vsftpd服務中,虛擬用戶被默認作為匿名用戶進行處理以降低權限 ,因此對應的配置項通常以anon_開頭
anon_max_rate=500000
添加:
guest_enable=YES #表示啟用虛擬用戶映射功能
guest_username=virtual #表示指定所映射的系統用戶名稱
pam_service_name=vsftpd.vu #表示指定PAM認證文件
user_config_dir=/etc/vsftpd/vuser #表示虛擬用戶配置文件的存放目錄。
(5)創建虛擬用戶配置文件
為了對虛擬用戶進行精確控制,實現不同用戶擁有不同的權限,還需要為每個虛擬用戶建立獨立的配置文件,在vsftpd.conf配置文件中我們已經指定了虛擬用戶配置文件的存放位置/etc/vsftpd/vuser。
下面我們首先創建虛擬用戶配置文件存放目錄,然后為harry用戶創建配置文件,文件名即是用戶名:
mkdir /etc/vsftpd/vuser
cd /etc/vsftpd/vuser
vim harry
然后設置允許harry用戶上傳,設置方法同匿名用戶:
anon_upload_enable=YES
anon_mkdir_write_enable=YES
再為natasha也創建一個配置文件,如果natasha只允許下載,那么只需要有一個配置文件即可,文件內容保持空白。
touch natasha
重啟服務:service vsftpd restart
這樣虛擬用戶便全部設置好了,harry用戶具有下載和上傳的權限,而natasha只能下載不能上傳。
(6)登錄測試

防火牆的配置:
添加規則:
iptables -t filter -A INPUT -s 192.168.0.0/16 -p tcp --dport 21 -j ACCEPT
SElinux配置
set -P allow_ftpd_anon_write on
set -P allow_ftpd_full_access on
set -P ftp_home_dir on