vsftpd服務的歸納總結

餘二五發表於2017-11-17

1、理論知識

1.1、配置檔案

1.1.1、vsftp的簡介

vsftp的名字是“very secure FTP daemon”的簡稱,他工作在chroot模式下(程式限定一個訪問目錄),故而比較安全。

1.1.2、工作模式

1)PORT模式(主動模式)

主動模式工作流程如下:

— 客戶端與伺服器TCP 21埠建立連線通道

— 接收資料時在此通道上傳送PORT命令(宣告一個大於1024的客戶端埠)

— 伺服器端通過TCP 20向客戶端傳送資料(建立新的連線)

注:防火牆OUTBOUND過程

2)PASV模式(被動模式)

被動模式工作流程如下:

— 客戶端與伺服器TCP 21埠建立連線通道

— 客戶端傳送PASV命令給伺服器

— 伺服器預設開啟1024至5000之間的隨機埠並通知客戶端在此埠請求資料

— 伺服器端通過此埠傳送資料

注:防火牆INBOUND過程

1.1.3、執行模式

1)standalone模式

— 一次性啟動,常駐記憶體

— 接入反省快,消耗系統資源

— 支援PAM驗證功能

2)inetd(xinetd)模式

— 外部請求則呼叫ftp程式

— 反應慢,不佔系統資源

— 單一IP限制

1.1.4、主配置檔案

1
/etc/vsftpd/vsftpd.conf

1.1.5、PAM配置檔案

1)配置檔案位置:

1
/etc/pam.d/vsftpd

2)PAM配置檔案的修改

vim編輯/etc/pam.d/vsftpd

更改前(在列表中的不允許chroot):

1
auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeedd

更改後(只有在列表中的使用者才允許chroot):

1
auth required pam_listfile.so item=user sense=allow file=/etc/vsftpd/ftpusers onerr=faile

1.2、主機訪問控制

/etc/hosts.deny

1.3、啟動失敗除錯方法

啟動失敗解決:

1
bash -x /etc/init.d/vsftpd start

1.4、幫助

1
man vsftpd.conf

1.5、配置檔案引數

1.5.1、全域性配置引數

注:引數與註解正式環境下分開兩行寫,否則報錯

1)許可權引數

1
write_enable=YES #允許改變命令(STOR, DELE,RNFR, RNTO, MKD, RMD, APPE and SITE,預設NO)

2)登入資訊引數

1
2
3
4
dirmessage_enable=YES #換目錄時,顯示目錄下“.message”檔案的內容
ftpd_banner=Welcome to www.cmdschool.org FTP servers #登入歡迎資訊
banner_file=/etc/vsftpd/banner_file #登入成功資訊
banner_fail=/etc/vsftpd/banner_fail #登入失敗資訊

注意:

ftp_banner會覆蓋vsftpd預設連線後的資訊顯示;

banner_file設定會覆蓋ftp_banner的提示;

3)日誌檔案引數

1
2
3
xferlog_enable=YES #開啟日誌
xferlog_std_format=YES #wu-ftpd風格記錄日誌
xferlog_file=/var/log/xferlog #記錄上傳下載的日誌

4)效能引數

1
2
3
4
5
6
7
8
9
idle_session_timeout=600 #閒置會話中斷超時
data_connection_timemout=120 #閒置資料連線超時
accept_timeout=60 #PASV模式響應資料超時
ls_recurse_enable=YES #是否允許遞迴查詢ls -R(預設YES)
dirlist_enable=YES #允許使用dir/ls(預設YES)
download_enable=YES #允許使用者下載檔案
max_clients=30 #客戶端最大數量
max_per_ip=3 #一個IP的最大連線數
use_localtime=YES #啟用當地時間(預設GMT)

5)安全引數

1
2
3
4
5
6
tcp_wrappers=yes #開啟tcp_wrapper訪問控制
max_login_fails=3 #預設試探密碼的次數
pam_service_name=vsftpd #PAM驗證配置檔名稱
nopriv_user=ftp | nobody #vsftp服務執行時的賬號
deny_file={*.exe,*.dll} #拒絕上傳下載的檔案型別
async_abor_enable=YES #是否允許執行特殊的ftp命令async ABOR.

6)安全SSL協議

1
2
3
4
5
6
7
ssl_enable=YES #開啟SSL加密協議
ssl_sslv2=YES #指定加密方式
ssl_sslv3=YES
ssl_tlsv1=YES
require_ssl_reuse=NO #禁用資料與控制流使用相同的ssl通道
ssl_ciphers=HIGH #加密套件
rsa_cert_file=/etc/vsftpd/.sslkey/vsftpd.pem #指定加密證書檔案

7)傳輸協議

1
2
3
#ASCII模式傳送檔案
ascii_upload_enable=YES
ascii_download_enable=YES

8)程式相關

