vsftpd简单安装使用以及虚拟用户权限控制

摘要

vsftpd是UNIX类操作系统上运行的服务名称,它的名字代表“very secure FTP daemon”,安全性是其设计与开发的一个重要目标。它可运行在Linux、Solaris等系统中,支持很多其他的FTP 服务器不支持的特征:

  • 非常高的安全性需求
  • 带宽限制
  • 良好的可伸缩性
  • 创建虚拟用户的可能性
  • 分配虚拟IP地址的可能性

由于时间关系,本文所有配置不做任何测试,所以难免有遗漏和错误。

基础

安装

1
yum install vsftpd ftp -y

启动服务

1
service vsftpd start

ftp工作模式

ftp采用两个端口控制

  • 20端口用于数据传输.
  • 21端口用于控制,或指建立TCP连接.

主动方式连接过程

1
2
3
4
5
6
# C表示客户端 S表示服务器端
S端要开启20、21端口;
C端一个随机端口连接S端21,这个随机范围1024-65536,同时发送命令port+x,指明数据端口C(X)->S(21);
S端收到命令后,将返回一个ACK,S(21)->C(X);
S端将用自己的20端口与C端的X+1端口相连,S(20)->C(X+1);
C给S返回ACT,C(X+1)->S(20).

被动方式连接过程

1
2
3
4
5
6
# C表示客户端 S表示服务器端
S服务器端要开启21端口和大于1024tcp端口;
C以一个随机端口X与S的21端口相连, 这个随机端口范围为1024~65535, 并发送命令 PASV. C(X) -> S(21)
S收到命令, 返回一个ACK, 并在其中指明一个新的高位端口y. S(21) -> C(x)
C发起 x+1端口到S的y的端口的连接.C(x+1) -> S(y)
S返回一个ACK. S(y) ->C(x+1)

实例

主动模式的配置方法

1
2
3
4
5
6
connect_from_port_20=YES
#主动式连接使用的数据通道
pasv_enable=NO
#支持数据流的被动式连接模式
其余配置,可根据需求而定

被动模式的配置方法

1
2
3
4
5
6
7
8
9
10
connect_from_port_20=NO
#主动式连接使用的数据通道
pasv_enable=YES
#支持数据流的被动式连接模式
pasv_min_port=1024
pasv_max_port=65536
pasv_address (Default: (none - the address is taken from the incoming connected socket) ) pasv模式中服务器传回的ip地址
其余配置,可根据需求而定

区别

Vsftp主动模式和被动模式是可以共存的。

ftp port模式只要开启服务器的21和20端口,而ftp pasv需要开启服务器大于1024所有tcp端口和21端口。重网络安全的角度来看的话似乎ftp port模式更安全,而ftp pasv更不安全,那么为什么RFC要在ftp port基础再制定一个ftp pasv模式呢?其实RFC制定ftp pasv模式的主要目的是为了数据传输安全角度出发的,因为ftp port使用固定20端口进行传输数据,那么作为黑客很容使用sniffer等探嗅器抓取ftp数据,这样一来通过ftp port模式传输数据很容易被黑客窃取,因此使用pasv方式来架设ftp server是最安全绝佳方案。

结论:如果只是简单的为了文件共享,完全可以禁用pasv模式,解除开放大量端口的威胁,同时也为防火墙的设置带来便利。

主动模式和被动模式的区别在于,主动模式下,ftp采用的是20端口传送数据,而被动模式下,ftp采用的是大于1024的随机端口。所以被动模式下,必要关闭防火墙!

参数解析

连接选项

监听地址和控制端口

1
2
3
4
# 定义主机在哪个IP 地址上监听FTP请求。即在哪个IP地址上提供FTP服务。
listen_address=ip address
# 指定FTP服务器监听的端口号。默认值为21。
listen_port=port_value

性能与负载控制

超时选项

