文件传输协议FTP

	1、File Transfer Protocol 早期的三个应用级协议之一
	2、基于C/S结构
	3、双通道协议:
			数据和命令连接
			数据连接则是从命令决定传输数据开始到数据传输结束,这个连接则关闭了
			客户端发起请求服务端响应、双方正式建立连接。而结束,这是命令连接的正常工作逻辑
			数据连接是临时根据命令需求建立的、根本目的是为了客户端上传数据给服务端
			数据连接谁给打开
					数据连接如果是为服务器端主动去连接客户端的称为主动模式
					由客户端发请求、服务端响应、称为被动模式
					FTP多数都是工作在被动模式下,由客户端发请求来连接服务器
	4、数据传输格式:
			二进制(默认)和文本
	5、两种模式:服务器角度
			主动(PORT style):服务器主动连接
			命令(控制):客户端:随机port --- 服务器:tcp21
			数据:客户端:随机port ---服务器:tcp20
			被动(PASV style):客户端主动连接
			命令(控制):客户端:随机port --- 服务器:tcp21
			数据:客户端:随机port --- 服务器:随机port
	6、服务器被动模式数据端口示例:
			227 Entering Passive Mode (172,16,0,1,224,59)
			服务器数据端口为:224*256+59

FTP软件介绍:

FTP服务器:
	Wu-ftpd,Proftpd,Pureftpd,ServU,IIS
	vsftpd:Very Secure FTP Daemon,CentOS默认FTP服务器
		高速,稳定,下载速度是WU-FTP的两倍
		数据:单机最多可支持15000个并发
客户端软件:
	ftp,lftp,lftpget,wget,curl
	ftp -A ftpserver port -A主动模式 –p 被动模式
	lftp –u username ftpserver
	lftp username@ftpserver
	lftpget ftp://ftpserver/pub/file
	gftp:GUI centos5 最新版2.0.19 (11/30/2008)
	filezilla,CuteFtp,FlashFXP,LeapFtp
	IE ftp://username:password@ftpserver

FTP服务

状态码:
	1XX:	信息 		 125:数据连接打开
	2XX:	成功类状态   200:命令OK 230:登录成功
	3XX:	补充类 		 331:用户名OK
	4XX:	客户端错误 	 425:不能打开数据连接
	5XX:	服务器错误   530:不能登录

用户认证:
	匿名用户:ftp,anonymous,对应Linux用户ftp
	系统用户:Linux用户,用户/etc/passwd,密码/etc/shadow
	虚拟用户:特定服务的专用用户,独立的用户/密码文件
		nsswitch:network service switch名称解析框架
		pam:pluggable authentication module 用户认证
		/lib64/security /etc/pam.d/ /etc/pam.conf

vsftpd服务

1、由vsftpd包提供
2、不再由xinetd管理
3、用户认证配置文件:
		/etc/pam.d/vsftpd
4、服务脚本:
		/usr/lib/systemd/system/vsftpd.service
		/etc/rc.d/init.d/vsftpd
5、配置文件:
		/etc/vsftpd/vsftpd.conf
		man 5 vsftpd.conf
		格式:option=value
		注意:= 前后不要有空格
6、匿名用户(映射为系统用户ftp )共享文件位置:
		/var/ftp
7、系统用户共享文件位置:
		用户家目录
8、虚拟用户共享文件位置:
		为其映射的系统用户的家目录
9、命令端口
		listen_port=21
10、主动模式端口
		connect_from_port_20=YES  主动模式端口为20
		ftp_data_port=20 (默认) 指定主动模式的端口
11、被动模式端口范围
		linux 客户端默认使用被动模式
		windows 客户端默认使用主动模式
		pasv_min_port=6000 0为随机分配
		pasv_max_port=6010
12、使用当地时间
		use_localtime=YES 使用当地时间(默认为NO,使用GMT)