1
2
3
4
5
6
7
8
background=YES #vsftp將以監聽(listen)模式啟動
connect_timeout=60 #PORT模式響應資料超時
listen=yes #vsftp則執行在standalone模式
listen_port=21 #vsftpd監聽埠
connect_from_port_20=YES #啟用預設的20埠監聽
listen_ipv6=YES #開啟ipv6支援
pasv_min_port=50000 #PASV模式最小埠
pasv_max_port=60000 #PASV模式最大埠

1.5.2、本地使用者配置引數

1)前提引數

1
local_enable=YES #開啟普通使用者ftp訪問(預設NO,不限制chroot)

2)許可權引數

1
2
3
4
5
6
7
8
local_umask=0022 #上傳檔案預設許可權設定為6644,不設定預設為0077,目錄為700
chroot_local_user=NO #禁止使用者chroot
chroot_list_enable=YES #開啟chroot控制列表
chroot_list_file=/etc/vsftpd/vsftpd.chroot_list #chroot控制列表(預設在列拒絕)
userlist_enable=yes #開啟使用者登入控制列表
userlist_deny= #拒絕或允許使用者登入
userlist_file=/etc/vsftpd.user_list #使用者登入控制列表
local_root= #指定ftp家目錄

3)效能引數

1
local_max_rate=128 #本地賬號最大速率128B/s(0不限制)

4)安全SSL協議

1
2
force_local_logins_ssl=YES #強制本地和虛擬使用者登入使用SSL協議
force_local_data_ssl=YES #強制本地和虛擬使用者資料使用SSL協議


1.5.3、匿名使用者配置引數

1)前提引數

1
2
anonymous_enable=YES #開啟匿名使用者登入(預設YES)
ftp_username=ftp #匿名使用者的系統使用者名稱(預設ftp)

2)許可權引數

1
2
3
4
5
6
7
anon_world_readable_only=YES #開啟匿名使用者檔案只讀
anon_upload_enable=YES #允許匿名使用者上傳檔案
anon_mkdir_write_enable=YES #允許匿名使用者建立資料夾
anon_other_write_enable=YES #允許匿名使用者其他寫操作(刪除,重新命名)
anon_umask=022 #預設0077
chown_uploads= YES #修改匿名使用者所上傳檔案的所有權
chown_username = username #指定擁有匿名使用者上傳檔案所有權的使用者

3)效能引數

1
2
3
anon_upload_enable=NO #匿名使用者上傳檔案
anon_mkdir_write_enable=NO #匿名使用者上傳目錄許可權
anon_max_rate=64 #匿名賬號最大下載速度64B/s

4)安全SSL協議

1
2
3
allow_anon_ssl=YES #允許匿名使用者使用SSL協議
force_anon_logins_ssl=YES #強制匿名使用者登入使用SSL協議
force_anon_data_ssl=YES #強制匿名使用者資料使用SSL協議

1.5.4、虛擬使用者配置引數

1)前提引數

1
2
guest_enable=YES #開啟虛擬使用者
guest_username= #指定虛擬使用者對映的本地使用者

2)許可權引數

1
2
user_config_dir=/etc/vsftpd/config #虛擬使用者配置檔案目錄
local_root= #虛擬使用者家目錄

3)安全SSL協議

1
2
force_local_logins_ssl=YES #強制本地和虛擬使用者登入使用SSL協議
force_local_data_ssl=YES #強制本地和虛擬使用者資料使用SSL協議


2、本地使用者驗證的FTP實踐

2.1、基礎資訊

ftpSer:

ipaddress=10.168.0.166

hostname=vsFTPSer


client:

ipaddress=10.168.0.8

hostname=client


應用場景:

ftp用於上傳網站原始碼,故需要考慮到apache的許可權。

2.2、yum源安裝

In ftpSer:

1
yum -y install vsftpd httpd

In client:

1
 yum -y install ftp

2.3、配置

In ftpSer:

2.3.1、step1

啟動服務和配置開機預設啟動

1
2
/etc/init.d/vsftpd start
 chkconfig vsftpd on

2.3.2、step2

1)修改配置檔案

vim編輯/etc/vsftpd/vsftpd.conf

清空之前的配置,加入如下配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#--------日誌引數-------
#開啟日誌
xferlog_enable=YES
#wu-ftpd風格記錄日誌
xferlog_std_format=YES
#記錄上傳下載的日誌
xferlog_file=/var/log/xferlog
#開啟登入日誌
dual_log_enable=YES
#登入日誌儲存路徑
vsftpd_log_file=/var/log/vsftpd.log
#-------許可權引數--------
#禁止匿名使用者登入
anonymous_enable=NO
#禁止匿名使用者上傳檔案
anon_upload_enable=NO
#禁止匿名使用者建立資料夾
anon_mkdir_write_enable=NO
#禁止匿名使用者其他寫操作(刪除,重新命名)
anon_other_write_enable=NO
#開啟普通使用者ftp訪問
local_enable=YES
#上傳檔案預設許可權
local_umask=022
#開啟使用者登入控制列表
userlist_enable=YES
#禁止使用者chroot
chroot_local_user=NO
#開啟chroot控制列表
chroot_list_enable=YES
#chroot控制列表
chroot_list_file=/etc/vsftpd/vsftpd.chroot_list
#允許改變系統
write_enable=YES
#---------安全引數----------
#允許執行特殊的ftp命令async ABOR.
async_abor_enable=YES
#開啟tcp_wrapper訪問控制
tcp_wrappers=YES
#PAM驗證配置檔名稱
pam_service_name=vsftpd
#---------登入訊息----------
dirmessage_enable=YES
ftpd_banner=Welcome to www.cmdschool.org FTP servers
#---------進行配置---------
#listen模式啟動
background=YES
#執行在standalone模式
listen=YES
#PAM驗證配置檔名稱
pam_service_name=vsftpd
#PASV模式最小埠
pasv_min_port=50000
#PASV模式最大埠
pasv_max_port=60000
#---------傳輸相關---------
ascii_upload_enable=YES
ascii_download_enable=YES

