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

  

  

 

 

 

 

 

 

 

 

  

 

 

  

  

  

  

 

  

 

 

 

 

 

 

 

 

 

 

 

  

  

  

 

 

 

 

 

  

  

 

  

 

  

  

  

  

  

 

  

 

  

  

  

  

 

 

posted @ 2019-12-03 20:50  一叶知秋~~  阅读(1770)  评论(0编辑  收藏  举报