13、匿名用户
		anonymous_enable=YES 		  			支持匿名用户
		no_anon_password=YES(默认NO) 			匿名用户略过口令检查
		anon_world_readable_only (默认YES)		只能下载全部读的文件
		anon_upload_enable=YES 					匿名上传,注意:文件系统权限
		anon_mkdir_write_enable=YES 			匿名建目录
		anon_umask=0333 						指定匿名上传文件的umask,默认077
		anon_other_write_enable=YES 			可删除和修改上传的文件
		chown_uploads=YES(默认NO)   			指定上传文件的默认的所有者和权限
		chown_username=wang
		chown_upload_mode=0644
14、Linux系统用户
		local_enable=YES 			是否允许linux用户登录
		write_enable=YES 			允许linux用户上传文件
		local_umask=022 			指定系统用户上传文件的默认权限
		guest_enable=YES 			所有系统用户都映射成guest用户
		guest_username=ftp 			配合上面选项才生效,指定guest用户
		local_root=/ftproot 		guest用户登录所在目录
15、禁锢所有系统用户在家目录中
		chroot_local_user=YES(默认NO,不禁锢)禁锢系统用户
16、禁锢或不禁锢特定的系统用户在家目录中,与上面设置功能相反
		chroot_list_enable=YES
		chroot_list_file=/etc/vsftpd/chroot_list
		当chroot_local_user=YES时,则chroot_list中用户不禁锢
		当chroot_local_user=NO时,则chroot_list中用户禁锢
17、wu-ftp日志:
		默认启用
			xferlog_enable=YES (默认)启用记录上传下载日志
			xferlog_std_format=YES (默认) 使用wu-ftp日志格式
			xferlog_file=/var/log/xferlog (默认)可自动生成
	vsftpd日志:
		默认不启用
			dual_log_enable=YES 使用vsftpd日志格式,默认不启用
			vsftpd_log_file=/var/log/vsftpd.log(默认)可自动生成
18、登录提示信息
		ftpd_banner="welcome to mage ftp server"
		banner_file=/etc/vsftpd/ftpbanner.txt 优先上面项生效
	目录访问提示信息
		dirmessage_enable=YES (默认)
		message_file=.message(默认) 
		信息存放在指定目录下.message

19、使用pam(Pluggable Authentication Modules)完成用户认证
	pam_service_name=vsftpd
		pam配置文件:/etc/pam.d/vsftpd
		/etc/vsftpd/ftpusers 默认文件中用户拒绝登录
		
	正常情况下,任何一个文件通过网络服务访问时,他应该受控于两个维度
		1、受控于软件本身定义的访问控制规则
		2、受控于文件系统
20、是否启用控制用户登录的列表文件
		userlist_enable=YES 					默认有此设置
		userlist_deny=YES(默认值) 				黑名单,不提示口令,NO为白名单
		userlist_file=/etc/vsftpd/users_list 	此为默认值
	vsftpd服务指定用户身份运行
		nopriv_user=nobody (默认值)

	连接数限制
		max_clients=0 		最大并发连接数
		max_per_ip=0 		每个IP同时发起的最大连接数

	传输速率:字节/秒
		anon_max_rate=0 	匿名用户的最大传输速率
		local_max_rate=0 	本地用户的最大传输速率
	
	连接时间:秒为单位
		connect_timeout=60 				主动模式数据连接超时时长
		accept_timeout=60 				被动模式数据连接超时时长
		data_connection_timeout=300 	数据连接无数据输超时时长
		idle_session_timeout=60 		无命令操作超时时长
	
	优先以文本方式传输
		ascii_upload_enable=YES
		ascii_download_enable=YES

vsftpd匿名用户配置示例

简单示例:只要安装好之后启动服务就可以正常使用ftp
1、安装vsftpd软件
	[root@node6 ~]#yum -y install vsftpd
2、启动vsftpd服务
	[root@node6 ~]#systemctl start vsftpd
