Vsftpd

Vsftpd说明

vsftpd 是一个 UNIX 类操作系统上运行的服务器的名字,它可以运行在诸如 Linux, BSD, Solaris, HP-UX 以及 IRIX 上面。它支持很多其他的 FTP 服务器不支持的特征。
vsftpd 的名字代表"very secure FTP daemon", 安全是它的开发者 Chris Evans 考虑的首要问题之一。
比如:

  • 非常高的安全性需求
  • 带宽限制
  • 良好的可伸缩性
  • 创建虚拟用户的可能性
  • IPv6支持
  • 中等偏上的性能
  • 分配虚拟 IP 的可能性
  • 高速

    FTP介绍

    FTP会话时包含了两个通道,一个叫控制通道,一个叫数据通道。

  • 控制通道:控制通道是和FTP服务器进行沟通的通道,连接FTP,发送FTP指令都是通过控制通道来完成的。
  • 数据通道:数据通道是和FTP服务器进行文件传输或者列表的通道。

FTP协议中,控制连接均有客户端发起,而数据连接有两种工作方式:PORT方式和PASV方式

PORT模式(主动方式)

FTP 客户端首先和FTP Server的TCP 21端口建立连接,通过这个通道发送命令,客户端需要接收数据的时候在这个通道上发送PORT命令。 PORT命令包含了客户端用什么端口(一个大于1024的端口)接收数据。在传送数据的时候,服务器端通过自己的TCP 20端口发送数据。 FTP server必须和客户端建立一个新的连接用来传送数据。

PASV模式(被动方式)

在建立控制通道的时候和PORT模式类似,当客户端通过这个通道发送PASV 命令的时候,FTP server打开一个位于1024和5000之间的随机端口并且通知客户端在这个端口上传送数据的请求,然后FTP server 将通过这个端口进行数据的传送,这个时候FTP server不再需要建立一个新的和客户端之间的连接传送数据。
如果从C/S模型这个角度来说,PORT对于服务器来说是OUTBOUND,而PASV模式对于服务器是INBOUND,这一点请特别注意,尤其是在使用防火墙的企业里,这一点非常关键,如果设置错了,那么客户将无法连接。

Vsftpd模式

vsftpd运行有两种模式,在RPM包管理的系重审统,大多是由Fedora/Redhat 开发而来,对于这样的系统有xinted服务器一说;对于非RPM包管理的系统,一般没有xinted这一说。为了保证本文档的统一,我们都不要用xinetd模式,而用initd运行模式来启动和管理服务器,也就是独立运行模式。
像其它守护程序一样,vsftpd提供了standalone和inetd(inetd或xinetd)两种运行模式。简单解释一下, standalone一次性启动,运行期间一直驻留在内存中,优点是对接入信号反应快,缺点是损耗了一定的系统资源,因此经常应用于对实时反应要求较高的专业FTP服务器。inetd恰恰相反,由于只在外部连接发送请求时才调用FTP进程,因此不适合应用在同时连接数量较多的系统。此外,inetd模式不占用系统资源。除了反应速度和占用资源两方面的影响外,vsftpd还提供了一些额外的高级功能,如inetd模式支持per_IP(单一IP)限制,而 standalone模式则更有利于PAM验证功能的应用。

Vsftpd配置文件

文件 说明
/etc/vsftpd/vsftpd.conf 主配置文件
/usr/sbin/vsftpd Vsftpd的主程序
/etc/pam.d/vsftpd PAM认证文件(此文件中file=/etc/vsftpd/ftpusers字段,指明阻止访问的用户来自/etc/vsftpd/ftpusers文件中的用户)
/etc/vsftpd/ftpusers 禁止使用vsftpd的用户列表文件。记录不允许访问FTP服务器的用户名单,管理员可以把一些对系统安全有威胁的用户账号记录在此文件中,以免用户从FTP登录后获得大于上传下载操作的权利,而对系统造成损坏。(注意:linux-4中此文件在/etc/目录下)
/etc/vsftpd/user_list 禁止或允许使用vsftpd的用户列表文件。这个文件中指定的用户缺省情况(即在/etc/vsftpd/vsftpd.conf中设置userlist_deny=YES)下也不能访问FTP服务器,在设置了userlist_deny=NO时,仅允许user_list中指定的用户访问FTP服务器。(注意:linux-4中此文件在/etc/目录下)
/var/ftp 匿名用户主目录;本地用户主目录为:/home/用户主目录,即登录后进入自己家目录
/var/ftp/pub 匿名用户的下载目录,此目录需赋权根chmod 1777 pub(1为特殊权限,使上载后无法删除)

Vsftpd主配置文件详细说明

首先来简化一下主配置文件:

[root@centos7 ~]# cp /etc/vsftpd/vsftpd.conf{,.bak}            #备份主配置文件
[root@centos7 ~]# egrep "^[a-z]|^#[a-z]" /etc/vsftpd/vsftpd.conf.bak > /etc/vsftpd/vsftpd.conf        

