网络服务-VSFTP

网络服务-VSFTP

VSFTP概述

	'FTP' 是File Transfer Protocol('文件传输协议')的英文简称,用于Internet上的文件的'双向传输'。使用 FTP 来传输时,是具有一定程度的危险性, 因为数据在因特网上面是完全没有受到保护的'明文传输方式'!
	VSFTP是一个基于GPL发布的类Unix系统上使用的FTP服务器软件,它的全称是Very Secure FTP,从名称定义上基本可以看出,这是为了'解决ftp传输安全性问题的'。

安全特性

1. vsftp程序的运行者一般是普通用户,降低了相对应进程的权限,提高了安全性
2. 任何需要执行较高权限的指令都需要上层程序许可
3. ftp所需要使用的绝大多数命令都被整合到了vsftp中,基本不需要系统额外提供命令
4. 拥有chroot功能,可以改变用户的根目录,限制用户只能在自己的家目录

VSFTP连接类型

1.控制连接(持续连接)→	TCP 21(命令信道) → 用户收发FTP命令	(默认开启,处监听状态)
2.数据连接(按需连接) → TCP 20(数据信道) → 用于上传下载数据	(按需开启)

VSFTP工作模式

主动模式(Port)

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

被动模式(Passive)

网络服务-VSFTP
	FTP 客户端首先和服务器的TCP 21端口建立连接,用来建立控制通道发送命令,但建立连接后客户端发送Pasv命令。服务器收到Pasv命令后,打开一个临时端口(端口大于1023小于65535)并且通知客户端在这个端口上传送数据的请求,客户端连接FTP服务器的临时端口,然后FTP服务器将通过这个端口传输数据。
	注意:由于VSFTP的被动模式是随机端口进行数据传输,所以在设置防火墙时需要刻意放行。

主被动模式比较

	FTP的两种模式主动模式所使用的端口是20和21端口,而被动模式中,默认开放的是大于1023的端口和21端口,相比而言被动模式更加安全,但是如果只是简单的文件共享,不考虑安全性则可以直接选用主动模式。其次被动模式还有一个非常麻烦的地方,由于需要开放大量的端口,在使用防火墙进行端口过滤及保护时就异常麻烦,一般使用被动模式时都会选定一个端口范围作为被动模式所需端口。
	注意:VSFTP默认两种模式都支持,最终绝对使用哪种模式很多时候取决于所使用的的FTP客户端工具,当然也可以在服务器端的配置文件禁止掉某一种模式,强行使用另外一种。

VSFTP传输模式

	'Binary模式':不对数据进行任何处理,适合进行可执行文件、压缩文件、图片等(二进制文件,不能修改的文件)
	'ASCII模式':进行文本传输时,自动适应目标操作系统的结束符,如回车符等 
	Linux的红帽发行版中VSFTP默认采用的是Binary模式,这样能保证绝大多数文件传输后能正常使用
	切换方式:在ftp>提示符下输入ascii即转换到ACSII方式,输入bin,即转换到Binary方式。

VSFTP软件信息

服务端软件名:vsftpd 
客户端软件名:ftp
服务名:vsftpd
端口号:20、21、指定范围内随机端口
配置文件:/etc/vsftpd/vsftpd.conf

登录验证方式

1.匿名用户验证
2.本地用户验证
3.虚拟(virtual)用户验证

匿名用户验证

安装VSFTP,并开机自启

# 关闭防火墙、selinux。
$ yum -y install vsftpd
$ chkconfig vsftpd on
$ service vsftpd start

实现可上传

# 在客户端登录后,默认情况下是可以下载的,但不能上传
# 取消注释,启用匿名访问
$ vim /etc/vsftp/vsftp.conf
	anon_upload_enable=YES # 启用匿名访问
# 在/var/ftp/下创建上传目录,并添加让匿名用户有写入权限
$ cd /var/ftp/
$ mkdir upload
$ setfacl -m u:ftp:rwx upload/
# 客户端测试,只有在upload目录下才可以上传文件

实现上传的文件可下载

# 默认情况下开放上传权限后,上传的文件是无法被下载的,因为文件的其他人位置没有r权限
# 可以让上传的文件其他人位置拥有r权限,然后才能被其他人下载,手动添加
$ vim  /etc/vsftpd/vsftpd.conf
	anon_umask=022  
# 重启服务器服务,客户端断开连接重连
# put 上传,get 下载上传文件,测试

实现创建目录和文件其他操作

