FTP服务
DAS、SAN 、NAS
存储基础知识---存储网络
直接存储(Direct Attached Storage)
存储设备与主机的紧密相连
•管理成本较低,实施简单 •储时直接依附在服务器上,因此存储共享受到限制 •CPU必须同时完成磁盘存取和应用运行的双重任务,所以不利于CPU的指令周期的优化,增加系统负担
网络连接存储(Network Attached Storage)
通过局域网在多个文件服务器之间实现了互联,基于文件的协议( FTP、NFS、SMB/CIFS等 ),实现文件共享
•集中管理数据,从而释放带宽、提高性能 •可提供跨平台文件共享功能 •可靠性较差,适用于局域网或较小的网络
存储区域网络(Storage Area Networks,SAN)
利用高速的光纤网络链接服务器与存储设备,基于SCSI,IP,ATM等多种高级协议,实现存储共享
•服务器跟储存装置两者各司其职 •利用光纤信道来传输数据﹐以达到一个服务器与储存装置之间多对多的高效能、高稳定度的存储环境 •实施复杂,管理成本高
文件传输协议FTP
File Transfer Protocol 早期的三个应用级协议之一 基于C/S结构 双通道协议:数据和命令连接 数据传输格式:二进制(默认)和文本
两种模式:服务器角度
主动(PORT style):服务器主动连接
命令(控制):客户端:随机port --- 服务器:tcp21 数据:客户端:随机port ---服务器:tcp20
原理:服务器端一开始监听的是TCP21端口,服务端主动连接客户端,将数据传送给客户端,此时服务器端打开TCP20端口号,但是在连接过程中,服务器不知道客户端端口是多少,客户端会主动连接服务端的端口号tcp21端口,发起一个命令通道(YYYY端口),告诉服务端,客户端的端口号是YYYY随机端口,此时服务端就可以通过YYYY随机端口来连接客户端,如果客户端有防火墙,客户端连接服务端可以,但是服务端直接连接客户端传输数据,就会被防火墙阻挡,无法传输。
被动(PASV style):客户端主动连接
命令(控制):客户端:随机port --- 服务器:tcp21 数据:客户端:随机port ---服务器:随机port
原理:服务端默认打开监听端口TCP21端口号,客户端配置TCP21端口主动去连接服务端的防火墙打开的tcp21端口,并通过命令通道发起一个YYYY的随机端口,此时服务器端的防火墙要有连接跟踪功能(link track),会分析客户端发起TFP协议,可以分析出命令通道的YYYY端口,进而服务端的防火墙会对应打开YYYY随机端口。
服务器被动模式数据端口示例:
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的两倍 ftp.redhat.com数据:单机最多可支持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
FTP命令常见选项:
-d:详细显示指令执行过程,便于排错或分析程序执行的情况; -i:关闭互动模式,不询问任何问题; -g:关闭本地主机文件名称支持特殊字符的扩充特性; -n:不使用自动登录; -v:显示指令执行过程。
实例:
FTP>ascii: 设定以ASCII方式传送文件(缺省值) FTP>bell: 每完成一次文件传送,报警提示. FTP>binary: 设定以二进制方式传送文件. FTP>bye: 终止主机FTP进程,并退出FTP管理方式. FTP>case: 当为ON时,用MGET命令拷贝的文件名到本地机器中,全部转换为小写字母. FTP>cd: 同UNIX的CD命令. FTP>cdup: 返回上一级目录. FTP>chmod: 改变远端主机的文件权限. FTP>close: 终止远端的FTP进程,返回到FTP命令状态, 所有的宏定义都被删除. FTP>delete: 删除远端主机中的文件. FTP>dir [remote-directory] [local-file] 列出当前远端主机目录中的文件.如果有本地文件,就将结果写至本地文件. FTP>get [remote-file] [local-file] 从远端主机中传送至本地主机中. FTP>help [command] 输出命令的解释. FTP>lcd: 改变当前本地主机的工作目录,如果缺省,就转到当前用户的HOME目录. FTP>ls [remote-directory] [local-file] 同DIR. FTP>macdef: 定义宏命令. FTP>mdelete [remote-files] 删除一批文件. FTP>mget [remote-files] 从远端主机接收一批文件至本地主机. FTP>mkdir directory-name 在远端主机中建立目录. FTP>mput local-files 将本地主机中一批文件传送至远端主机. FTP>open host [port] 重新建立一个新的连接. FTP>prompt: 交互提示模式. FTP>put local-file [remote-file] 将本地一个文件传送至远端主机中. FTP>pwd: 列出当前远端主机目录. FTP>quit: 同BYE. FTP>recv remote-file [local-file] 同GET. FTP>rename [from] [to] 改变远端主机中的文件名. FTP>rmdir directory-name 删除远端主机中的目录. FTP>send local-file [remote-file] 同PUT. FTP>status: 显示当前FTP的状态. FTP>system: 显示远端主机系统类型. FTP>user user-name [password] [account] 重新以别的用户名登录远端主机. FTP>? [command]: 同HELP. [command]指定需要帮助的命令名称。如果没有指定 command,ftp 将显示全部命令的列表。 FTP>! 从 ftp 子系统退出到外壳。
vsftpd服务
由vsftpd包提供 默认是21端口
不再由xinetd管理
用户认证配置文件:/etc/pam.d/vsftpd
服务脚本:
/usr/lib/systemd/system/vsftpd.service /etc/rc.d/init.d/vsftpd
配置文件:
/etc/vsftpd/vsftpd.conf man 5 vsftpd.conf
格式:option=value
注意:= 前后不要有空格
匿名用户(映射为系统用户ftp )共享文件位置:/var/ftp 系统用户共享文件位置:用户家目录 虚拟用户共享文件位置:为其映射的系统用户的家目录
vsftp服务配置
(1)备份配置文件
[root@centos7~]#cd /etc/vsftpd [root@centos7vsftpd]#ls ftpusers user_list vsftpd.conf vsftpd_conf_migrate.sh [root@centos7vsftpd]#cp vsftpd.conf{,.bak} [root@centos7vsftpd]#ls ftpusers user_list vsftpd.conf vsftpd.conf.bak vsftpd_conf_migrate.sh
(2)vsftp服务默认未监听端口,可以在最底部加入指定的端口号 默认端口号是21
vim /etc/vsftpd/vsftpd.conf
(3)重启vsftpd服务,可以查看此时的端口号已经修改了,ss -nlt
[root@centos7vsftpd]#systemctl restart vsftpd
(4)连接服务端的ftp时,不需要输入-p选项
ftp 192.168.34.101 2121
命令端口
listen_port=21
主动模式端口
connect_from_port_20=YES 主动模式端口为20 ftp_data_port=20 (默认) 指定主动模式的端口
被动模式端口范围
linux 客户端默认使用被动模式 windows 客户端默认使用主动模式 pasv_min_port=6000 0为随机分配 pasv_max_port=6010
使用当地时间
use_localtime=YES 使用当地时间(默认为NO,使用GMT)
匿名用户
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
实验:各参数配置详解
A主机:192.168.34.100 (客户端,ftp)
B主机:192.168.34.101 (服务端,vsftp)
(1)在A主机安装客户端
yum install ftp -y
(2)在B主机安装服务端
yum install vsftpd -y systemctl start vsftpd
(3)在B主机指定的目录下新建一个文件(/var/ftp/pub/目录下)
[root@centos7~]#cd /var/ftp/pub [root@centos7pub]#ls [root@centos7pub]#cp /etc/fstab f1 [root@centos7pub]#ls f1 [root@centos7pub]#cp /etc/fstab f2 [root@centos7pub]#ls f1 f2
(4)在A主机FTP客户端现在f1文件,此时可以看到我们是在data目录下,连接的ftp服务器端,此时下载下来的文件就会在data目录下
在A主机上查看data目录下下载的数据
如果多个用户想连接vsftp服务器去下载文件,需要加入以下配置,否则无法分配多个端口号,多个用户无法下载
vim /etc/vsftpd/vsftpd.conf pasv_min_port=6000 0为随机分配 pasv_max_port=6010
在B主机(服务端)vim /etc/vsftpd/vsftpd.conf底部写入本机内容
(1)略过口令检查,使用当地时间,当地时间默认加8小时
(2)修改完配置之后重启vsftpd服务:systemctl restart vsftpd
linux客户端文件时间是正确的,而windows客户端的文件时间就再往后加8小时
(3)不允许匿名登录
vim /etc/vsftpd/vsftpd.conf
重启vsftpd服务:systemctl restart vsftpd
此时匿名无法登录,可以使用服务端的用户账号登录
anon_upload_enable=YES 匿名上传,注意:文件系统权限
(1)在B主机(服务端)修改vsftpd配置文件,注释去掉,并重启vsftpd服务
vim /etc/vsftpd/vsftpd.conf 修改配置文件
systemctl restart vsftpd 重启vsftpd服务
(2)在B主机(服务端)创建一个目录,并赋予指定用户一个读写执行权限
[root@centos7pub]#systemctl restart vsftpd [root@centos7pub]#mkdir /var/ftp/upload [root@centos7pub]#ll -d /var/ftp/upload/ drwxr-xr-x 2 root root 6 Dec 2 16:23 /var/ftp/upload/ [root@centos7pub]#setfacl -m u:ftp:rwx /var/ftp/upload/
(3)在A主机(客户端)登录vsftpd服务,并上传文件到upload目录下
可以看到此时上传的用户名是ftp文件
anon_umask=0333 指定匿名上传文件的umask,默认077
(1)修改B主机(服务端)配置文件内容,指定新建的文件权限
vim /etc/vsftpd/vsftpd.conf anon_umask=0333
(2)在A主机(客户端)连接ftp服务,可以下载新建的文件444权限的文件f1,不能下载f2文件
anon_other_write_enable=YES 可删除和修改上传的文件
(1)在B主机(服务端)修改vsftpd服务配置文件
[root@centos7pub]#vm /etc/vsftpd/vsftpd.conf anon_other_write_enable=YES [root@centos7pub]#systemctl restart vsftpd 重启服务
此时就可以删除之前新建的文件,由于都是匿名登陆,尽量不要赋予此权限。
指定上传文件的默认的所有者和权限
在B主机vsftpd服务修改配置文件,并重启vsftpd服务,下载的文件就会指定自定义的信息
vim /etc/vsftpd/vsftpd.conf chown_uploads=YES chown_username=wang chown_upload_mode=0644
Linux系统用户
local_enable=YES 是否允许linux用户登录 write_enable=YES 允许linux用户上传文件 local_umask=022 指定系统用户上传文件的默认权限
vim /etc/vsftpd/vsftpd.conf,将所有的用户ftp切换到/ftproot目录下,用户的根不能有写权限,有写权限无法登录
guest_enable=YES 所有系统用户都映射成guest用户 guest_username=ftp 配合上面选项才生效,指定guest用户 local_root=/ftproot guest 用户登录所在目录 anonymous_enable=no 不允许匿名登录
在B主机服务器新建一个目录/ftproot
[root@centos7ftproot]#mkdir /ftproot
此时登录ftp服务,才可以登录
如果此时将B主机服务器端的/ftproot目录权限改为777,就无法登录
给ftp用户设置读写执行权限也无法登录
[root@centos7ftproot]#setfacl -m u:ftp:rwx /ftproot
此时在A主机客户端就无法登录
总结:用户的根不能有写权限,有写权限无法登录
禁锢所有系统用户在家目录中
chroot_local_user=YES(默认NO,不禁锢)禁锢系统用户
(1)在vsftpd服务端修改配置文件,取消注释此行
vim /etc/vsftpd/vsftpd.conf
重启vsftpd服务:systemctl restart vsftpd
(2) 此时在A主机登陆失败,需要修改家目录用户权限
(3)去掉家目录liu用户的写权限,就可以登录ftp服务
[root@centos7~]#ll /home/ total 0 drwx------. 3 liu liu 78 Apr 11 2018 liu [root@centos7~]#chmod -w /home/liu
在B主机新建一个文件f1
通过liu用户登录成功界面:
禁锢或不禁锢特定的系统用户在家目录中,与上面设置功能相反,当chroot_local_user=YES启用白名单
vim /etc/vsftpd/vsftpd.conf
chroot_local_user=YES chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list 当chroot_local_user=YES时,则chroot_list中用户不禁锢 当chroot_local_user=NO时,则chroot_list中用户禁锢
(1)修改vsftpd配置文件,将几行注释内容取消:vim /etc/vsftpd/vsftpd.conf
(2)新建一个文件,将用户名添加到chroot_list文件,并重启vsftpd服务
[root@centos7liu]#cd /etc/vsftpd/ [root@centos7vsftpd]#echo liu > chroot_list [root@centos7vsftpd]#cat chroot_list liu [root@centos7vsftpd]# systemctl restart vsftpd
(3)在A主机登陆ftp服务,此时liu用户就不会被紧固,可以切换到任意目录下
禁锢或不禁锢特定的系统用户在家目录中,与上面设置功能相反,当chroot_local_user=NO启用黑名单
(1)在B主机服务端修改配置文件,vim /etc/vsftpd/vsftpd.conf 修改配置文件,不启用chroot_local_user=NO,此时开启黑名单,用户名在chroot_list文件内,就会被禁锢
systemctl restart vsftpd 重启服务
此时可以看到chroot_list文件中有liu用户
[root@centos7~]#cat /etc/vsftpd/chroot_list liu
(2)在A主机上登陆ftp服务,此时的liu用户登陆ftp服务时,liu用户被禁锢了
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(默认)可自动生成
示例:在/etc/vsftpd/vsftpd.conf配置文件最下面写入启动vsftpd日志一行,重启vsftpd服务即可
vim /etc/vsftpd/vsftpd.conf
查看日志文件内容部:
登录提示信息
ftpd_banner=“welcome to mage ftp server" banner_file=/etc/vsftpd/ftpbanner.txt 优先上面项生效
目录访问提示信息
dirmessage_enable=YES (默认) message_file=.message(默认) 信息存放在指定目录下.message
使用pam(Pluggable Authentication Modules)完成用户认证
pam_service_name=vsftpd pam配置文件:/etc/pam.d/vsftpd /etc/vsftpd/ftpusers 默认文件中用户拒绝登录
将pam模块中的sense改为alllow模式,只允许ftpusers文件中的用户名登陆ftp服务
是否启用控制用户登录的列表文件
userlist_enable=YES 默认有此设置 userlist_deny=YES(默认值) 黑名单,不提示口令,NO为白名单 userlist_file=/etc/vsftpd/users_list 此为默认值
在此清单里的用户名都不能登录ftp服务,如果删除了root用户就可以以root身份登陆ftp服务。
在配置文件中加入一个选项,不拒绝user_list文件中的用户登录,此时user_list文件中的用户就可以登录ftp服务
vim /etc/vsftpd/vsftpd.conf 修改配置文件并重启vsftpd服务:systemctl restart vsftpd
vsftpd服务指定用户身份运行,默认值,不修改
nopriv_user=nobody (默认值)
连接数限制
max_clients=0 最大并发连接数,0默认是无限制连接 max_per_ip=0 每个IP同时发起的最大连接数,0默认是无限制连接
示例:
vim /etc/vsftpd/vsftpd.conf,修改配置文件,设置为2,最大并发连接数是2。
此时查看B服务端主机已经有两个连接。
此时在A主机,客户端连接时,就会提示太多连接
max_per_ip=1,设置为1,每个IP同时发起的最大连接1次,保证每个IP地址用户的公平性
传输速率:字节/秒,生产中可以进行限速设置1024000=1M
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模式传输,会将源文件破坏掉,不建议使用 ascii_download_enable=YES
配置FTP服务以非独立服务方运行(适用于centos6)
vim /etc/vsftpd/vsftpd.conf/
listen=NO,默认为独立方式
vim /etc/xinetd.d/vsftpd service ftp { flags = REUSE socket_type = stream wait = no user = root server = /usr/sbin/vsftpd log_on_failure += USERID disable = no }
实现基于SSL的FTPS
查看是否支持SSL
ldd `which vsftpd` 查看到libssl.so
创建自签名证书,对账号进行加密
(1)切换到指定的目录下,并开始创建自签名证书
[root@centos7~]#cd /etc/vsftpd [root@centos7vsftpd]#ls ftpusers user_list vsftpd.conf vsftpd_conf_migrate.sh [root@centos7vsftpd]#mkdir ssl [root@centos7vsftpd]#cd /etc/pki/tls/certs [root@centos7certs]#ls ca-bundle.crt ca-bundle.trust.crt localhost.crt make-dummy-cert Makefile renew-dummy-cert [root@centos7certs]#make vsftpd.pem umask 77 ; \ PEM1=`/bin/mktemp /tmp/openssl.XXXXXX` ; \ PEM2=`/bin/mktemp /tmp/openssl.XXXXXX` ; \ /usr/bin/openssl req -utf8 -newkey rsa:2048 -keyout $PEM1 -nodes -x509 -days 365 -out $PEM2 ; \ cat $PEM1 > vsftpd.pem ; \ echo "" >> vsftpd.pem ; \ cat $PEM2 >> vsftpd.pem ; \ rm -f $PEM1 $PEM2 Generating a 2048 bit RSA private key ...+++ ..................................+++ writing new private key to '/tmp/openssl.wtgna6' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:CN State or Province Name (full name) []:beijing Locality Name (eg, city) [Default City]:beijing Organization Name (eg, company) [Default Company Ltd]:magedu Organizational Unit Name (eg, section) []:opt Common Name (eg, your name or your server's hostname) []:ftp.magedu.com Email Address []:
(2)将新生成的vsftpd.pem文件移动到新建的ssl目录下
[root@centos7certs]#mv vsftpd.pem /etc/vsftpd/ssl/
(3)修改vsftpd配置文件,在底部添加上相关配置信息,并重启vsftpd服务
[root@centos7certs]#vim /etc/vsftpd/vsftpd.conf ssl_enable=YES allow_anon_ssl=NO force_local_logins_ssl=YES force_local_data_ssl=YES rsa_cert_file=/etc/vsftpd/ssl/vsftpd.pem
(4)重启vsftpd服务
[root@centos7certs]#systemctl start vsftpd
(5)在FTP服务软件上配置信息并连接
对比加密与未加密时抓取的信息结果:
tcpdump -i ens33 -nn -X port 21 未加密前,此时可看到用户登录的账号和密码:liu和centos
加密后,再进行跟踪,此时就无法看到账号和密码信息
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
实现基于文件验证的vsftpd虚拟用户
(1)新建一个虚拟用户文件,转换为二进制文件,并修改文件权限
[root@centos7vsftpd]#vim vusers.txt user1 centos user2 magedu [root@centos7vsftpd]#db_load -T -t hash -f vusers.txt vusers.db 将文件格式改为二进制格式 [root@centos7vsftpd]#ls ftpusers ssl user_list vsftpd.conf vsftpd_conf_migrate.sh vusers.db vusers.txt [root@centos7vsftpd]#chmod 600 vuser* 修改两个文件的权限为600
(2)新建一个目录,指定一个虚拟用户访问固定的目录文件
[root@centos7vsftpd]#mkdir /data/ftproot 新建一个指定目录 [root@centos7vsftpd]#useradd -d /data/ftproot -s /sbin/nologin -r vuser 创建一个操作系统账号 [root@centos7vsftpd]#chown vuser.vuser /data/ftproot 修改目录权限 [root@centos7vsftpd]#cd /data/ftproot/ [root@centos7ftproot]#mkdir upload 在ftproot目录下新建一个目录,作为用户上传目录,需要加上写权限 [root@centos7ftproot]#setfacl -m u:vuser:rwx upload 此时就可以授予upload目录写权限,保证用户可以上传文件 [root@centos7ftproot]#mkdir download 新建一个下载目录,此时用户没有写权限,只能下载文件,而不能上传文件 [root@centos7pam.d]#chmod -w /data/ftproot 去掉根目录的写权限,否则用户无法登录
(3)修改pam模块配置信息,验证用户账号的合法性
[root@centos7pam.d]#cd /etc/pam.d [root@centos7pam.d]#vim vsftpd.db auth required pam_userdb.so db=/etc/vsftpd/vusers account required pam_userdb.so db=/etc/vsftpd/vusers
(4)指定好pam模块用户验证信息后,需要在vsftpd调用此pam模块
[root@centos7pam.d]#vim /etc/vsftpd/vsftpd.conf pam_service_name=vsftpd.db 虚拟用户存放在此文件中 guest_enable=YES guest_username=vuser 将虚拟用户映射为vuser [root@centos7pam.d]#systemctl restart vsftpd 重启服务
(5)验证虚拟用户登录结果,此时已经可以登录,可以看到:新建的虚拟用户user1和user2都映射的是同一个目录
此时普通用户的站号就无法登录ftp服务:
设置user1用户登录ftp上传权限
在vsftpd配置文件中修改配置文件,指定用户账号的不同配置文件
vim /etc/vsftpd/vsftpd.conf user_config_dir=/etc/vsftpd/vusers.d/ vusers.d存放用户的配置文件
对user1赋予一个写权限,此时user1用户就具有上传文件的权限
[root@centos7vsftpd]#mkdir vusers.d [root@centos7vusers.d]#cd /etc/vsftpd/vusers.d [root@centos7vusers.d]#vim user1 anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES [root@centos7vusers.d]#systemctl restart vsftpd
登陆ftp服务器,验证user1上传文件的结果,此时已经可以上传文件
在ftp服务器上查看此时上传的文件信息,是以虚拟用户上传的文件:
设置虚拟不同用户登录ftp后在不同的文件夹,并赋予user2虚拟用户写权限,可以上传文件
(1)在配置文件中修改user2的信息
[root@centos7vusers.d]#cd /etc/vsftpd/vusers.d [root@centos7vusers.d]#vim user2 local_root=/data/ftproot2 anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES
(2)新建一个/data/ftproot2目录,并在目录下创建一个文件,并重新启动ftp服务
[root@centos7vusers.d]#mkdir /data/ftproot2 新建一个根目录 [root@centos7vusers.d]#chmod -w /data/ftproot2 去掉根目录写权限 [root@centos7vusers.d]#cd /data/ftproot2 [root@centos7ftproot2]#ls root.txt [root@centos7ftproot2]#mkdir upload 在根目录下新建一个指定上传的目录 [root@centos7ftproot2]#setfacl -m u:vuser:rwx upload 赋予vuser读写执行权限 [root@centos7vusers.d]#touch /data/ftproot2/root.txt [root@centos7vusers.d]#systemctl restart vsftpd 重启服务
(3)验证此时的user2结果
实现基于MYSQL验证的vsftpd虚拟用户
环境准备:
A主机:192.168.34.100 (vsftpd服务)
B主机:192.168.34.101(mysql数据库)
C主机:192.168.34.102 (作为连接ftp服务机器)
在A主机源码编译pam_mysql,并修改相关配置文件
(1)在vsftpd服务端(A主机)安装所需要包和包组:
[root@centos7~]#yum install mariadb-server -y [root@centos7~]#systemctl start mariadb
(2)centos7需要下载pam_mysql模块,centos6不需要下载
下载官网:https://sourceforge.net/projects/pam-mysql/
将下载的文件传到linux系统中
rz 下载的pam模块传到linux系统中 [root@centos7~]#tar xvf pam_mysql-0.7RC1.tar.gz 解压当前下载的pam包
(3)切换到解压后的pam模块包,开始进行源码编译安装包组,安装依赖的包
[root@centos7pam_mysql-0.7RC1]#yum groupinstall "development tools" -y [root@centos7pam_mysql-0.7RC1]#yum -y install mariadb-devel pam-devel openssl-devel 安装与mariadb关联的包、pam关联包,以及要加密的包
(4)开始编译,关联pam,指定pam路径
[root@centos7pam_mysql-0.7RC1]#./configure --with-pam-mods-dir=/lib64/security --with-mysql=/usr --with-pam=/usr 后面两个with选项可以不加,默认
(5)安装包
[root@centos7pam_mysql-0.7RC1]#make && make install
在B主机数据库内新建数据库和表
在数据库中创建一个数据库和表
MariaDB [(none)]> create database vsftpd; 创建一个vsftpd数据库 Query OK, 1 row affected (0.00 sec) MariaDB [(none)]> use vsftpd; Database changed
创建user表 CREATE TABLE users ( id INT AUTO_INCREMENT NOT NULL PRIMARY KEY, name CHAR(50) BINARY NOT NULL, password CHAR(48) BINARY NOT NULL ); Query OK, 0 rows affected (0.01 sec)
(7)在新建的表中添加虚拟用户:ftp1和ftp2,并创建一个用户,指定vsftpd用户能连接此用户,访问users表
MariaDB [vsftpd]> insert users(name,password)values('ftp1',password('centos')),('ftp2',password('magedu')); password('cenots')将centos密码进行加密 MariaDB [vsftpd]> grant select on vsftpd.users to vsftpd@'192.168.34.101' identified by 'centos'; 创建一个用户vsftpd,且让其能访问users表内容
在A主机上修改pam模块信息,调用pam模块内容
(1)在主机A上修改pam模块配置文件
[root@centos7pam.d]#cd /etc/pam.d [root@centos7pam.d]#vim vsftpd.mysql auth required pam_mysql.so user=vsftpd passwd=centos host=192.168.34.101 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2 account required pam_mysql.so user=vsftpd passwd=centos host=192.168.34.101 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
含义:
•auth 表示认证 •account 验证账号密码正常使用 •required 表示认证要通过 •pam_mysql.so模块是默认的相对路径,是相对/lib64/security/路径而言,也可以写绝对路径;后面为给此模块传递的参数 •user=vsftpd为登录mysql的用户 •passwd=magedu 登录mysql的的密码 •host=mysqlserver mysql服务器的主机名或ip地址 •db=vsftpd 指定连接msyql的数据库名称 •table=users 指定连接数据库中的表名 •usercolumn=name 当做用户名的字段 •passwdcolumn=password 当做用户名字段的密码 •crypt=2 密码的加密方式为mysql password()函数加密
(2)新建一个vuser用户,并修改/data/ftproot目录的权限
[root@centos7vsftpd]#useradd -d /data/ftproot -s /sbin/nologin -r vuser 创建一个操作系统账号 [root@centos7vsftpd]#chown vuser.vuser /data/ftproot 修改目录权限
(3)修改配置文件,调用pam模块
vim /etc/vsftpd/vsftpd.conf pam_service_name=vsftpd.mysql 指定pam模块:vsftpd.mysql guest_enable=YES guest_username=vuser 映射vusers文件 user_config_dir=/etc/vsftpd/vusers.d/
(4)在指定的目录新建ftp1和ftp2虚拟用户写权限
[root@centos7vsftpd]#mkdir /etc/vsftpd/vusers.d 新建一个vusers.d目录 [root@centos7vsftpd]#cd /etc/vsftpd/vusers.d [root@centos7vusers.d]#vim ftp1 对ftp1授权写权限,可以上传文件到指定的目录下 anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES [root@centos7vusers.d]#systemctl restart vsftpd 重启vsftpd服务
(5)此时想将ftp2虚拟用户访问的文件存放在另一个目录下,可以进行如下操作,创建一个ftp2文件,并将ftp2指定到/data/ftproot2目录下
[root@centos7vusers.d]#cd /etc/vsftpd/vusers.d [root@centos7vusers.d]#vim ftp2 local_root=/data/ftproot2 anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES
(6)新建一个/data/ftproot2目录,并将vuser用户有读写执行权限
[root@centos7vusers.d]#mkdir /data/ftproot2 新建一个根目录 [root@centos7vusers.d]#chmod -w /data/ftproot2 去掉写权限,否则无法下载文件 [root@centos7vusers.d]#cd /data/ftproot2 [root@centos7ftproot2]#ls root.txt [root@centos7ftproot2]#mkdir upload 在根目录下新建一个指定上传的目录 [root@centos7ftproot2]#setfacl -m u:vuser:rwx upload 赋予vuser读写执行权限 [root@centos7vusers.d]#touch /data/ftproot2/root.txt [root@centos7vusers.d]#systemctl restart vsftpd 重启服务
最后在C主机登陆ftp服务进行验证ftp1登陆结果,连接A主机(vsftp服务)
如果想创建一个新的用户再进行访问ftp服务,直接在A主机数据库创建一个账号即可,创建一个ftp3虚拟用户
MariaDB [vsftpd]> insert users(name,password)values('ftp3',password('centos'));
此时在C主机上登陆ftp服务,就可以登录新建的ftp3虚拟用户
实现一个脚本:将本机的文件进行上传和下载到ftp服务器
在客户端创建一个脚本:
[root@centos777~]#vim ftp.sh cd /data/ 切换到客户端data目录下 ftp -n -i 192.168.34.100 << EOF 进行连接指定ftp服务端IP地址 user ftp2 magedu 使用ftp2用户进行登录 cd upload 切换到ftp服务器的upload目录下 mput *.log 将客户端的文件传到ftp服务器上 mget *.txt 将服务器上的文件下载到客户端上 bye 最后退出 EOF
验证结果:
客户端新建.log后缀的文件
[root@centos777data]#touch {a,b}.log [root@centos777data]#ls a.log b.log
在ftp服务端新建.txt后缀文件
[root@centos7upload]#cd /data/ftproot2/upload [root@centos7upload]#touch {f1,f2}.txt [root@centos7upload]#ls f1.txt f2.txt
在客户端执行脚本并查看客户端/data/目录下文件
[root@centos777~]#bash ftp.sh 执行脚本 [root@centos777~]#ls /data 此时data下下载了ftp服务器的文件 a.log b.log f1.txt f2.txt
在ftp服务器查看上传文件情况,此时客户端的.log文件已经上传的ftp服务器上
[root@centos7upload]#ls a.log b.log f1.txt f2.txt