3、通过客户端来访问做个简单测试
	[root@node7 ~]#lftp 192.168.137.56
	lftp 192.168.137.56:~> ls              
	drwxr-xr-x    2 0        0               6 Aug 03  2017 pub
	lftp 192.168.137.56:/> cd pub
	lftp 192.168.137.56:/pub> ls
	lftp 192.168.137.56:/pub> ls
	-rw-r--r--    1 0        0              23 Oct 22 12:26 issue
	lftp 192.168.137.56:/pub> lcd /tmp
	lcd ok, local cwd=/tmp
	lftp 192.168.137.56:/pub> mget issue 
	23 bytes transferred
	lftp 192.168.137.56:/pub> bye
	[root@node7 ~]#ls /tmp/
	issue
4、把服务端共享的文件权限改成600
[root@node6 /var/ftp/pub]#chmod 600 issue 
[root@node6 /var/ftp/pub]#ll
total 4
-rw------- 1 root root 23 Oct 22 20:26 issue

5、再次通过客户端连接然后下载此文件
	[root@node7 ~]#lftp 192.168.137.56
	lftp 192.168.137.56:/> cd pub/
	lftp 192.168.137.56:/pub> ls
	-rw-------    1 0        0              23 Oct 22 12:26 issue
	lftp 192.168.137.56:/pub> mget issue 
	mget: Access failed: 550 Failed to open file. (issue)
	lftp 192.168.137.56:/pub> 

配置匿名用户上传、下载、等功能:
	修改配置文件,打开允许匿名用户上传功能
		[root@node6 /etc/vsftpd]#vim vsftpd.conf 
			#anon_upload_enable=YES
			anon_upload_enable=YES

	
	通过客户端验证
		[root@node7 ~]#lftp 192.168.137.56
		lftp 192.168.137.56:~> lcd /etc/
		lcd ok, local cwd=/etc
		lftp 192.168.137.56:~> put fstab
		put: Access failed: 553 Could not create file. (fstab)
		lftp 192.168.137.56:/> 

	正常情况下,ftp的用户anonymous被映射为ftp用户,而默认共享的pub目录属主属组默认为root,而ftp用户被映射为其它用户是没有写权限,所以导致无法上传,建议不要修改pub的权限,最好新建一个目录用来上传

	解决方法:在pub同级目录下新建一个目录专门用来上传,修改目录的所属组和属主权限为ftp
		[root@node6 /var/ftp]#mkdir upload
		[root@node6 /var/ftp]#ls
		pub  upload
		[root@node6 /var/ftp]#ll
		total 0
		drwxr-xr-x 2 root root 19 Oct 22 20:26 pub
		drwxr-xr-x 2 root root  6 Oct 22 20:52 upload
		[root@node6 /var/ftp]#chown -R ftp.ftp upload/
		[root@node6 /var/ftp]#ll -ld  upload/
		drwxr-xr-x 2 ftp ftp 6 Oct 22 20:52 upload/

	再次验证客户端
		[root@node7 ~]#lftp 192.168.137.56/upload
		cd ok, cwd=/upload
		lftp 192.168.137.56:/upload> lcd /etc
		lcd ok, local cwd=/etc
		lftp 192.168.137.56:/upload> put fstab
		595 bytes transferred
		lftp 192.168.137.56:/upload> 
	切换到服务器上查看文件
		[root@node6 /var/ftp]#cd upload/
		[root@node6 /var/ftp]#ls -l upload/
		total 4
		-rw------- 1 ftp ftp 595 Oct 22 20:55 fstab