$ vim /etc/vsftpd/vsftpd.conf
	anon_mkdir_write_enable=YES # 允许创建目录      
	anon_other_write_enable=YES # 开放其他写入权(删除、覆盖、重命名)
# 服务器重启服务,客户端重新连接,进行创建目录、删除目录、覆盖、改名测试
	delete 删除  rename 改名 rmdir删除目录

用户进入某个文件夹时,弹出相应的说明

# 在对应目录下创建 .message 文件,并写入相应内容
 cd /var/ftp/upload
 vim  .message ===>welcome to bei
# 确认dirmessage_enable=YES是否启用
$ vim /etc/vsftpd/vsftpd.conf
	dirmessage_enable=YES
# 重启服务器,客户端尝试却换目录查看效果(同一次登录仅提示一次)
$ service  vsdtpd  restart

本地用户验证实验

服务端需要创建用户并设置密码

$ useradd  -s  /sbin/nologin wyy
$ passwd wyy

将所有用户禁锢在自己的家目录下

# 默认没有禁锢用户时,客户端登录后可以随意切换目录,查看文件所在位置和文件名
# 开启用户家目录限制,限制所有用户不能随便切换目录
$ vim /etc/vsftp/vsftp.conf
	chroot_list_enable=YES # 取消注释
# 测试机测试,登陆wyy  输入密码后,尝试切换目录失败!

# 开启白名单功能,允许白名单中的用户随意切换目录
	chroot_list_enable=YES 
# 白名单文件所在位置(需自己创建)手动添加白名单用户
	chroot_list_file=/etc/vsftpd/chroot_list
# 添加允许切换目录的本地账户
	$ vim  /etc/vsftpd/chroot_list ==>写入wyy
# 使用客户端测试,切换目录成功

黑名单和白名单

$ vim /etc/vsftpd/vsftpd.conf
	# 黑名单机制
	userlist_enable=YES
	userlist_deny=YES	# 禁止/etc/vsftpd/user_list文件中出现的用户名登录FTP 
# 登录wyy测试,结果不允许登录
	# 白名单机制
	 userlist_enable=YES
	 userlist_deny=NO # 仅允许/etc/vsftpd/user_list文件中出现的用户名登录FTP
# 添加一个用户wyy1,将wyy用户写入名单 测试 。wyy 允许登陆;而wyy1 不允许登陆!

配置文件:/etc/vsftpd/ftpusers

# 所有写入此文件内的用户名都不允许登录ftp,立刻生效。        
# 注意:此配置文件的优先级高于黑白名单
# 将wyy 也写入,发现无法登陆,且失败的原因和黑白名单的机制不一致!

修改被动模式数据传输使用端口

$ vim /etc/vsftpd/vsftpd.conf # 主配置文件,最下方添加
	pasv_enable=YES
	pasv_min_port=30000
	pasv_max_port=35000

虚拟用户验证实验

服务器安装

# 并设置开机自启,以及启动
$ yum -y install vsftpd	
$ chkconfig vsftpd on
$ service vsftpd start

建立FTP的虚拟用户的用户数据库文件

# 注:该文件名可以随便定义,文件内容格式:奇数行用户,偶数行密码
$ cd /etc/vsftpd
$ vim vsftpd.user
	a1
	123456
	a2
	123456 
	a3 
	123456
# 注意此处的用户是 /etc/vsftpd/dir/ 下的配置文件同名

将用户密码的存放文本转化为数据库类型,并使用hash加密

$ db_load  -T  -t  hash  -f  vsftpd.user  vsftpd.db
	-T指定转化为数据库文件
	-t指定加密类型
	-f指定转化的源文件
# 注意此处的vsftpd.db  决定了 db=文件位置

修改文件权限为600,保证其安全性

$ chmod 600 vsftpd.db

创建FTP虚拟用户的映射用户,并制定其用户家目录

$ useradd  -d  /var/ftproot  -s  /sbin/nologin  virtual
# 创建virtual 用户作为ftp的虚拟用户的映射用户 

建立支持虚拟用户的PAM认证文件,添加虚拟用户支持

$ cd /etc/pam.d
$ cp -a vsftpd vsftpd.pam
# 使用模板生成自己的认证配置文件,方便一会调用vim 

编辑新生成的文件vsftpd.pam

$ vim vsftpd.pam # 清空原来内容,添加下列两行
auth       required     pam_userdb.so  db=/etc/vsftpd/vsftpd
account    required     pam_userdb.so  db=/etc/vsftpd/vsftpd
登录认证方式   选项调用的文件	db=数据库的位置	db=/etc/vsftpd/vsftpd相当于db=/etc/vsftpd/vsftpd.db