1
2
3
4
5
6
7
8
# 空闲用户会话的超时时间,若是超过这段时间没有数据的传送或是指令的输入,则会被迫断线。默认值是300s
idle_session_timeout=
# 接受建立联机的超时设定。默认值为60s
accept_timeout=
# 以 port模式连接数据连接时的超时时间
connect_timeout=
# 数据连接后数据连接等待的空闲时间超时,超过时间后,数据连接将断开连接
data_connection_timeout=

负载选项

1
2
3
4
5
6
7
8
# 定义FTP服务器最大的兵法连接数。当超过此连接数时,服务器拒绝客户端连接。默认值为0,表示不限最大连接数。
max_clients= numerical value
# 定义每个IP地址最大的并发连接数目。超过这个数目将会拒绝连接。此选项的设置将会影响到网际快车、迅雷之类的多线程下载软件。默认值为0,表示不限制。
max_per_ip= numerical value
# 设定匿名用户的最大数据传输速度,以B/s为单位。默认无。
anon_max_rate=value
# 设定用户的最大数据传输速度。以B/s为单位。默认无。此选项对所有的用户都生效。
local_max_rate=value

用户选项

vsftpd的用户分为3类:匿名用户、本地用户(local user)及虚拟用户(guest)

匿名用户

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 控制是否允许匿名用户登录
anonymous_enable=YES|NO
# 匿名用户使用的系统用户名。默认情况下,值为ftp
ftp_username=
# 控制匿名用户登录时是否需要密码。
no_anon_password= YES|NO
# 设定匿名用户的根目录,即匿名用户登录后,被定位到此目录下。主配置文件中默认无此项,默认值为/var/ftp/
anon_root=
# 控制是否只允许匿名用户下载可阅读的文档。YES,只允许匿名用户下载可阅读的文件。NO,允许匿名用户浏览整个服务器的文件系统。
anon_world_readable_only= YES|NO
# 控制是否允许匿名用户上传文件。除了这个参数外,匿名用户要能上传文件,还需要两个条件,write_enable参数为YES;在文件系统上,FTP匿名用户对某个目录有写权限。
anon_upload_enable= YES|NO
# 控制是否允许匿名用户创建新目录。在文件系统上,FTP匿名用户必须对新目录的上层目录拥有写权限。
anon_mkdir_wirte_enable= YES|NO
# 控制匿名用户是否拥有除了上传和新建目录之外的其他权限。如删除、更名等。
anon_other_write_enbale= YES|NO
# 是否修改匿名用户所上传文件的所有权。YES,匿名用户上传得文件所有权改为另一个不同的用户所有,用户由chown_username参数指定。
chown_uploads= YES|NO
# 指定拥有匿名用户上传文件所有权的用户。
chown_username=whoever

本地用户

1
2
3
4
# 控制vsftpd所在的系统的用户是否可以登录vsftpd。
local_enable= YES|NO
# 定义本地用户的根目录。当本地用户登录时,将被更换到此目录下。
local_root=

虚拟用户

1
2
3
4
# 启动此功能将所有匿名登入者都视为guest
guest_enable= YES|NO
# 定义vsftpd的guest用户在系统中的用户名。
guest_username=

安全

用户登录控制

1
2
3
4
5
6
7
8
9
# Vsftpd禁止列在此文件中的用户登录FTP服务器。此机制是默认设置的。
/etc/vsftpd.ftpusers
# 此选项激活后,vsftpd将读取userlist_file参数所指定的文件中的用户列表。
userlist_enable= YES|NO
# 指出userlist_enable选项生效后,被读取的包含用户列表的文件。默认值是/etc/vsftpd/user_list
userlist_file=/etc/vsftpd/user_list
# 决定禁止还是只允许由userlist_file指定文件中的用户登录FTP服务器。userlist_enable选项启动后才能生效。默认值为YES,禁止文中的用户登录,同时不向这些用户发出输入口令的指令。NO,只允许在文中的用户登录FTP服务器。
userlist_deny= YES|NO

目录访问控制