把上传的文件属主改成别的用户、并修改文件权限:
	编辑配置文件
		[root@node6 /etc/vsftpd]#vim vsftpd.conf 
		#chown_uploads=YES
		#chown_username=whoever
	改为
		chown_uploads=YES
		chown_username=cobbler
		chown_upload_mode=0644

	创建cobbler用户
		[root@node6 /etc/vsftpd]#useradd cobbler
	重启vsftpd服务
		[root@node6 /etc/vsftpd]#systemctl restart vsftpd
	通过客户端验证此举设置是否成功
		[root@node7 ~]#lftp 192.168.137.56/upload
		cd ok, cwd=/upload
		lftp 192.168.137.56:/upload> lcd /etc
		lcd ok, local cwd=/etc
		lftp 192.168.137.56:/upload> put passwd
		1199 bytes transferred
		lftp 192.168.137.56:/upload> ls
	从服务器端查看文件属性
		[root@node6 /var/ftp]#cd upload/
		[root@node6 /var/ftp/upload]#ll
		total 8
		-rw------- 1 ftp     ftp  595 Oct 22 20:55 fstab
		-rw-r--r-- 1 cobbler ftp 1199 Oct 22 21:04 passwd

	在客户端连接到服务器尝试能否建立目录
		lftp 192.168.137.56:/upload> mkdir test
		mkdir: Access failed: 550 Permission denied. (test)
		lftp 192.168.137.56:/upload> rm fstab
		rm: Access failed: 550 Permission denied. (fstab)
		lftp 192.168.137.56:/upload> rm passwd 
		rm: Access failed: 550 Permission denied. (passwd)
		lftp 192.168.137.56:/upload> 
	需要允许匿名用户创建删除文件或者目录需要在服务器的配置文件里面开启如下两项
		[root@node6 /etc/vsftpd]#vim vsftpd.conf 
			anon_mkdir_write_enable=YES
			anon_other_write_enable=YES
	修改完之后重启服务
		[root@node6 /etc/vsftpd]#systemctl restart vsftpd
	在客户端上验证
		[root@node7 ~]#lftp 192.168.137.56/upload
		cd ok, cwd=/upload
		lftp 192.168.137.56:/upload> mkdir test
		mkdir ok, 'test' created
		lftp 192.168.137.56:/upload> ls
		-rw-------    1 14       50            595 Oct 22 12:55 fstab
		-rw-r--r--    1 1000     50           1199 Oct 22 13:04 passwd
		drwx------    2 14       50              6 Oct 22 13:10 test
		lftp 192.168.137.56:/upload> rm fstab 
		rm ok, 'fstab' removed
		lftp 192.168.137.56:/upload> rm passwd 
		rm ok, 'passwd' removed
		lftp 192.168.137.56:/upload> rmdir test
		rmdir ok, 'test' removed
		lftp 192.168.137.56:/upload> ls
		lftp 192.168.137.56:/upload> 

vsftpd匿名用户配置示例

创建一个系统用户,并修改密码
	[root@node6 /etc/vsftpd]#useradd ilinux
	[root@node6 /etc/vsftpd]#echo 123456|passwd --stdin ilinux
	Changing password for user ilinux.
	passwd: all authentication tokens updated successfully.

客户端登录刚刚在服务器端创建的系统用户,登录上来之后显示的是系统用户的名称,而匿名用户没有

	[root@node7 ~]#lftp -u ilinux 192.168.137.56
	Password: 
	lftp ilinux@192.168.137.56:~> ls       
	lftp ilinux@192.168.137.56:~> lcd /etc/
	lcd ok, local cwd=/etc
	lftp ilinux@192.168.137.56:~> put issue
	23 bytes transferred
	lftp ilinux@192.168.137.56:~> ls 
	-rw-r--r--    1 1001     1001           23 Oct 22 13:19 issue
	lftp ilinux@192.168.137.56:~> 

在服务器端ilinux的家目录里面查看从客户端上传上来的文件
每个用户登录ftp之后访问的都是用户的家目录
为什么匿名用户访问的是/var/ftp目录,匿名用户访问的也是家目录,是ftp的家目录
	[root@node6 /var/ftp/upload]#grep "^ftp" /etc/passwd
	ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
	[root@node6 /var/ftp/upload]#ls /home/ilinux/
	issue

系统用户和匿名用户受控方式是不一样的,就算禁止匿名用户上传下载,系统用户不受影响、正常能上传和下载

把系统用户映射为来宾帐号guest

