简介
Vsftp(Very Secure FTP)是一个基于GPL发布的类Unix系统上使用的FTP服务器软件,是一款小巧而又易用FTP服务器程序,Vsftpd 在安全性、高性能及稳定性三个方面有很好的表现。它提供的主要功能包括虚拟IP设置、虚拟用户、Standalone、inetd操作模式、强大的单用户设置能力及带宽限流等。在安全方面,它从原理上修补了大多数Wu-FTP、ProFTP,乃至BSD-FTP的安装缺陷,使用安全编码技术解决了缓冲溢出问题,并能有效避免“globbing”类型的拒绝服务攻击。
Windows下常用Ftp服务器软件: Serv-U、IIS、Filezilla
Linux下Ftp服务器软件:Filezilla、Vsftpd、wuftpd、proftpd 、pureftp
Vsftp的特点:
9、支持带宽限制
目录
一.Ftp原理与vsftpd安装
二.配置文件介绍
三.配置用户支持上传和下载限制用户连接数及速率 用户类型:
匿名用户:在默认安装后,系统只提供匿名用户访问(服务器端自动映射的一个系统用户)
本地用户:以/etc/passwd中的用户名为认证方式(默认root和id号小于500的用户都禁止访问)
虚拟用户:支持将用户名和口令保存在数据库文件或数据库服务器中。事实上多个虚拟用户同时被映射为同一个系统用户,但不同的虚拟用户可以具有不同的访问权限
四.搭建支持SSL加密传输的vsftpd
一、Ftp原理
1、FTP Transfer Protocol 件传输协议的缩写,FTP会话时包含了两个通道,一个叫控制通道,一个叫数据通道;如下图:
控制通道:控制通道是和FTP服务器进行沟通的通道,连接FTP,发送FTP指令都是通过控制通道来完成的, PI称为控制连接
数据通道:数据通道是和FTP服务器进行文件传输或者列表的通道。
FTP协议中,控制连接均有客户端发起,而数据连接有两种工作方式:PORT方式和PASV方式,DTP称为数据连接
PASV模式(被动方式)
在建立控制通道的时候和PORT模式类似,当客户端通过这个通道发送 PASV 命令的时候,FTP server打开一个位于1024和5000之间的随机端口并且通知客户端在这个端口上传送数据的请求,然后FTP server 将通过这个端口进行数据的传送,这个时候FTP server不再需要建立一个新的和客户端之间的连接传送数据。
PORT模式(主动方式)
FTP 客户端首先和FTP Server的TCP 21端口建立连接,通过这个通道发送命令,客户端需要接收数据的时候在这个通道上发送PORT命令。 PORT命令包含了客户端用什么端口(一个大于1024的端口)接收数据。在传送数据的时候,服务器端通过自己的TCP 20端口发送数据。 FTP server必须和客户端建立一个新的连接用来传送数据。
如果从C/S模型这个角度来说,PORT对于服务器来说是OUTBOUND,而PASV模式对于服务器是INBOUND,这一点请特别注意,尤其是在使用防火墙的企业里,这一点非常关键,如果设置错了,那么客户将无法连接。
2、安装Vsftp软件包
这里我们采用rpm安装方式,系统版本:CentOS6.4_x86_64 软件版本vsftpd.x86_64-2.2.2-11.el6_3.1
[root@localhost ~]# rpm -q vsftpd #查询是否安装Vsftp package vsftpd is not installed #提示没有安装 [root@localhost ~]# yum list|grep vsftpd #使用Yum安装,需要配置好Yum才能使用,当然也可以从光盘映像安装 [root@localhost ~]# rpm -q vsftpd #再查看是否安装成功 vsftpd-2.2.2-11.el6_3.1.x86_64 #已经安装成功
二、配置文件介绍及详解主配置文件
[root@localhost ~]# rpm -qc vsftpd #查询vsftpd的配置文件 /etc/logrotate.d/vsftpd #日志文件 /etc/pam.d/vsftpd #PAM认证文件 /etc/rc.d/init.d/vsftpd #服务启动脚本 /etc/vsftpd #Vsftpd配置文件存放路径 /etc/vsftpd/ftpusers #禁止使用Vsftpd的用户列表文件 /etc/vsftpd/user_list #禁止或允许使用Vsftpd的用户列表文件 /etc/vsftpd/vsftpd.conf #主配置文件 /etc/vsftpd/vsftpd_conf_migrate.sh #vsftpd操作的一些变量和设置 /usr/sbin/vsftpd #Vsftpd执行程序 /var/ftp #匿名用户目录 /var/ftp/pub #默认匿名用户存放文件目录
下面主要对主配置文件的一些指令做详解
anonymous_enable=YES #是否允许匿名用户访问 local_enable=YES #是否允许本地用户访问 write_enable=YES #全局配置是否对Ftp服务器有可写权限 local_umask=022 #用户上传的文件权限 anon_upload_enable=YES #是否允许匿名用户上传文件,须开启全局配置可写权限 anon_mkdir_write_enable=YES #是否允许匿名用户创建目录 anon_other_write_enable=YES #是否允许匿名用户有写入权限 dirmessage_enable=YES #当使用者切换目录,会显示该目录下的.message文件中内容 xferlog_enable=YES #记录使用者所有上传下载信息 connect_from_port_20=YES #确定端口连接是20端口 chown_uploads=YES #是否允许改变上传文件的属主,与下面配合使用 chown_username=whoever #上传文件的属主,whoever任何人 xferlog_file=/var/log/xferlog #将上传下载信息记录到日志 xferlog_std_format=YES #日志使用标准格式 idle_session_timeout=600 #数据传输结束后,保持连接的超时时间 data_connection_timeout=120 #数据连接超时时间 nopriv_user=ftpsecure #运行Vsftp需要非特权系统用户 async_abor_enable=YES #如果Ftp_client会下达“async abor”这个指令需要开启 ascii_upload_enable=YES #是否以ASCII方式传输数据 ascii_download_enable=YES ftpd_banner=Welcome to blah FTP service. #Ftp欢迎信息 deny_email_enable=YES #黑名单设置 banned_email_file=/etc/vsftpd/banned_emails #当上面一个选项开启,可以设置哪些邮箱地址不能登录Ftp服务器 chroot_local_user=YES #设置是否禁锢用户目录,与下面一项配合使用 chroot_list_enable=YES #如果开启三个chroot选项,chroot_list文件相当于白名单 chroot_list_file=/etc/vsftpd/chroot_list #在些文件中的用户登录后只能在指定的目录中活动 ls_recurse_enable=YES #是否允许递归 listen=YES #是否监听 listen_ipv6=YES #是否监听Ipv6 pam_service_name=vsftpd #设置PAM模块提供的认证服务所使用的配置文件名 userlist_enable=YES #是否允许user_list用户文件中的用户登录 tcp_wrappers=YES #是否使用些方式作为访问控制方式 anon_max_rate=0 #匿名用户传输速度限制单位字节,0为不限制 local_max_rate=0 #本地用户传输速度限制单位字节,0为不限制 max_clients=100 #同一时间允许客户端最大连接数 max_per_ip=10 #允许同一IP在同一时间最大连接 connect_timeout=60 #客户端尝试连接命令通道超过60秒强制断开 pasv_enable=YES #是否启动被动式联机 accept_timeout=60 #当使用被动式进行数据传输时,如果主机启用passive port并等待客户端60秒无响应强制断开 #下面是指定连接Ftp使用ssl加密方式 ssl_enable=YES ssl_tlsv1=YES ssl_sslv2=YES ssl_sslv3=YES allow_anon_ssl=NO force_local_data_ssl=YES force_local_logins_ssl=YES rsa_cert_file=/etc/vsftpd/ssl/vsftpd.crt rsa_private_key_file=/etc/vsftpd/ssl/vsftpd.key
三、配置用户支持上传、下载功能
服务器地址: 172.16.14.1 客户端地址: 172.16.14.2
启动Vsftp服务端,启动前请关闭防火墙与SELinux
[root@localhost ~]# setenforce 0 #关闭SELinux [root@localhost ~]# service iptables stop #关闭防火墙 [root@localhost ~]# service vsftpd start #启动成功 为 vsftpd 启动 vsftpd: [确定]
1、配置虚拟用户
所谓的匿名用户实际就是被映射为系统用户ftp,如下图:
我们在这个目录下的pub下新建一个文件(ftp.txt)写入内容来查看一下:
如果想让匿名用户上传文件需要修改主配置文件,如下:
anonymous_enable=YES #开启允许匿名访问(默认开启) write_enable=YES #全局配置写入要开启 anon_upload_enable=YES #开启允许匿名用户上传文件,须开启全局配置可写权限 anon_mkdir_write_enable=YES #开启允许匿名创建文件夹 anon_other_write_enable=YES #如果想要删除文件须开启些项
修改完主配置文件保存退出,要重启vsftp:
[root@localhost ftp]# service vsftpd restart 关闭 vsftpd: [确定] 为 vsftpd 启动 vsftpd: [确定]
在客户端重新登录测试是否有权限上传文件、删除文件,如下图:
Ftp协议码: 大致分类如:
1开头:表示服务器信息 2开头:正确响应的信息 3开头:正常响应,但某一操作尚未完成,需进一步补充完成
4开头:表示客户端错误 5开头:表示服务器端错误
120 |
服务在nnn分钟内准备好 |
125 |
数据连接已打开,准备传送 |
150 |
文件状态良好,打开数据连接 |
200 |
命令成功 |
202 |
命令未实现 |
211 |
系统状态或系统帮助响应 |
212 |
目录状态 |
213 |
文件状态 |
214 |
帮助信息,信息仅对人类用户有用 |
215 |
名字系统类型 |
220 |
对新用户服务准备好 |
221 |
服务关闭控制连接,可以退出登录 |
225 |
数据连接打开,无传输正在进行 |
226 |
关闭数据连接,请求的文件操作成功 |
227 |
进入被动模式 |
230 |
用户登录 |
250 |
请求的文件操作完成 |
257 |
创建"PATHNAME" |
331 |
用户名正确,需要口令 |
332 |
登录时需要帐户信息 |
350 |
请求的文件操作需要进一步命令 |
421 |
连接用户过多 |
425 |
不能打开数据连接 |
426 |
关闭连接,中止传输 |
450 |
请求的文件操作未执行 |
451 |
中止请求的操作:有本地错误 |
452 |
未执行请求的操作:系统存储空间不足 |
500 |
格式错误,命令不可识别 |
501 |
参数语法错误 |
502 |
命令未实现 |
503 |
命令顺序错误 |
504 |
此参数下的命令功能未实现 |
530 |
账号或密码错误 |
532 |
存储文件需要帐户信息 |
550 |
未执行请求的操作 |
551 |
请求操作中止:页类型未知 |
552 |
请求的文件操作中止,存储分配溢出 |
553 |
未执行请求的操作:文件名不合法 |
因为我们的服务器端ftp家目录/var/ftp/pub这个目录没有权限,只有文件系统权限与ftp权限的交集才是ftp登录用户的权限
使用客户端登录到服务器再验证,如下图:
2、配置本地用户支持上传下载功能,在服务器上创建一个用户,如下图:
查看centos用户信息,如下图:
编辑服务端主配置文件,允许本地用户访问和写入文件,关闭匿名用户访问:
anon_other_write_enable=NO #不允许匿名用户有写入权限 anon_mkdir_write_enable=NO #不允许匿名用户创建目录 anon_upload_enable=NO #不允许匿名用户上传文件 write_enable=YES #开启全局配置有写入权限 local_enable=YES #允许本地用户访问,写入权限需开启全局写入权限 [root@localhost ~]# service vsftpd restart #重启Ftp服务器
使用客户端用centos用户登录到Ftp服务验证,如下图:
使用Windows验证,如下图:
使用匿名用户登录Ftp服务器验证,如下图:
这里我们用本地用户登录到Ftp服务器,还遇到一个问题,用户可以在Ftp服务器随意切换目录,这样对服务器很不安全,如下图:
为了安全我们需要把用户禁锢在自己家目录,只允许访问指定的目录,而其他任何目录都不能访问:
chroot_local_user=YES #开启禁锢目录选项 [root@localhost ~]# service vsftpd restart #重启Ftp服务器
使用本地用户登录到Ftp服务器验证,如下图:
也可以禁止一个用户列表 ,如:
[root@localhost ~]# cat > /etc/vsftpd/chroot_list << EOF > centos #把这几个用户添加到指定文件中 > redhat > suse > EOF
chroot_local_user=NO #如果这项启用,下面chroot_list文件中的用户就可以切换目录,相当于白名单 chroot_list_enable=YES #开启禁锢列表访问 chroot_list_file=/etc/vsftpd/chroot_list #开启禁锢列表文件 [root@localhost ~]# service vsftpd restart #重启Ftp服务器
我们用redhat用户验证,如下图:
我们也可以针对某个用户单独设置权限如限制速率:
修改Ftp服务器主配置文件,加入如下行: user_config_dir=/etc/vsftpd/debian #为指定单独设置用户权限的目录 [root@localhost ~]# useradd debian;echo 123456 | passwd --stdin debian [root@localhost ~]# mkdir /etc/vsftpd/debian #创建存放限制指定用户权限的目录 [root@localhost ~]# cat > /etc/vsftpd/debian/debian << EOF #在指定的目录创建与限制用户权限同名的文件 > local_max_rate=81920 #限制debian用户下载速率为80KB/s > EOF [root@localhost ~]# service vsftpd restart #重启Ftp服务器
验证本地用户debian是否能切换目录及下载速率:
四、配置支持SSL加密传输的Ftp服务器
自己需要建立一台CA服务器,我们就与Ftp服务器在同一台服务器上来实现
1、为服务器生成一个私钥文件如下图:
注释:图中"()"代表只在当前子Shell进程中有效
openssl:生成私钥关键字
genrsa:使用rsa加密方式生成私钥
-out:指定输出文件
ftp.key:指定输出生成私钥的文件名称,文件名可以自己定义
2048:表示生成私钥加密的长度(默认为512)
2、从私钥文件中提取公钥制作一个证书签署请求,如下图:
注释: req:证书申请签名管理
-new:制作证书申请
-key:指定私钥文件
3、为CA服务器生成一个私钥文件,如下图:
4、使用刚生成的私钥为自己再生成一个自签证书,如下图:
注释:-x509:表示制作一个自签证书
-days:表示证书申请后可以使用的天数
3、为Ftp服务器签署证书
4、修改Ftp服务器主配置文件加入如下行:
ssl_enable=YES #是否启用SSL ssl_tlsv1=YES #是否使用TLS v1 ssl_sslv2=YES #是否使用SSl v2 ssl_sslv3=YES #是否使用SSL v3 allow_anon_ssl=NO #是否允许匿名用户使用SSL force_local_data_ssl=YES #百匿名用户传输数据是否加密 force_local_logins_ssl=YES #非匿名用户登录时是否加密 rsa_cert_file/etc/pki/CA/caftp.crt #rsa证书文件位置 rsa_private_key_file=/etc/pki/CA/ftp.key #ftp私钥文件位置 [root@localhost ~]# service vsftpd restart #重启Ftp服务器
5、使用FlashFXP客户端验证,如下图:
打开FlashFXP客户端: 站点-->站点管理
成功连接后,会提示保存证书,点接受并保存.如下图:
测试从Ftp服务器下载数据,如下图:
总结:由于Ftp传输方式是明文的,在互联网上不安全.使用明文很容易被窃取数据.本博客刚好是为了解析明文传输而写的,希望能帮助到大家.谢谢...
本博文到此先告一段落,后续会更新Ftp虚拟用户及Mysql做用户验证.敬请期待...