1
2
3
4
5
6
# 锁定某些用户在自己的目录中,而不可以转到系统的其他目录。
chroot_list_enable= YES|NO
# 指定被锁定在主目录的用户的列表文件。
chroot_list_file=/etc/vsftpd/chroot_list
# 将本地用户锁定在主目中。
chroot_local_users= YES|NO

显示配置

登录提示信息

1
ftpd_banner=Welcome to blah FTP service.

显示一个文件作为提示信息

1
2
3
4
5
6
7
8
9
cat my_banner
############
#
$
@
^
&
############
banner_file=/etc/vsftpd/my_banner

完整配置

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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
vim /etc/vsftpd/vsftpd.conf
# 自定义欢迎信息
ftpd_banner=Welcome to blah FTP service.
# 用户进入一个目录后,是否给出静态提示
dirmessage_enable=YES
# 日志配置
xferlog_enable=YES
xferlog_file=/data/logs/vsftpd.log
xferlog_std_format=YES
# 使用pam模块控制
pam_service_name=ftp
# 是否单进程模式
one_process_model=NO
# 主动模式是否允许20端口连接
connect_from_port_20=NO
# 被动模式
pasv_enable=YES
#支持数据流的被动式连接模式
pasv_min_port=1024
pasv_max_port=1124
# 是否监听
listen=YES
tcp_wrappers=YES
# 开启白名单设置
userlist_enable=YES
# 黑白名单设置
userlist_deny=YES
userlist_file=/etc/vsftpd/user_list
# 控制系统用户是否可以登录
local_enable=YES
# 本地用户文件掩码
local_umask=022
write_enable=YES
# 是否允许下载
download_enable=YES
# 是否允许使用ls
ls_recurse_enable=YES
# 定义用户的chroot目录
#local_root=/data/test
# 本地用户以及虚拟用户限制速度
local_max_rate=1024000
# 是否允许写入
# 是否chroot
chroot_local_user=YES
# 是否只限制名单中的用户
chroot_list_enable=YES
# 指定被锁定在主目录的用户的列表文件。
chroot_list_file=/etc/vsftpd/chroot_list
# 匿名用户以及虚拟用户控制
# 控制是否允许匿名用户登录
anonymous_enable=NO
# 控制是否允许匿名用户上传文件
anon_upload_enable=YES
# 匿名用户在文件夹创建目录
anon_mkdir_write_enable=YES
# 匿名用户可以删除目录
anon_other_write_enable=YES
# 虚拟用户文件掩码
anon_umask=022
# 匿名用户是否只有下载权限
anon_world_readable_only=NO
# 匿名用户限制下载速度 一般设定为120K左右
anon_max_rate=1024000
# 匿名用户限制人数
max_clients=3
匿名用户限制某个用户有几个连接
max_per_ip=2
# 修改匿名用户上传文件所有者
#chown_uploads=YES
#chown_username=ftpuser
# 虚拟用户配置
guest_enable=YES
# ftpuser是系统中的真实用户,所有虚拟用户上传的文件都会用这个用户的权限存储
guest_username=ftpuser
# 虚拟用户独立配置文件目录
user_config_dir=/etc/vsftpd/vsftpd_user_conf
# 虚拟用户和本地用户是否有相同的权限
virtual_use_local_privs=NO
# 指定ftp运行用户
#nopriv_user=ftpsecure
# 是否允许客户端使用sync
#async_abor_enable=YES
# 是否允许上传、下载二进制文件
#ascii_upload_enable=YES
#ascii_download_enable=YES
# 连接超时时间
#idle_session_timeout=600
# 数据传输超时时间
#data_connection_timeout=120

虚拟用户

添加用户

1
2
3
4
5
6
7
8
9
10
1.在account.txt中添加用户名和密码,一行用户名,一行密码
test1
passxxx
test2
passxxxx
2.运行如下命令,将用户名和密码添加到数据库中
db_load -T -t hash -f ./account.txt /etc/vsftpd/account.db
chmod 600 /etc/vsftpd/account.db