先创建来宾用户和来宾的目录,然后需要把创建的目录去掉写权限要不然通过客户端验证会报错误提示
	[root@node6 /var/ftp/upload]#useradd -d /data/ftproot vsguest
	[root@node6 /var/ftp/upload]#chmod -w /data/ftproot/
	[root@node6 /var/ftp/upload]#ls -ld /data/ftproot/
	dr-x------ 2 vsguest vsguest 62 Oct 22 21:56 /data/ftproot/
	[root@node6 /var/ftp/upload]#chmod +rx !$
	chmod +rx /data/ftproot/
	[root@node6 /var/ftp/upload]#ls -ld /data/ftproot/   
	dr-xr-xr-x 2 vsguest vsguest 62 Oct 22 21:56 /data/ftproot/
	[root@node6 /var/ftp/upload]#
编辑配置文件增加两项选项
	[root@node6 /etc/vsftpd]#vim vsftpd.conf 
	#guest user
	guest_enable=YES
	guest_username=vsguest
重启服务
	[root@node6 /etc/vsftpd]#systemctl restart vsftpd

复制测试文件到来宾目录下,能区分开来是在此目录下
	[root@node6 /etc/vsftpd]#cp /etc/vsftpd/vsftpd.conf /data/ftproot/

在客户端上测试:这里上面说过要把来宾的目录写权限去掉要不然会提示500的错误提示
	[root@node7 ~]#lftp -u ilinux 192.168.137.56
	Password: 
	lftp ilinux@192.168.137.56:~> pwd      
	ftp://ilinux@192.168.137.56
	lftp ilinux@192.168.137.56:~> ls
	ls: Login failed: 500 OOPS: vsftpd: refusing to run with writable root inside chroot()
	lftp ilinux@192.168.137.56:~> ls
	ls: Login failed: 500 OOPS: vsftpd: refusing to run with writable root inside chroot()
	lftp ilinux@192.168.137.56:~> ls
	lftp ilinux@192.168.137.56:/> ls 
	-rw-------    1 0        0            5129 Oct 22 14:00 vsftpd.conf
	lftp ilinux@192.168.137.56:/> 

在服务器上把刚才映射为来宾帐号的那两项注释掉然后再通过客户端测试看是不是回到了它自己的家目录里面

	[root@node6 /etc/vsftpd]#vim vsftpd.conf 
		#guest_enable=YES
		#guest_username=vsguest
重启服务
	[root@node6 /etc/vsftpd]#systemctl restart vsftpd
然后在home下的ilinux目录下查看里面的文件,再通过客户端查看里面的是否和这里的看到的是一样的文件
	[root@node6 /var/ftp/upload]#ls /home/ilinux/
	issue
测试客户端上:
	[root@node7 ~]#lftp -u ilinux 192.168.137.56
	Password: 
	lftp ilinux@192.168.137.56:~> ls       
	-rw-r--r--    1 1001     1001           23 Oct 22 13:19 issue
	lftp ilinux@192.168.137.56:~> 
	lftp ilinux@192.168.137.56:~> cd /etc/      

	一旦允许系统用户登录以后有个悲剧性的问题,它可以随意游荡在整个系统之上,不光是自己的家目录,如果服务器上有敏感信息,这样一来用户登录上去之后直接可以下载造成信息泄露,建议最好用户登录上来之后只能呆在自己的家目录里面,别的目录不让它随意切换                            

禁锢系统用户在家目录中示例:

要禁锢哪个用户确保这个用户的家目录没有写权限,要不然会报错,不让使用
不过禁锢用户不常用
修改配置文件里面的参数
	[root@node6 /etc/vsftpd]#vim vsftpd.conf 

	chroot_list_enable=YES
	chroot_list_file=/etc/vsftpd/chroot_list

新建一个用户
	[root@node6 /etc/vsftpd]#useradd ik8s
	[root@node6 /etc/vsftpd]#echo 123456|passwd --stdin ik8s
	Changing password for user ik8s.
	passwd: all authentication tokens updated successfully.
把用户家目录的写权限去掉
	[root@node6 /etc/vsftpd]#chmod -w /home/ik8s/
创建要禁锢的用户列表
	[root@node6 /etc/vsftpd]#vim /etc/vsftpd/chroot_list
	ik8s