说明

[root@centos7 ~]# cat /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
说明:是否允许匿名登录FTP服务器,默认设置为YES允许
local_enable=YES
说明:是否允许本地用户(即linux系统中的用户帐号)登录FTP服务器,默认设置为YES允许本地用户登录后会进入用户主目录,而匿名用户登录后进入匿名用户的下载目录/var/ftp/pub
write_enable=YES
说明:是否允许本地用户对FTP服务器文件具有写权限,默认设置为YES允许
local_umask=022
说明:缺省掩码,本地用户默认掩码为077
#anon_upload_enable=YES
说明:是否允许匿名用户上传文件,须将全局的write_enable=YES。默认为YES
#anon_mkdir_write_enable=YES
说明:是否允许匿名用户创建新文件夹
dirmessage_enable=YES
说明:是否激活目录欢迎信息功能;当用户用CMD模式首次访问服务器上某个目录时,FTP服务器将显示欢迎信息默认情况下,欢迎信息是通过该目录下的.message文件获得的
xferlog_enable=YES
说明:是否让系统自动维护上传和下载的日志文件;默认情况该日志文件为/var/log/vsftpd.log,也可以通过下面的xferlog_file选项对其进行设定
connect_from_port_20=YES
说明:是否设定FTP服务器将启用FTP数据端口的连接请求;ftp-data数据传输,21为连接控制端口
#chown_uploads=YES
说明:设定是否允许改变上传文件的属主,与下面一个设定项配合使用
#chown_username=whoever
说明:设置想要改变的上传文件的属主
#xferlog_file=/var/log/xferlog
说明:设定系统维护记录FTP服务器上传和下载情况的日志文件
xferlog_std_format=YES
说明:是否以标准xferlog的格式书写传输日志文件
#idle_session_timeout=600
说明:设置数据传输中断间隔时间,此语句表示空闲的用户会话中断时间为600秒
#data_connection_timeout=120
说明:设置数据连接超时时间
#nopriv_user=ftpsecure
说明:运行vsftpd需要的非特权系统用户,缺省是nobody
#async_abor_enable=YES
说明:是否识别异步ABOR请求。
#ascii_upload_enable=YES
#ascii_download_enable=YES
说明:是否以ASCII方式传输数据。默认情况下,服务器会忽略ASCII方式的请求。
#ftpd_banner=Welcome to blah FTP service.
说明:登录FTP服务器时显示的欢迎信息
#deny_email_enable=YES
说明:黑名单设置
#banned_email_file=/etc/vsftpd/banned_emails
说明:当上面的deny_email_enable=YES时,可以利用这个设定项来规定哪些邮件地址不可登录vsftpd服务器
#chroot_local_user=YES
#chroot_list_enable=YES
说明:用户登录FTP服务器后是否具有访问自己目录以外的其他文件的权限;设置为YES时,用户被锁定在自己的home目录中
#chroot_list_file=/etc/vsftpd/chroot_list
说明:被列入此文件的用户,在登录后将不能切换到自己目录以外的其他目录
#ls_recurse_enable=YES
说明:是否允许递归查询。默认为关闭,以防止远程用户造成过量的I/O
listen=NO
说明:是否允许监听IPv4
listen_ipv6=YES
说明:设定是否支持IPV6
pam_service_name=vsftpd
说明:设置PAM外挂模块提供的认证服务所使用的配置文件名,即/etc/pam.d/vsftpd文件
userlist_enable=YES
说明: 是否允许ftpusers文件中的用户登录FTP服务器;若此项设为YES,则user_list文件中的用户允许登录FTP服务器
tcp_wrappers=YES
说明:是否使用tcp_wrappers作为主机访问控制方式。

配置选项补充

在FTP服务器的管理中,无论对本地用户还是匿名用户,对于FTP服务器资源的使用都需要进行控控制,避免由于负担过大造成FTP服务器运行异常,可以添加以下配置项对FTP客户机使用FTP服务器资源进行控制:

max_client
说明:设置项 用于设置FTP服务器所允许的最大客户端连接数,值为0时表示不限制。例如max_client=100表示FTP服务器的所有客户端最大连接数不超过100个。
max_per_ip
说明:设置项 用于设置对于同一IP地址允许的最大客户端连接数,值为0时表示不限制。例如max_per_ip=5表示同一IP地址的FTP客户机与FTP服务器建立的最大连接数不超过5个。
local_max_rate
说明:设置项 用于设置本地用户的最大传输速率,单位为B/s,值为0时表示不限制。例如local_max_rate=500000表示FTP服务器的本地用户最大传输速率设置为500KB/s.
anon_max_rate
说明:设置项 用于设置匿名用户的最大传输速率,单位为B/s,值为0表示不限制。例如ano_max_rate=200000,表示FTP服务器的匿名用户最大传输速率设置为200KB/s.

FTP返回值含义