主配置文件

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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
cat /etc/pam.d/ftp
auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/account
account required /lib64/security/pam_userdb.so db=/etc/vsftpd/account
# 主动模式
############vsftpd##############
ftpd_banner=Welcom to httx FTP server.
dirmessage_enable=YES
xferlog_enable=YES
xferlog_file=/data/logs/vsftpd.log
xferlog_std_format=YES
pam_service_name=ftp
connect_from_port_20=YES
one_process_model=NO
listen=YES
tcp_wrappers=YES
userlist_enable=YES
userlist_deny=YES
local_enable=YES
local_root=/data/ftp
write_enable=YES
local_umask=022
#download_enable=YES
ls_recurse_enable=YES
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
anonymous_enable=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
anon_umask=022
anon_world_readable_only=NO
guest_enable=YES
guest_username=ftpuser
user_config_dir=/etc/vsftpd/vsftpd_user_conf
virtual_use_local_privs=NO
############vsftpd##############
# 被动模式
############vsftpd##############
ftpd_banner=Welcom to my FTP server.
dirmessage_enable=YES
xferlog_enable=YES
xferlog_file=/data/logs/vsftpd.log
xferlog_std_format=YES
pam_service_name=ftp
one_process_model=NO
pasv_enable=YES
pasv_min_port=1024
pasv_max_port=1028
#connect_from_port_20=YES
listen=YES
tcp_wrappers=YES
userlist_enable=YES
userlist_deny=YES
userlist_file=/etc/vsftpd/user_list
local_enable=YES
local_umask=022
local_root=/data/ftp
write_enable=YES
download_enable=YES
ls_recurse_enable=YES
chroot_local_user=YES
chroot_list_enable=NO
anonymous_enable=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
anon_umask=022
anon_world_readable_only=NO
#chown_uploads=YES
#chown_username=ftpuser
guest_enable=YES
guest_username=ftpuser
user_config_dir=/etc/vsftpd/vsftpd_user_conf
virtual_use_local_privs=NO
############vsftpd##############

单独说一下这个参数对权限的影响 virtual_use_local_privs

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
# 虚拟用户和本地用户有相同的权限
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

虚拟用户配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
############test1##############
local_root=/home/ftpsite/test1
#lock_upload_files=NO
#download_enable=NO
#anon_upload_enable=YES
#anon_mkdir_write_enable=YES
#anon_other_write_enable=YES
#chown_uploads=YES
#chown_username=nono
#allow_anon_ssl=YES
write_enable=YES
#force_anon_logins_ssl=YES
#force_anon_data_ssl=YES
cmds_allowed=CWD,LIST,MDTM,MKD,NLST,PASS,PASV,PORT,PWD,QUIT,RMD,RETR,SIZE,STOR,TYPE,USER,ACCT,APPE,CDUP,HELP,MODE,NOOP,REIN,STAT,STOU,STRU,SYST
############test1##############
############test2##############
local_root=/home/ftpsite/test2
write_enable=YES
############test2##############

ftp 命令控制

1
2
3
4
ABOR,CWD,LIST,MDTM,MKD,NLST,
PASS,PASV,PORT,PWD,QUIT,RETR,RMD,RNFR,
RNTO,SITE,SIZE,STOR,TYPE,USER,ACCT,
APPE,CDUP,HELP,MODE,NOOP,REIN,STAT,STOU,STRU,SYST

几个简单的例子

只能上传。不能下载、删除、重命名

1
cmds_allowed=FEAT,REST,CWD,LIST,MDTM,MKD,NLST,PASS,PASV,PORT,PWD,QUIT,RMD,RETR,SIZE,STOR,TYPE,USER,ACCT,APPE,CDUP,HELP,MODE,NOOP,REIN,STAT,STOU,STRU,SYST

只能下载。不能上传、删除、重命名

1
write_enable=NO

只能上传、删除、重命名。不能下载

1
download_enable=NO

只能下载、删除、重命名。不能上传

1
cmds_allowed=FEAT,REST,CWD,LIST,MDTM,MKD,NLST,PASS,PASV,PORT,PWD,QUIT,RMD,RNFR,RNTO,RETR,DELE,SIZE,TYPE,USER,ACCT,APPE,CDUP,HELP,MODE,NOOP,REIN,STAT,STOU,STRU,SYST