重启服务
	[root@node6 /etc/vsftpd]#systemctl restart vsftpd

客户端测试:
	[root@node7 ~]#lftp -u ilinux,123456 192.168.137.56
	lftp ilinux@192.168.137.56:~> cd /etc/                         
	lftp ilinux@192.168.137.56:/etc> exit
	[root@node7 ~]#lftp -u ik8s,123456 192.168.137.56
	lftp ik8s@192.168.137.56:~> cd /etc
	cd: Access failed: 550 Failed to change directory. (/etc)
	lftp ik8s@192.168.137.56:/> ls
	lftp ik8s@192.168.137.56:/>
白名单示例:
编辑配置文件:
	[root@node6 /etc/vsftpd]#vim vsftpd.conf 
		userlist_enable=YES
		userlist_deny=NO

修改user_list文件添加允许访问的用户
	[root@node6 /etc/vsftpd]#vim user_list
	# vsftpd userlist
	# If userlist_deny=NO, only allow users in this file
	# If userlist_deny=YES (default), never allow users in this file, and
	# do not even prompt for a password.
	# Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers
	#
	#
	# for users that are denied.
	ilinux
	ftp
重启服务
	[root@node6 /etc/vsftpd]#systemctl restart vsftpd

客户端测试:
用一个没有添加到白名单里面的用户登录
	[root@node7 ~]#lftp -u ik8s,123456 192.168.137.56
	lftp ik8s@192.168.137.56:~> ls         
	ls: Login failed: 530 Permission denied.
在白名单列表里面的用户登录测试
	[root@node7 ~]#lftp -u ilinux,123456 192.168.137.56
	lftp ilinux@192.168.137.56:~> ls
	-rw-r--r--    1 1001     1001           23 Oct 22 13:19 issue
	lftp ilinux@192.168.137.56:~> 

vsftpd虚拟用户

虚拟用户:
	所有虚拟用户会统一映射为一个指定的系统帐号:访问共享位置,即为此系统帐号的家目录
	各虚拟用户可被赋予不同的访问权限,通过匿名用户的权限控制参数进行指定

虚拟用户帐号的存储方式:
	文件:
		编辑文本文件,此文件需要被编码为hash格式
		奇数行为用户名,偶数行为密码
		db_load -T -t hash -f vusers.txt vusers.db
	关系型数据库中的表中:
		实时查询数据库完成用户认证
	mysql库:
		pam要依赖于pam-mysql
		/lib64/security/pam_mysql.so
		/usr/share/doc/pam_mysql-0.7/README

基于文件验证的vsftp虚拟用户示例

创建虚拟用户列表:
	[root@node6 /etc/vsftpd]#vim vsguests.txt
	tom
	123456
	jerry
	123456
	trump
	123456
把用户列表的文件转换成vsftp的db格式
	[root@node6 /etc/vsftpd]#db_load -T -t hash -f vsguests.txt vsguests.db

创建目录和映射虚拟用户的用户
	[root@node6 /var/ftp/upload]#useradd -d /data/ftproot vsguest
	[root@node6 /etc/vsftpd]#mkdir /data/ftproot/{upload,pub}

修改upload的所属组
	[root@node6 /data/ftproot]#chown vsguest.vsguest upload/

创建Pam的认证配置文件
	[root@node6 /etc/pam.d]#vim vsftpd.virt
	auth required pam_userdb.so db=/etc/vsftpd/vsguests
	account required pam_userdb.so db=/etc/vsftpd/vsguests

修改vsftpd.conf配置文件
	[root@node6 /etc/vsftpd]#vim vsftpd.conf 
	guest_enable=YES
	guest_username=vsguest
	local_enable=YES
	write_enable=YES
	pam_service_name=vsftpd.virt  # 自定义的pam认证配置文件

	#把之前设置允许匿名用户上传、创建等权限给注释掉
	#anon_mkdir_write_enable=YES  
	#anon_other_write_enable=YES
	#anon_upload_enable=YES