数字 含义
110 重新启动标记应答
120 服务在多久时间内ready
125 数据链路端口开启,准备传送
150 文件状态正常,开启数据连接端口
200 命令执行成功
202 命令执行失败
211 系统状态或是系统求助响应
212 目录的状态
213 文件的状态
214 求助的讯息
215 名称系统类型
220 新的联机服务ready
221 服务的控制连接端口关闭,可以注销
225 数据连结开启,但无传输动作
226 关闭数据连接端口,请求的文件操作成功
227 进入passive mode
230 使用者登入
250 请求的文件操作完成
257 显示目前的路径名称
331 用户名称正确,需要密码
332 登入时需要账号信息
350 请求的操作需要进一部的命令
421 无法提供服务,关闭控制连结
425 无法开启数据链路
426 关闭联机,终止传输
450 请求的操作未执行
451 命令终止:有本地的错误
452 未执行命令:磁盘空间不足
500 格式错误,无法识别命令
501 参数语法错误
502 命令执行失败
503 命令顺序错误
504 命令所接的参数不正确
530 未登入
532 储存文件需要账户登入
550 未执行请求的操作
551 请求的命令终止,类型未知
552 请求的文件终止,储存位溢出
553 未执行请求的的命令,名称不正确

虚拟用户

虚拟用户是指在FTP服务器上拥有账号,并且该账号只能用于文件传输服务的用户,也称作Guest用户。该类用户可以通过输入账号以及口令来进行授权登录。登录入系统后,其登录目录为指定的目录。一般情况下,该类用户既可以下载也可以上传文件。
vsftpd的虚拟用户采用单独的用户名/口令保存方式,与系统账号(passwd/shadow)分离,这大大增强了系统的安全性。vsftpd可以采用数据库文件来保存用户/口令,如hash;也可以将用户/口令保存在数据库服务器中,如MySQL等。vsftpd验证虚拟用户,则采用PAM方式。由于虚拟用户的用户名/口令被单独保存,因此在验证时,vsftpd须要用一个系统用户的身份来读取数据库文件或数据库服务器以完成验证,这就是guest用户,这正如同匿名用户也需要有一个系统用户ftp一样。当然,guest用户也可以被认为是用于映射虚拟用户。

实例

匿名用户访问

  • 安装vsftpd
[root@centos7 ~]# yum -y install vsftpd
  • 查看安装情况
[root@centos7 ~]# rpm -qa | grep vsftpd
vsftpd-3.0.2-22.el7.x86_64
  • 启动vsftpd
[root@centos7 ~]# systemctl start vsftpd
[root@centos7 ~]# systemctl status vsftpd
● vsftpd.service - Vsftpd ftp daemon
  Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; disabled; vendor preset: disabled)
  Active: active (running) since Mon 2017-11-13 04:13:02 CST; 9min ago
  Process: 1633 ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf (code=exited, status=0/SUCCESS)
Main PID: 1634 (vsftpd)
  CGroup: /system.slice/vsftpd.service
          └─1634 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf

Nov 13 04:13:02 centos7 systemd[1]: Starting Vsftpd ftp daemon...
Nov 13 04:13:02 centos7 systemd[1]: Started Vsftpd ftp daemon.
  • 测试

Vsftpd_第1张图片

虚拟用户访问

  • 创建访问目录
[root@centos7 ~]# mkdir -p /data/user1 /data/user2
[root@centos7 ~]# ls /data/
user1  user2
  • 创建映射用户
[root@centos7 ~]# useradd vsftpd -s /sbin/nologin
  • 生成虚拟用户口令库文件
[root@centos7 ~]# cat > /etc/vsftpd/user_passwd <
  • 配置生成vsftpd的认证文件
[root@centos7 ~]# db_load -T -t hash -f /etc/vsftpd/user_passwd /etc/vsftpd/login.db
在/etc/pam.d/vsftpd文件中注释原有条目并添加以下两行:
auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/login
account required /lib64/security/pam_userdb.so db=/etc/vsftpd/login
  • 创建chroot_list文件
[root@centos7 ~]# echo "vsftpd" > /etc/vsftpd/chroot_list
  • 修改配置文件
[root@centos7 ~]# grep -v "#" /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
listen=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES

guest_enable=YES
guest_username=vsftpd
user_config_dir=/etc/vsftpd/user_conf
  • 创建虚拟用户配置目录
[root@centos7 ~]# mkdir -p /etc/vsftpd/user_conf
  • 虚拟用户配置文件
[root@centos7 ~]# cat /etc/vsftpd/user_conf/user1
local_root=/data/user1
write_enable=YES
anon_umask=022
anon_world_readable_only=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
[root@centos7 ~]# cat /etc/vsftpd/user_conf/user2
local_root=/data/user2
write_enable=YES
anon_umask=022
anon_world_readable_only=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
  • 重启vsftpd
[root@centos7 ~]# systemctl restart vsftpd
  • 测试

Vsftpd_第2张图片

Vsftpd_第3张图片

Vsftpd_第4张图片

Vsftpd_第5张图片