2)重啟服務

1
/etc/init.d/vsftpd restart

2.3.3、step3

配置防火牆

vim編輯/etc/sysconfig/iptables

1
2
-A INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 50000:60000 -j ACCEPT

2.3.4、step4

建立ftp目錄

1
2
mkdir /var/www/www.cmdschool.org/ 
echo www.cmdschool.org  > index.html

2.3.5、step5

建立ftp使用者並修改密碼

1
2
3
useradd ftp_user1 -d /var/www/www.cmdschool.org/ -s /sbin/nologin
echo ftppwd | passwd --stdin ftp_user1
usermod -G apache ftp_user1

2.3.6、step6

許可權調整

1
2
3
chown :apache -R /var/www/www.cmdschool.org/
chmod g+s /var/www/www.cmdschool.org/
chmod 770 -R /var/www/www.cmdschool.org/

2.3.7、step7

配置自動生成chroot_list

1)建立指令碼資料夾

1
mkdir ~/script

2)vim編輯~/script/ftp_chroot.sh

鍵入如下內容:

1
cat /etc/passwd cut -d : -f1 > /etc/vsftpd/vsftpd.chroot_list

3)新增計劃任務

1
crontab -e

加入如下內容:

1
*/5 * * * * sh ~/script/ftp_chroot.sh

2.3.8、step8

關閉selinux

1
2
setenforce 0
sed -i `s/SELINUX=enforcing/SELINUX=disabled/g` /etc/selinux/config

2.3.9、step9

1
2
usermod -L ftp_user1
usermod -U ftp_user1

3、本地使用者驗證的SSL加密實踐

2.1、yum源

In ftpSer:


1
yum -y install tcpdump

In ftpSer:

1
yum -y install lftp

2.2、SSL加密的必要性

In ftpSer:

1
tcpdump port 21 -nA

In client:

1
2
3
4
5
lftp
open 10.168.0.166
user ftp_user1 #輸入使用者名稱
ftppwd #輸入密碼
ls

In ftpSer:

顯示如下:

1
2
3
4
5
#前有節刪
..%.    ...USER ftp_user1
#中間有節刪
..%.    ...PASS 123
#後有節刪

2.3、配置

In ftpSer:

2.3.1、建立證書目錄

1
2
mkdir /etc/vsftpd/.sslkey
cd /etc/vsftpd/.sslkey

2.3.2、建立證書

1
openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout vsftpd.pem -out vsftpd.pem

互動模式如下(根據實際情況填寫):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Generating a 1024 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) []:GD
Locality Name (eg, city) [Default City]:DG
Organization Name (eg, company) [Default Company Ltd]:cmdschool.org
Organizational Unit Name (eg, section) []:MIS
Common Name (eg, your name or your server`s hostname) []:ftpSer
Email Address []:will@cmdschool.org

2.3.3、設定證書目錄許可權

In ftpSer:

1
chmod -R 400 /etc/vsftpd/.sslkey/

2.3.4、載入證書配置引數

In ftpSer:

vim編輯/etc/vsftpd/vsftpd.conf

末尾加入如下配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#--------SSL-------
#開啟SSL加密協議
ssl_enable=YES
#指定加密方式
ssl_sslv2=YES
ssl_sslv3=YES
ssl_tlsv1=YES
#強制本地和虛擬使用者登入使用SSL協議
force_local_logins_ssl=YES
#強制本地和虛擬使用者資料使用SSL協議
force_local_data_ssl=YES
#禁用資料與控制流使用相同的ssl通道
require_ssl_reuse=NO
#加密套件
ssl_ciphers=HIGH
#指定加密證書檔案
rsa_cert_file=/etc/vsftpd/.sslkey/vsftpd.pem

2.3.5、驗證

In ftpSer:

1
tcpdump port 21 -nA

In client:

1
2
3
4
5
lftp
open 10.168.0.166
user ftp_user1 #輸入使用者名稱
ftppwd #輸入密碼
ls

In ftpSer:

注:監聽的資訊無法找到明文的使用者名稱和密碼。

本文轉自 tanzhenchao 51CTO部落格,原文連結:http://blog.51cto.com/cmdschool/1712760,如需轉載請自行聯絡原作者


相關文章