给每个虚拟用户创建独立的配置文件
在主配置文件里定义每个虚拟用户的存放路径
	[root@node6 /etc/vsftpd]#vim vsftpd.conf 
		user_config_dir=/etc/vsftpd/vsguests
创建出相对应的目录
	[root@node6 /etc/vsftpd]#mkdir /etc/vsftpd/vsguests
重启服务
	[root@node6 /etc/vsftpd]#systemctl  restart vsftpd

在没有给每个虚拟用户账号给定权限前测试用户能否可以上传
	[root@node7 ~]#lftp -u tom,123456 192.168.137.56
	lftp tom@192.168.137.56:~> ls
	drwxr-xr-x    2 0        0               6 Oct 23 02:12 pub
	drwxr-xr-x    2 1002     1002            6 Oct 23 02:12 upload
	-rw-------    1 0        0            5129 Oct 22 14:00 vsftpd.conf
	lftp tom@192.168.137.56:/> cd upload/
	lftp tom@192.168.137.56:/upload> lcd /etc/
	lcd ok, local cwd=/etc
	lftp tom@192.168.137.56:/upload> put issue
	put: Access failed: 550 Permission denied. (issue)
	lftp tom@192.168.137.56:/upload> 

配置每个虚拟用户的权限
	给tom用户定义权限
	[root@node6 /etc/vsftpd/vsguests]#vim tom
	anon_upload_enable=YES
	给Jerry用户定义权限
	[root@node6 /etc/vsftpd/vsguests]#vim jerry
	anon_upload_enable=YES
	anon_mkdir_write_enable=YES
	anon_other_write_enable=YES

重启服务:
	[root@node6 /etc/vsftpd/vsguests]#systemctl  restart vsftpd

