3.2VSFTP安全与效能兼备的ftp服务器
3.2.1VSFTP概述
FTP,filetransferprotocol,这是档案传输的通讯协议,也是一般最常用来传送档案的方式。读者在使用RedHat9的时候,可能会感受到ftpserver有一些改变:第一,就是ftpserver只剩下vsftp,原有的wuftp等都没放入第二,就是vsftp从XINETD中独立出来,并将设定档从/etc/vsftpd.conf之中移到/etc/vsftpd/vsftpd.conf。
为什么做这样的改变?可以想见的是vsftp已有独立运作的能力,不需要XINETD来做更进一步的管控,并且类似sendmail、httpd、ssh、samba等,将设定文件的放入/etc下独立的目录。
FTP分为两类,一种为PORTFTP,也就是一般的FTP另一类是PASVFTP,分述如下:
PORTFTP
这是一般形式的FTP,首先会建立控制频道,默认值是port21,也就是跟port21建立联机,并透过此联机下达指令。第二,由FTPserver端会建立数据传输频道,默认值为20,也就是跟port20建立联机,并透过port20作数据的传输。
PASVFTP
跟PORTFTP类似,首先会建立控制频道,默认值是port21,也就是跟port21建立联机,并透过此联机下达指令。第二,会由client端做出数据传输的请求,包括数据传输port的数字。
这两者的差异为何?PORTFTP当中的数据传输port是由FTPserver指定,而PASVFTP的数据传输port是由FTPclient决定。通常我们使用PASVFTP,是在有防火墙的环境之下,透过client与server的沟通,决定数据传输的port。
3.2.2范例
3.2.1.直接启动VSFTP服务
这个范例是套用RedHat的预设范例,直接启动vsftp。
[root@relayvsftpd]#/sbin/servicevsftpdstart
Startingvsftpdforvsftpd:OK]
3.2.2.更换port提供服务:将预设的port21更换为2121
为了安全,或是以port来区隔不同的ftp服务,我们可能会将ftpport改为21之外的port,那么,可参考以下步骤。
Step1.修改/etc/vsftpd/vsftpd.conf
新增底下一行
listen_port=2121
Step2.重新启动vsftpd
[root@homevsftpd]#/sbin/servicevsftpdrestart
Shuttingdownvsftpd:OK]
Startingvsftpdforvsftpd:OK]
3.2.3.特定使用者peter、john不得变更目录
使用者的预设目录为/home/username,若是我们不希望使用者在ftp时能够
切换到上一层目录/home,则可参考以下步骤。
Step1.修改/etc/vsftpd/vsftpd.conf
将底下三行
#chroot_list_enable=YES
#(defaultfollows)
#chroot_list_file=/etc/vsftpd.chroot_list
改为
chroot_list_enable=YES
#(defaultfollows)
chroot_list_file=/etc/vsftpd/chroot_list
Step2.新增一个档案:/etc/vsftpd/chroot_list
内容增加两行:
peter
john
Step3.重新启动vsftpd
[root@homevsftpd]#/sbin/servicevsftpdrestart
Shuttingdownvsftpd:OK]
Startingvsftpdforvsftpd:OK]
若是peter欲切换到根目录以外的目录,则会出现以下警告:
ftp>cd/home
550Failedtochangedirectory.
3.2.4.取消anonymous登入
若是读者的主机不希望使用者匿名登入,则可参考以下步骤。
Step1.修改/etc/vsftpd/vsftpd.conf
将
anonymous_enable=YES
改为
anonymous_enable=NO
Step2.重新启动vsftpd
[root@homevsftpd]#/sbin/servicevsftpdrestart
Shuttingdownvsftpd:OK]
Startingvsftpdforvsftpd:OK]
3.2.5.安排欢迎话语
若是我们希望使用者在登入时,能够看到欢迎话语,可能包括对该主机的说明,或是目录的介绍,可参考以下步骤。
首先确定在/etc/vsftpd/vsftpd.conf当中是否有底下这一行
dirmessage_enable=YES
RedHat9的默认值是有上面这行的。
接着,在各目录之中,新增名为.message的档案,再这边假设有一个使用者test1,且此使用者的根目录下有个目录名为abc,那首先我们在/home/test1
之下新增.message,内容如下:
Hello~Welcometothehomedirectory
Thisisfortestonly...
接着,在/home/test1/abc的目录下新增.message,内容如下:
Welcometoabc'sdirectory
Thisissubdir...
那么,当使用者test1登入时,会看到以下讯息:
230-Hello~Welcometothehomedirectory
230-
230-Thisisfortestonly...
230-
若是切换到abc的目录,则会出现以下讯息:
250-Welcometoabc'sdirectory
250-
250-Thisissubdir...
3.2.6.对于每一个联机,以独立的process来运作
一般启动vsftp时,我们只会看到一个名为vsftpd的process在运作,但若是读者希望每一个联机,都能以独立的process来呈现,则可执行以下步骤。
Step1.修改/etc/vsftpd/vsftpd.conf
新增底下一行
setproctitle_enable=YES
Step2.重新启动vsftpd
[root@homevsftpd]#/sbin/servicevsftpdrestart
Shuttingdownvsftpd:OK]
Startingvsftpdforvsftpd:OK]
使用ps-ef的指令,可以看告不同使用者联机的情形,如下图所示:
[root@homevsftpd]#ps-ef|grepftp
root20901016:41pts/000:00:00vsftpd:LISTENER
nobody21202090017:18?00:00:00vsftpd:192.168.10.244:
connected
test121222120017:18?00:00:00vsftpd:192.168.10.244/test1:
IDLE
nobody21242090017:19?00:00:00vsftpd:192.168.10.244:
connected
test221262124017:19?00:00:00vsftpd:192.168.10.244/test2:
IDLE
root21291343017:20pts/000:00:00grepftp
[root@homevsftpd]#
3.2.7.限制传输档案的速度:
本机的使用者最高速度为200KBytes/s,匿名登入者所能使用的最高速度为50KBytes/s
Step1.修改/etc/vsftpd/vsftpd.conf
新增底下两行
anon_max_rate=50000
local_max_rate=200000
Step2.重新启动vsftpd
[root@homevsftpd]#/sbin/servicevsftpdrestart
Shuttingdownvsftpd:OK]
Startingvsftpdforvsftpd:OK]
在这边速度的单位为Bytes/s,其中anon_max_rate所限制的是匿名登入的
使用者,而local_max_rate所限制的是本机的使用者。VSFTPD对于速度的限
制,范围大概在80%到120%之间,也就是我们限制最高速度为100KBytes/s,
但实际的速度可能在80KBytes/s到120KBytes/s之间,当然,若是频宽不足
时,数值会低于此限制。
3.2.8.针对不同的使用者限制不同的速度:
假设test1所能使用的最高速度为250KBytes/s,test2所能使用的最高速度为500KBytes/s。
Step1.修改/etc/vsftpd/vsftpd.conf
新增底下一行
user_config_dir=/etc/vsftpd/userconf
Step2.新增一个目录:/etc/vsftpd/userconf
mkdir/etc/vsftpd/userconf
Step3.在/etc/vsftpd/userconf之下新增一个名为test1的档案
内容增加一行:
local_max_rate=250000
Step4.在/etc/vsftpd/userconf之下新增一个名为test2的档案
内容增加一行:
local_max_rate=500000
Step5.重新启动vsftpd
[root@homevsftpd]#/sbin/servicevsftpdrestart
Shuttingdownvsftpd:OK]
Startingvsftpdforvsftpd:OK]
3.2.9-1.建置一个防火墙下的ftpserver,使用PORTFTPmode:
预设的ftpport:21以及ftpdataport:20
启动VSFTPD之后执行以下两行指令,只允许port21以及port20开放,其它关闭。
iptables-AINPUT-ptcp-mmultiport--dport21,20-jACCEPT
iptables-AINPUT-ptcp-jREJECT--reject-withtcp-reset
3.2.9-2.建置一个防火墙下的ftpserver,使用PORTFTPmode:
ftpport:2121以及ftpdataport:2020
Step1.执行以下两行指令,只允许port2121以及port2020开放,其它关闭。
iptables-AINPUT-ptcp-mmultiport--dport2121,2020-jACCEPT
iptables-AINPUT-ptcp-jREJECT--reject-withtcp-reset
Step2.修改/etc/vsftpd/vsftpd.conf
新增底下两行
listen_port=2121
ftp_data_port=2020
Step3.重新启动vsftpd
[root@homevsftpd]#/sbin/servicevsftpdrestart
Shuttingdownvsftpd:OK]
Startingvsftpdforvsftpd:OK]
在这边要注意,8、9两个例子中,ftpclient(如cuteftp)的联机方式不能够选择passivemode,否则无法建立数据的联机。也就是读者可以连上ftp
server,但是执行ls、get等等的指令时,便无法运作。
3.2.10.建置一个防火墙下的ftpserver,使用PASSFTPmode:
ftpport:2121以及ftpdataport从9981到9986。
Step1.执行以下两行指令,只允许port2121以及port9981-9990开放,其它关闭。
iptables-AINPUT-ptcp-mmultiport--dport
2121,9981,9982,9983,9984,9985,9986,9987,9988,9989,9990-jACCEPT
iptables-AINPUT-ptcp-jREJECT--reject-withtcp-reset
Step2.修改/etc/vsftpd/vsftpd.conf
新增底下四行
listen_port=2121
pasv_enable=YES
pasv_min_port=9981
pasv_max_port=9986
Step3.重新启动vsftpd
[root@homevsftpd]#/sbin/servicevsftpdrestart
Shuttingdownvsftpd:OK]
Startingvsftpdforvsftpd:OK]
在这边要注意,在10这个例子中,ftpclient(如cuteftp)的联机方式必须选择passivemode,否则无法建立数据的联机。也就是读者可以连上ftpserver,但是执行ls,get等等的指令时,便无法运作。
3.2.11.将vsftpd与TCP_wrapper结合
若是读者希望直接在/etc/hosts.allow之中定义允许或是拒绝的来源地址,可执行以下步骤。这是简易的防火墙设定。
Step1.确定/etc/vsftpd/vsftpd.conf之中tcp_wrappers的设定为YES,如下图所
示:
tcp_wrappers=YES
这是RedHat9的默认值,基本上不需修改。
Step2.重新启动vsftpd
[root@homevsftpd]#/sbin/servicevsftpdrestart
Shuttingdownvsftpd:OK]
Startingvsftpdforvsftpd:OK]
Step3.设定/etc/hosts.allow,譬如提供111.22.33.4以及10.1.1.1到10.1.1.254连
线,则可做下图之设定:
vsftpd:111.22.33.410.1.1.:allow
ALL:ALL:DENY
3.2.12.将vsftpd并入XINETD
若是读者希望将vsftpd并入XINETD之中,也就是7.x版的预设设定,那
么读者可以执行以下步骤。
Step1.修改/etc/vsftpd/vsftpd.conf
将
listen=YES
改为
listen=NO
Step2.新增一个档案:/etc/xinetd.d/vsftpd
内容如下:
servicevsftpd
{
disable=no
socket_type=stream
wait=no
user=root
server=/usr/sbin/vsftpd
port=21
log_on_success+=PIDHOSTDURATION
log_on_failure+=HOST
}
Step3.重新启动xinetd
[root@homevsftpd]#/sbin/servicexinetdrestart
Stoppingxinetd:OK]
Startingxinetd:OK]
3.2.3设定档说明
在范例中,有些省略的设定可以在这边找到,譬如联机的总数、同一个位址的联机数、显示档案拥有者的名称等等,希望读者细读后,可以做出最适合自己的设定。
格式
vsftpd.conf的内容非常单纯,每一行即为一项设定。若是空白行或是开头为#的一行,将会被忽略。内容的格式只有一种,如下所示
option=value
要注意的是,等号两边不能加空白,不然是不正确的设定。
===ascii设定=====================
ascii_download_enable
管控是否可用ASCII模式下载。默认值为NO。
ascii_upload_enable
管控是否可用ASCII模式上传。默认值为NO。
===个别使用者设定===================
chroot_list_enable
如果启动这项功能,则所有的本机使用者登入均可进到根目录之外的数据夹,除了列
在/etc/vsftpd.chroot_list之中的使用者之外。默认值为NO。
userlist_enable
用法:YES/NO
若是启动此功能,则会读取/etc/vsftpd.user_list当中的使用者名称。此项功能可以在询问密码前就出现失败讯息,而不需要检验密码的程序。默认值为关闭。
userlist_deny
用法:YES/NO
这个选项只有在userlist_enable启动时才会被检验。如果将这个选项设为YES,则在/etc/vsftpd.user_list中的使用者将无法登入若设为NO,则只有在
/etc/vsftpd.user_list中的使用者才能登入。而且此项功能可以在询问密码前就出现错误讯息,而不需要检验密码的程序。
user_config_dir
定义个别使用者设定文件所在的目录,例如定义user_config_dir=/etc/vsftpd/userconf,且主机上有使用者test1,test2,那我们可以在user_config_dir的目录新增文件名为test1以及test2。若是test1登入,则会读取user_config_dir下的test1这个档案内的设定。默认值为无。
===欢迎语设定=====================
dirmessage_enable
如果启动这个选项,使用者第一次进入一个目录时,会检查该目录下是否有.message这个档案,若是有,则会出现此档案的内容,通常这个档案会放置欢迎话语,或是对该目录的说明。默认值为开启。
banner_file
当使用者登入时,会显示此设定所在的档案内容,通常为欢迎话语或是说明。默认值为无。
ftpd_banner
这边可定义欢迎话语的字符串,相较于banner_file是档案的形式,而ftpd_banner是字串的格式。预设为无。
===特殊安全设定====================
chroot_local_user
如果设定为YES,那么所有的本机的使用者都可以切换到根目录以外的数据夹。预设值为NO。
hide_ids
如果启动这项功能,所有档案的拥有者与群组都为ftp,也就是使用者登入使用ls-al之类的指令,所看到的档案拥有者跟群组均为ftp。默认值为关闭。
ls_recurse_enable
若是启动此功能,则允许登入者使用ls-R这个指令。默认值为NO。
write_enable
用法:YES/NO
这个选项可以控制FTP的指令是否允许更改filesystem,譬如STOR、DELE、
RNFR、RNTO、MKD、RMD、APPE以及SITE。预设是关闭。
setproctitle_enable
用法:YES/NO
启动这项功能,vsftpd会将所有联机的状况已不同的process呈现出来,换句话说,使用ps-ef这类的指令就可以看到联机的状态。默认值为关闭。
tcp_wrappers
用法:YES/NO
如果启动,则会将vsftpd与tcpwrapper结合,也就是可以在/etc/hosts.allow与/etc/hosts.deny中定义可联机或是拒绝的来源地址。
pam_service_name
这边定义PAM所使用的名称,预设为vsftpd。
secure_chroot_dir
这个选项必须指定一个空的数据夹且任何登入者都不能有写入的权限,当vsftpd不需要filesystem的权限时,就会将使用者限制在此数据夹中。默认值为/usr/share/empty
===纪录文件设定=====================
xferlog_enable
用法:YES/NO
如果启动,上传与下载的信息将被完整纪录在底下xferlog_file所定义的档案中。预设为开启。
xferlog_file
这个选项可设定纪录文件所在的位置,默认值为/var/log/vsftpd.log。
xferlog_std_format
如果启动,则纪录文件将会写为xferlog的标准格式,如同wu-ftpd一般。默认值为关闭。
===逾时设定======================
accept_timeout
接受建立联机的逾时设定,单位为秒。默认值为60。
connect_timeout
响应PORT方式的数据联机的逾时设定,单位为秒。默认值为60。
data_connection_timeout
建立数据联机的逾时设定。默认值为300秒。
idle_session_timeout
发呆的逾时设定,若是超出这时间没有数据的传送或是指令的输入,则会强迫断线,单位为秒。默认值为300。
===速率限制======================
anon_max_rate
匿名登入所能使用的最大传输速度,单位为每秒多少bytes,0表示不限速度。默认值为0。
local_max_rate
本机使用者所能使用的最大传输速度,单位为每秒多少bytes,0表示不限速度。预设值为0。
===新增档案权限设定==================
anon_umask
匿名登入者新增档案时的umask数值。默认值为077。
file_open_mode
上传档案的权限,与chmod所使用的数值相同。默认值为0666。
local_umask
本机登入者新增档案时的umask数值。默认值为077。
===port设定======================
connect_from_port_20
用法:YES/NO
若设为YES,则强迫ftp-data的数据传送使用port20。默认值为YES。
ftp_data_port
设定ftp数据联机所使用的port。默认值为20。
listen_port
FTPserver所使用的port。默认值为21。
pasv_max_port
建立资料联机所可以使用port范围的上界,0表示任意。默认值为0。
pasv_min_port
建立资料联机所可以使用port范围的下界,0表示任意。默认值为0。
===其它========================
anon_root
使用匿名登入时,所登入的目录。默认值为无。
local_enable
用法:YES/NO
启动此功能则允许本机使用者登入。默认值为YES。
local_root
本机使用者登入时,将被更换到定义的目录下。默认值为无。
text_userdb_names
用法:YES/NO
当使用者登入后使用ls-al之类的指令查询该档案的管理权时,预设会出现拥有者的UID,而不是该档案拥有者的名称。若是希望出现拥有者的名称,则将此功能开启。默认值为NO。
pasv_enable
若是设为NO,则不允许使用PASV的模式建立数据的联机。默认值为开启。
===更换档案所有权===================
chown_uploads
用法:YES/NO
若是启动,所有匿名上传数据的拥有者将被更换为chown_username当中所设定的使用者。这样的选项对于安全及管理,是很有用的。默认值为NO。
chown_username
这里可以定义当匿名登入者上传档案时,该档案的拥有者将被置换的使用者名称。预设值为root。
===guest设定=====================
guest_enable
用法:YES/NO
若是启动这项功能,所有的非匿名登入者都视为guest。默认值为关闭。
guest_username
这里将定义guest的使用者名称。默认值为ftp。
===anonymous设定==================
anonymous_enable
用法:YES/NO
管控使否允许匿名登入,YES为允许匿名登入,NO为不允许。默认值为YES。
no_anon_password
若是启动这项功能,则使用匿名登入时,不会询问密码。默认值为NO。
anon_mkdir_write_enable
用法:YES/NO
如果设为YES,匿名登入者会被允许新增目录,当然,匿名使用者必须要有对上层目录的写入权。默认值为NO。
anon_other_write_enable
用法:YES/NO
如果设为YES,匿名登入者会被允许更多于上传与建立目录之外的权限,譬如删除或是更名。默认值为NO。
anon_upload_enable
用法:YES/NO
如果设为YES,匿名登入者会被允许上传目录的权限,当然,匿名使用者必须要有对上层目录的写入权。默认值为NO。
anon_world_readable_only
用法:YES/NO
如果设为YES,匿名登入者会被允许下载可阅读的档案。默认值为YES。
ftp_username
定义匿名登入的使用者名称。默认值为ftp。
deny_email_enable
若是启动这项功能,则必须提供一个档案/etc/vsftpd.banner_emails,内容为email
address。若是使用匿名登入,则会要求输入emailaddress,若输入的emailaddress在此档案内,则不允许联机。默认值为NO。
===Standalone选项==================
listen
用法:YES/NO
若是启动,则vsftpd将会以独立运作的方式执行,若是vsftpd独立执行,如RedHat9的默认值,则必须启动若是vsftpd包含在xinetd之中,则必须关闭此功能,如RedHat8。在RedHat9的默认值为YES。
listen_address
若是vsftpd使用standalone的模式,可使用这个参数定义使用哪个IPaddress提供这项服务,若是主机上只有定义一个IPaddress,则此选项不需使用,若是有多个IPaddress,可定义在哪个IPaddress上提供ftp服务。若是不设定,则所有的IPaddress均会提供此服务。默认值为无。
max_clients
若是vsftpd使用standalone的模式,可使用这个参数定义最大的总联机数。超过这个数目将会拒绝联机,0表示不限。默认值为0。
max_per_ip
若是vsftpd使用standalone的模式,可使用这个参数定义每个ipaddress所可以联机的数目。超过这个数目将会拒绝联机,0表示不限。默认值为0。
=============================
3.2.4FTP数字代码的意义
110重新启动标记应答。
120服务在多久时间内ready。
125数据链路埠开启,准备传送。
150文件状态正常,开启数据连接端口。
200命令执行成功。
202命令执行失败。
211系统状态或是系统求助响应。
212目录的状态。
213文件的状态。
214求助的讯息。
215名称系统类型。
220新的联机服务ready。
221服务的控制连接埠关闭,可以注销。
225数据连结开启,但无传输动作。
226关闭数据连接端口,请求的文件操作成功。
227进入passivemode。
230使用者登入。
250请求的文件操作完成。
257显示目前的路径名称。
331用户名称正确,需要密码。
332登入时需要账号信息。
350请求的操作需要进一部的命令。
421无法提供服务,关闭控制连结。
425无法开启数据链路。
426关闭联机,终止传输。
450请求的操作未执行。
451命令终止:有本地的错误。
452未执行命令:磁盘空间不足。
500格式错误,无法识别命令。
501参数语法错误。
502命令执行失败。
503命令顺序错误。
504命令所接的参数不正确。
530未登入。
532储存文件需要账户登入。
550未执行请求的操作。
551请求的命令终止,类型未知。
552请求的文件终止,储存位溢出。
553未执行请求的的命令,名称不正确。