在/etc/vsftpd/vsftpd.conf文件中添加支持配置

$ vim /etc/vsftpd/vsftpd.conf 
	pam_service_name=vsftpd.pam # 修改 注意:此处是相对路径
# 添加
	guest_enable=YES
   guest_username=virtual #注意:此处的virtual 指的是映射用户名
   user_config_dir=/etc/vsftpd/dir # 注意:此处的/etc/vsftpd/dir 指的是配置目录,需要单独创建
# 注视到 anonymous_enabale=YES

创建虚拟用户的配置文件实现相应功能测试

# 创建mkdir dir目录
$ cd /etc/vsftpd
$ mkdir dir
# 进入dir目录,创建a1用户,并设置,允许上传、下载
$ cd dir
$ vim a1
	anon_upload_enable=YES      #允许上传
	anon_umask=022           #允许下载
# 创建a2用户,并设置,允许创建目录
$ vim a2
	anon_mkdir_write_enable=YES #允许创建目录
# 创建a3用户,并设置,允许上传文件、允许重名和删除文件、覆盖
$ vim a3
	anon_upload_enable=YES #允许上传文件(为了覆盖开启的)
	anon_other_write_enable=YES #允许重名和删除文件、覆盖

需要读取时设置。给映射用户的家目录 设置 o+r 让虚拟用户有读权限

$ chmod o+r /var/ftproot

重启vsftpd服务,登录用户测试

$ servcice vsftpd restart

使用tcpdump 工具进行指定端口抓包,抓取ftp登录过程中的数据包

tcpdump -i eth0 -nn -X -vv tcp port 21 and ip host 来源ip
	-i #interface:指定tcpdump需要监听的接口
	-n #对地址以数字方式显式,否则显式为主机名
	-nn #除了-n的作用外,还把端口显示为数值,否则显示端口服务名
	-X #输出包的头部数据,会以16进制和ASCII两种方式同时输出
	-vv #产生更详细的输出
	ip host 指的是数据包来自于哪个客户端

openssl+vsftpd加密验证方式:

查看是否安装了openssl

$ rpm -q openssl

查看vsftpd 是否支持openssl

$ ldd /usr/sbin/vsftpd  |  grep libssl

生成加密信息的秘钥和证书文件

$ cd /etc/ssl/certs/
$ openssl genrsa -out vsftpd.key 1024 #建立服务器私钥,生成RSA密钥
$ openssl req -new -key vsftpd.key -out vsftpd.csr #需要依次输入国家,地区,城市,组织,组织单位,Email等信息。最重要的是有一个common name,可以写你的名字或者域名。如果为了https申请,这个必须和域名吻合,否则会引发浏览器警报。生成的csr文件交给CA签名后形成服务端自己的证书
$ openssl x509 -req -days 365 -sha256 -in vsftpd.csr -signkey vsftpd.key -out vsftpd.crt #使用CA服务器签发证书,设置证书的有效期等信息
# 注意1:生成完秘钥和证书文件后,将本目录{/etc/ssl/certs/}的权限修改为500.
$ chmod 500 /etc/ssl/certs/

修改主配置文件

# 新建标签添加即可
ssl_enable=YES
#是否启用ssl认证

ssl_tlsv1=YES
ssl_sslv2=YES
ssl_sslv3=YES
#开启tlsv1、sslv2、sslv3都支持

allow_anon_ssl=YES
#允许匿名用户{虚拟用户}

force_anon_logins_ssl=YES
force_anon_data_ssl=YES
#匿名登录和传输时强制使用ssl

#force_local_logins_ssl=YES
#force_local_data_ssl=YES
#本地登录和传输时强制使用ssl

rsa_cert_file=/etc/ssl/certs/vsftpd.crt
#rsa格式的证书

rsa_private_key_file=/etc/ssl/certs/vsftpd.key
#rsa格式的密钥
注:密钥文件要在配置文件中单独声明(写入配置文件时,注释要单独一行,否则会报错)

重启服务

$ service vsftpd restart

测试(使用第三方客户端连接)

FileZilla-FTP(第三方客户端工具)

连接测试时选择:

服务器类型:显式 TLS/SSL

登录类型: 一般或匿名

网络服务-VSFTP

上一篇:Linux网络服务之常规vsFTP服务配置(超级详细图解一步骤一图)


下一篇:xinetd.d配置格式