客户端测试
	1、先测试Jerry用户
	[root@node7 ~]#lftp -u jerry,123456 192.168.137.56
	lftp jerry@192.168.137.56:/> lcd /etc/
	lcd ok, local cwd=/etc
	lftp jerry@192.168.137.56:/> cd upload/
	lftp jerry@192.168.137.56:/upload> put issue
	23 bytes transferred                                     
	lftp jerry@192.168.137.56:/upload> ls
	-rw-r--r--    1 1000     1002           23 Oct 23 02:33 issue
	lftp jerry@192.168.137.56:/upload> rm issue 
	rm ok, `issue' removed
	lftp jerry@192.168.137.56:/upload> ls
	lftp jerry@192.168.137.56:/upload> 
	2、测试Tom用户
	[root@node7 ~]#lftp -u tom,123456 192.168.137.56     
	lftp tom@192.168.137.56:~> lcd /etc
	lcd ok, local cwd=/etc
	lftp tom@192.168.137.56:~> cd upload/
	lftp tom@192.168.137.56:/upload> ls
	lftp tom@192.168.137.56:/upload> put issue
	23 bytes transferred
	lftp tom@192.168.137.56:/upload> rm issue 
	rm: Access failed: 550 Permission denied. (issue)
	lftp tom@192.168.137.56:/upload> mkdir test
	mkdir: Access failed: 550 Permission denied. (test)
	lftp tom@192.168.137.56:/upload> 

基于MYSQL验证的vsftpd虚拟用户

安装数据库软件
	[root@node6 ~]#yum -y install mariadb-server
在mariadb配置文件里面添加一条禁止反解域名的选项
	[root@node6 ~]#vim /etc/my.cnf
	[mysqld]
	skip_name_resolve=on

启动数据库服务
	[root@node6 ~]#systemctl start mariadb

编译pam、mysql的模块
	先安装编译环境
	[root@node6 ~]#yum -y groupinstall "Development tools"
	[root@node6 ~]#yum -y install mariadb-devel pam-devel

	[root@node6 ~]#tar xf pam_mysql-0.7RC1.tar.gz 
	[root@node6 ~]#cd pam_mysql-0.7RC1
	[root@node6 ~/pam_mysql-0.7RC1]#./configure \
	--with-pam-mods-dir=/lib64/security \
	--with-mysql=/usr --with-pam=/usr
	[root@node6 ~/pam_mysql-0.7RC1]#make -j 2 && make install

查看是否有mysql模块
	[root@node6 ~/pam_mysql-0.7RC1]#ls /lib64/security/
	pam_access.so     pam_filter        pam_mail.so        pam_rootok.so          pam_timestamp.so
	pam_cap.so        pam_filter.so     pam_mkhomedir.so   pam_securetty.so       pam_tty_audit.so
	pam_chroot.so     pam_fprintd.so    pam_motd.so        pam_selinux_permit.so  pam_umask.so
	pam_console.so    pam_ftp.so        pam_mysql.la       pam_selinux.so         pam_unix_acct.so
	pam_cracklib.so   pam_group.so      pam_mysql.so 
创建基于mysql认证的pam配置文件
	[root@node6 ~vim /etc/pam.d/vsftpd.mysql
	auth required pam_mysql.so user=vsftp passwd=magedu host=localhost db=vsftpd table=users u
	sercolumn=name passwdcolumn=password crypt=2
	account required pam_mysql.so user=vsftp passwd=magedu host=localhost db=vsftpd table=user
	s usercolumn=name passwdcolumn=password crypt=2

在数据库里面创建库和表并且授权
	MariaDB [(none)]> create database vsftpd;
	Query OK, 1 row affected (0.01 sec)
	MariaDB [(none)]> use vsftpd
	Database changed
	MariaDB [vsftpd]> create table users(name varchar(100) not null primary key, password char(48) not null);

	MariaDB [vsftpd]> grant all on vsftpd.* to 'vsftp'@'localhost' identified by 'magedu';
	Query OK, 0 rows affected (0.00 sec)

	MariaDB [vsftpd]> grant all on vsftpd.* to 'vsftp'@'127.0.0.1' identified by 'magedu';    
	Query OK, 0 rows affected (0.00 sec)

	MariaDB [vsftpd]> flush privileges;
	Query OK, 0 rows affected (0.00 sec)

插入3个虚拟用户信息
	MariaDB [vsftpd]> insert into users values('tom',password('123456')),('jerry',password(123456)),('turmp',password('123456'));
	Query OK, 3 rows affected (0.00 sec)
	Records: 3  Duplicates: 0  Warnings: 0

修改vsftpd的主配置文件
把这项改了之前实验是从文件中查找用户,这次改成从数据库中找
	[root@node6 ~]#vim /etc/vsftpd/vsftpd.conf 
	pam_service_name=vsftpd.mysql
重启服务
	[root@node6 ~]#systemctl restart vsftpd

客户端测试:
	tom用户
	[root@node7 ~]#lftp -u tom,123456 192.168.137.56
	lftp tom@192.168.137.56:/> cd upload/
	lftp tom@192.168.137.56:/upload> lcd /etc/
	lcd ok, local cwd=/etc
	lftp tom@192.168.137.56:/upload> put passwd
	1257 bytes transferred                             
	lftp tom@192.168.137.56:/upload> ls
	-rw-r--r--    1 1000     1002           23 Oct 23 02:34 issue
	-rw-r--r--    1 1000     1002         1257 Oct 23 03:15 passwd
	lftp tom@192.168.137.56:/upload> rm issue 
	rm: Access failed: 550 Permission denied. (issue)
	lftp tom@192.168.137.56:/upload> 

	jerry用户
	[root@node7 ~]#lftp -u jerry,123456 192.168.137.56   
	lftp jerry@192.168.137.56:~> cd upload/                        
	lftp jerry@192.168.137.56:/upload> ls
	-rw-r--r--    1 1000     1002           23 Oct 23 02:34 issue
	-rw-r--r--    1 1000     1002         1257 Oct 23 03:15 passwd
	lftp jerry@192.168.137.56:/upload> rm issue 
	rm ok, 'issue' removed
	lftp jerry@192.168.137.56:/upload> rm passwd 
	rm ok, 'passwd' removed
	lftp jerry@192.168.137.56:/upload> ls
	lftp jerry@192.168.137.56:/upload>