参数解析

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
以上是常用的一些参数,大家对照学习一下!下面是列也的全部参数,供大家参考!
# ABOR - abort a file transfer 取消文件传输
# CWD - change working directory 更改目录
# DELE - delete a remote file 删除文件
# LIST - list remote files 列目录
# MDTM - return the modification time of a file 返回文件的更新时间
# MKD - make a remote directory 新建文件夹
# NLST - name list of remote directory
# PASS - send password
# PASV - enter passive mode
# PORT - open a data port 打开一个传输端口
# PWD - print working directory 显示当前工作目录
# QUIT - terminate the connection 退出
# RETR - retrieve a remote file 下载文件
# RMD - remove a remote directory删除目录
# RNFR - rename from重命名
# RNTO - rename to重命名
# SITE - site-specific commands
# SIZE - return the size of a file 返回文件大小
# STOR - store a file on the remote host 上传文件
# TYPE - set transfer type
# USER - send username
# less common commands:
# ACCT* - send account information
# APPE - append to a remote file
# CDUP - CWD to the parent of the current directory
# HELP - return help on using the server
# MODE - set transfer mode
# NOOP - do nothing
# REIN* - reinitialize the connection
# STAT - return server status
# STOU - store a file uniquely
# STRU - set file transfer structure
# SYST - return system type

vsftpd服务器的配置实例

基于IP的虚拟FTP服务器配置

假设服务器有两个IP地址,192.168.1.199和192.168.1.200。vsftpd是建立在192.168.1.199上的。现在在192.168.1.200上再提供一个虚拟FTP服务器。

1
2
3
4
5
6
7
8
# 创建虚拟FTP服务器根目录
mkdir –p /var/ftp2/pub
# 确保/var/ftp2和/var/ftp2/pub目录的所有者和组均为root,掩码为755
chmod 755 /var/ftp2
chmod 755 /var/ftp2/pub
chown –R root /var/ftp2
# 增加虚拟FTP服务器的匿名用户帐号ftp2
useradd –d /var/ftp2 –M ftp2

###创建虚拟FTP服务器的配置文件

1
2
3
4
5
6
7
8
# 复制原来的vsftpd.conf作为虚拟FTP服务器的配置文件,并修改相关参数
cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd2.conf
vi /etc/vsftpd/vsftpd2.conf
# 添加或修改参数:
Listen=YES
Listen_address=192.168.1.200
ftp_username=ftp2
anon_root=/var/ftp2

允许匿名用户上传文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Write_enable=YES
Anon_world_readable_only=NO
Anon_upload_enable=YES
Anon_mkdir_write_enable=YES
# 创建匿名用户上传文件的目录,并设置权限:
mkdir /var/ftp/incoming
chmod o+w /var/ftp/incoming
# 取消写权限
Write_enable=NO
Anon_upload_enable=NO
Anon_mkdir_write_enable=NO
Anon_other_write_enable=NO
# 限制下载速度为80KB/s
Anon_max_rate=8000
# 控制并发数,以及每个IP地址的并发数
Max_clients=100
Max_per_ip=3

启动虚拟FTP服务器

1
2
3
4
5
6
7
/usr/sbin/vsftpd /etc/vsftpd/vsftpd2.comf
vi /etc/vsftpd/vsftpd.conf
userlist_deny=NO /这个列表里的人不拒绝,其他人拒绝(包括匿名)
userlist_file=/etc/mp /指明列表的路径
然后:#vi /etc/mp 把可访问的名字添加上去
重启vsftpd 服务即可!

ssl认证

1
2
3
4
5
6
7
8
9
10
11
12
# 启用TLS/SSL
ssl_enable=YES
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
require_ssl_reuse=NO
ssl_ciphers=HIGH
rsa_cert_file=/etc/vsftpd/vsftpd.pem
rsa_private_key_file=/etc/vsftpd/vsftpd.pem