FTP简介
1.1 协议
文件传输协议(File Transfer Protocol),是一套用于在网络上进行文件传输的标准协议,该协议位于网络传输协议的应用层;
FTP 与 Telnet 类似,被设计用于在两台不同的主机之间进行通信;为了兼容不同的操作系统,Telnet 强制两端使用同样的标准,而 FTP 限定了支持的文件类型和文件结构;
1.2 文档
FTP协议的最新版公布于1985年,官方文档位于: RFC959;
RFC959 的中文翻译,计划在2016年6月完成,链接地址: FTP协议;
注意:中文书籍《TCP/IP详解 卷1》,FTP协议位于第27章。详细说明了FTP的工作原理.
原理
FTP为基于TCP/IP网络传输协议的文件传输应用层协议。 FTP协议在两台服务器中传输文件时,需要建立两个通道,分别为:命令传输通道和文件传输通道。 FTP传输文件过程中分为客户机和FTP服务器,在此过程中总是先建立起命令通道后,再建立文件传输通道。
在传输文件过程中,可以分为两种传输模式:主动模式,被动模式
主动模式
主动模式要求客户端和服务器端同时打开并且监听同一个端口以创建连接,如果此时客户端设置了防火墙就会产生一些问题,因此这种模式不常用,原理图如下:
客户端发起命令连接请求,服务器发起文件传输通道建立请求。 客户端端口:N,N 1 (N>1024随机端口) 服务器端端口:21,20
被动模式
被动模式只要求服务器端监听一个端口,客户端需要时连接即可,原理图如下:
客户端分别发起命令连接和文件传输通道建立请求。 客户端端口:N,N 1(N>1024随机端口) 服务器端端口:21,N(N>1024随机端口) 被动方式下,服务器端可以通过设置配置文件参数,达到控制N端口范围,如下:
工作原理
FTP工作时使用两个TCP连接来传输文件,一个控制连接,一个数据连接; 控制连接使用21端口; 数据连接端口一般为随机端口;
应用
服务端
- GUI应用
Bullet Proof FTP Server
CesarFTP
Cerberus FTP Server
Gene6 FTP Server
GuildFTPd
RaidenFTPD
Serv-U FTP Server
War FTP Daemon
FileZilla Server
....
- 命令行应用
AnomicFTPD
BSD ftpd
glFTPd
ProFTPd
Pure-FTPd
vsftpd
wu-ftpd
....
客户端
FileZilla、FireFTP、FlashFXP、等 ftp、lftp、gftp、wget、curl、等
常见FTP应用功能对比
FTP客户端比较 FTP服务端比较
vsftp的安装与使用
VSFTPD是“very secure FTP deamon”的缩写,安全性是它的一个最大的特点,vsftpd是一个UNIX类操作系统上运行的服务器的名称,它可以运行在Linux、BSD、Solaris、HP-UNIX等系统上面,是一个完全免费的、开放源码的ftp服务器软件,支持很多其他的FTP服务器所不支持的特征。
安装vsftp
代码语言:javascript复制#基于PAM实现用户认证
/etc/pam.d/*
/lib/security/*
/lib64/security/*
支持虚拟用户
#安装ftp与目录介绍
[root@master ~]# yum install vsftpd
[root@master ~]# rpm -ql vsftpd
/etc/logrotate.d/vsftpd <--滚动日志文件
/etc/pam.d/vsftpd <--用户登录认证配置文件
/etc/vsftpd <--vsftp配置文件目录
/etc/vsftpd/ftpusers
/etc/vsftpd/user_list
/etc/vsftpd/vsftpd.conf
/etc/vsftpd/vsftpd_conf_migrate.sh
/usr/lib/systemd/system-generators/vsftpd-generator <--服务脚本
/usr/lib/systemd/system/vsftpd.service
/usr/lib/systemd/system/vsftpd.target
/usr/lib/systemd/system/vsftpd@.service
/usr/sbin/vsftpd <--主程序
/var/ftp <--ftp服务的根目录
/var/ftp/pub
#ftp用户:
#匿名用户 --> 系统用户
#系统用户
#虚拟用户 --> 系统用户
#/var/ftp: ftp的家目录,匿名用户也是这个目录
#查看vsftp的家目录
[root@master ~]# yum install -y finger #安装finger 命令
[root@master ~]# finger ftp
Login: ftp Name: FTP User
Directory: /var/ftp Shell: /sbin/nologin #ftp的家目录
Never logged in.
No mail.
No Plan.
#启动ftp服务
[root@master ~]# systemctl start vsftpd.service
[root@master ~]# ss -lunt
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp LISTEN 0 32 [::]:21 [::]:*
#匿名登录测试
C:Usersxiaoqi>ftp 10.10.1.109
连接到 10.10.1.109。
220 (vsFTPd 3.0.2)
200 Always in UTF8 mode.
用户(10.10.1.109:(none)): <--匿名登录也应该要输入账号
331 Please specify the password.
密码:
503 Login with USER first.
登录失败。
C:Usersxiaoqi>ftp 10.10.1.109
连接到 10.10.1.109。
220 (vsFTPd 3.0.2)
200 Always in UTF8 mode.
用户(10.10.1.109:(none)): anonymous <--输入匿名账号后登录成功
331 Please specify the password.
密码:
230 Login successful.
vsftp配置文件
详细配置参数参考:https://www.jianshu.com/p/ea566208dca6 详细配置参数参考:https://os.51cto.com/art/201008/221842_all.htm
- 常用配置文件介绍
anonymous_enable=YES #是否允许匿名用户
local_enable=YES #是否开放系统用户,系统用户登录的话 家目录是用户的家目录也就是 /home/目录下的家目录
write_enable=YES #是否允许系统用户对FTP服务器文件具有写权限
#anon_upload_enable=YES #是否允许匿名用户上传文件,模式是拒绝的
#anon_mkdir_write_enable=YES #是否允许匿名用户创建目录,默认是拒绝的
#anon_other_write_enable=YES #是否允许匿名用户删除文件,默认是拒绝的
dirmessage_enable=YES #在用户目录下创建一个.message的隐藏文件,用户进入此目录是会自动显示该文件得内容
xferlog_enable=YES #是否让系统自动维护上传和下载的日志文件默认情况该日志文件为/var/log/vsftpd.log,
#也可以通过下面的xferlog_file选项对其进行设定默认值为NO
xferlog_std_format=YES #是否以标准xferlog的格式书写传输日志文件
#chown_uploads=YES #设定是否允许改变上传文件的属主,与下面一个设定项配合使用,默认是禁止的,不推荐吧文件给为root权限
#chown_username=whoever #设置想要改变的上传文件的属主,如果需要,则输入一个系统用户名,默认禁止该选项.默认的宿主为:whoever 任何人
#idle_session_timeout=600 #设置数据传输中断间隔时间,此语句表示空闲的用户会话中断时间为600秒
#data_connection_timeout=120 #设置数据连接超时时间,该语句表示数据连接超时时间为120秒,可根据实际情况对其个修改
#ascii_upload_enable=YES #是否以ASCII方式上传数据。默认情况下,服务器会忽略ASCII方式的请求。
#ascii_download_enable=YES #启用此选项将允许服务器以ASCII方式下载数据
pam_service_name=vsftpd ##PAM认证
#chroot_local_user=YES #是否锁定本地用户为用户家目录,置为YES时,用户被锁定在自己的home目录中
#allow_writeable_chroot=YES #是否接受用户家目录有可写权限,如果上面的选项开启那么这个选项也要开启,否则报错:500
#chroot_list_enable=YES #用户登录FTP服务器后是否具有访问自己目录以外的其他文件的权限
#设置为YES时,用户被锁定在自己的home目录中,vsftpd将在下面chroot_list_file选项值的位置寻找chroot_list文件
#chroot_list_file=/etc/vsftpd/chroot_list #被列入此文件的用户,在登录后将不能切换到自己目录以外的其他目录,紧固到用户家目录
#local_root=/var/ftp/ #定义ftp的路径,默认不启用.
#listen_port=21 #定义ftp的端口号,不启用默认21端口
listen=NO #是否允许监听,如果设置为YES,则vsftpd将以独立模式运行,由vsftpd自己监听和处理IPv4端口的连接请求
listen_ipv6=YES #设定是否支持IPV6。如要同时监听IPv4和IPv6端口,
pam_service_name=vsftpd #设置PAM外挂模块提供的认证服务所使用的配置文件名,即/etc/pam.d/vsftpd文件
userlist_enable=YES #是否允许ftpusers文件中的用户登录FTP服务器,默认为NO,若此项设为YES,则user_list文件中的用户允许登录FTP服务器
userlist_dney=YES #是否拒绝uerlist文件的用户登录,YES表示拒绝这个文件里的用户登录
tcp_wrappers=YES #是否使用tcp_wrappers作为主机访问控制方式。
#设置用户的资源访问限制
max_client=0 #设置项用于设置FTP服务器所允许的最大客户端连接数,值为0时表示不限制。
max_per_ip=0 #设置项用于设置对于同一IP地址允许的最大客户端连接数,值为0时表示不限制。
local_max_rate=0 #设置项用于设置本地用户的最大传输速率,单位为B/s,值为0时表示不限制。
anon_max_rate=0 #设置项用于设置匿名用户的最大传输速率,单位为B/s,值为0表示不限制。
#安全通信方式
# ftps: ftp ssl/tls
# sftp: OpenSSH,SubSystem, sftp(SSH)
#配置方式:使用私有CA给FTP签发证书,然后配置vsfp支持ssl传输
ssl_enable=YES
ssl_tlsv1=YES
ssl_sslv2=YES
ssl_sslv3=YES
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_login_ssl=YES
rsa_cert_file=/etc/vsftpd/ssl/vsftpd_cert.pem
rsa_private_key_file=/etc/vsftpd/ssl/vsftpd_key.pem
vsftp虚拟用户
使用文件来储存虚拟账户
代码语言:javascript复制#奇数行为账号,偶数行为上面一个账号的密码
#虚拟用户:
# Mysql: VSFTPD, users: Name,Password
# /etc/vsftpd/vusers: --> db_load
# USERNAME
# PASSWORD
[root@master ~]# yum -y install libdb-utils
[root@master ~]# vim /etc/vsftpd/virtual_user
tom
12345
jerry
67890
[root@master ~]# db_load -T -t hash -f /etc/vsftpd/virtual_user /etc/vsftpd/virtual_user.db
#创建pam文件.设置基于虚拟用户验证
[root@master ~]# vim /etc/pam.d/vsftpd.pam
auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/virtual_user
account required /lib64/security/pam_userdb.so db=/etc/vsftpd/virtual_user
#设置虚拟账户及共享目录
[root@master ~]# useradd -s /sbin/nologin -d /home/ftp virtual
#修改用户主配置文件
[root@master ~]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
pam_service_name=vsftpd.pam
userlist_enable=YES
tcp_wrappers=YES
guest_enable=YES
guest_username=virtual
allow_writeable_chroot=YES
ser_config_dir=/etc/vsftpd/virtual_user_conf
#user_sub_token=$USER
#为每个用户设置单独的路径和权限
[root@master ~]# mkdir /etc/vsftpd/virtual_user_conf
[root@master ~]# touch /etc/vsftpd/virtual_user_conf/{tom,jerry}
#设置tom只能上传文档
[root@master ~]# vim /etc/vsftpd/virtual_user_conf/tom
#local_root=/home/ftp/$USER
anon_mkdir_write_enable=NO
anon_other_write_enable=NO
anon_upload_enable=YES
#设置Jerry可以上传,下载和删除文件
[root@master ~]# vim /etc/vsftpd/virtual_user_conf/jerry
#local_root=/home/ftp/$USER
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
anon_upload_enable=YES
#修改权限
[root@master ~]# mkdir /home/ftp/{tom,jerry}
[root@master ftp]# chown virtual:virtual tom/
[root@master ftp]# chown virtual:virtual jerry/
#重启服务
[root@master ~]# systemctl restart vsftpd.service
使用mysql储存用户账号和密码
代码语言:javascript复制#安装mariadb和mariadb-devel,当然是用mysql也是可以的
[root@master vsftpd]# yum install -y mariadb-server mariadb-devel
#创建数据库
MariaDB [(none)]> create database vsftpd;
MariaDB [(none)]> use vsftpd;
MariaDB [vsftpd]> CREATE TABLE users (id INT AUTO_INCREMENT NOT NULL, name CHAR(30) BINARY NOT NULL, password CHAR(48) BINARY NOT NULL, PRIMARY KEY(id));
MariaDB [vsftpd]> INSERT INTO users(name,password) values ('xiaoqi',PASSWORD('123456'));
MariaDB [vsftpd]> INSERT INTO users(name,password) values ('tom',PASSWORD('123456'));
MariaDB [vsftpd]> grant select on vsftpd.* to vsftpd@'%' identified by '123456'; #添加mysql登录账号
MariaDB [vsftpd]> show grants for 'vsftpd';
-------------------------------------------------------------------------------------------------------
| Grants for vsftpd@% |
-------------------------------------------------------------------------------------------------------
| GRANT USAGE ON *.* TO 'vsftpd'@'%' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' |
| GRANT SELECT ON `vsftpd`.* TO 'vsftpd'@'%' |
-------------------------------------------------------------------------------------------------------
MariaDB [(none)]> FLUSH PRIVILEGES;
#编译pam_mysql模块
[root@server-node3 ~]# yum groupinstall 'Development Tools'
[root@server-node3 ~]# yum install gcc gcc-c pam-devel
[root@server-node3 ~]# wget http://prdownloads.sourceforge.net/pam-mysql/pam_mysql-0.7RC1.tar.gz
[root@server-node3 pam_mysql-0.7RC1]# tar xvf pam_mysql-0.7RC1.tar.gz && cd pam*
[root@server-node3 pam_mysql-0.7RC1]# ./configure --with-pam-mods-dir=/lib64/security
[root@server-node3 pam_mysql-0.7RC1]# make -j8 && make install
[root@server-node3 pam_mysql-0.7RC1]# ll /lib64/security/pam_mysql.*
-rwxr-xr-x. 1 root root 882 Jan 12 21:39 /lib64/security/pam_mysql.la
-rwxr-xr-x. 1 root root 141689 Jan 12 21:39 /lib64/security/pam_mysql.so
#添加pam配置文件进行认证
[root@server-node3 ~]# vim /etc/pam.d/vsftpd.mysql
auth required pam_mysql.so user=vsftpd passwd=123456 host=127.0.0.1 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
account required pam_mysql.so user=vsftpd passwd=123456 host=127.0.0.1 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
#crypt加密方式说明
0 (or "plain") 表示不加密
1 (or "Y") 表示使用crypt(3)函数加密
2 (or "mysql") 表示使用mysql password()函数加密
3 (or "md5") 表示使用md5加密
4 (or "sha1") 表示使用sha1加密
#--字段说明--
auth 表示认证
account 验证账号密码正常使用
required 表示认证要通过
pam_mysql.so 该模块是默认的相对路径,是相对/lib64/security/路径而言,也可以写绝对路径;后面为给此模块传递的参数
user=vsftpd 登录mysql的用户
passwd=123.com 登录mysql的密码
host=192.168.7.72 mysql服务器的ip地址
db=vsftpd 指定连接mysql的数据库名称
table=users 指定连接数据库中的表名
usercolumn=name 当做用户名的字段
passwdcolumn=password 当做用户名字段的密码
crypt=2 密码的加密方式为mysql password()函数加密
#建立虚拟映射用户和修改vsftpd配置文件
[root@server-node3 ~]# mkdir -pv /data/ftproot
[root@server-node3 ~]# mkdir /data/ftproot2
[root@server-node3 ~]# mkdir /data/ftproot/{pub,upload}
[root@server-node3 ~]# useradd -d /data/ftproot -r virtual
[root@server-node3 ~]# chown -R virtual:virtual /data
#修改vsftpd配置文件
[root@server-node3 ~]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
allow_writeable_chroot=YES
guest_enable=YES
guest_username=virtual
userlist_enable=YES
pam_service_name=vsftpd.mysql
user_config_dir=/etc/vsftpd/vuser.d
#添加虚拟用的权限配置文件
[root@server-node3 ~]# mkdir /etc/vsftpd/vuser.d
[root@server-node3 ~]# vim /etc/vsftpd/vuser.d/xiaoqi
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
[root@server-node3 ~]# cat /etc/vsftpd/vuser.d/tom
local_root=/data/ftproot2
#重启服务
[root@server-node3 ~]# systemctl restart vsftpd.service
总结
代码语言:javascript复制基于文件和MySQL验证的vsftpd虚拟用户的区别:
# a.基于文件验证的vsftpd虚拟用户需要手工创建存放用户名和密码的文本文件,不方便管理,并且该文件被编码为hash格式之后还能看到相关的信息
[root@CentOS7-01 ~]#cat /etc/vsftpd/vusers.db
[root@master ~]# cat /etc/vsftpd/vusers.db
YSAgICAgIH4nIAryq6K JzkweGlhb21pbmdeIAogIPKOi4LRjWheMTIzNDU2eGlhb3FpMTIzNGFiY3ZpcmZ0cA== #base64解码,直接插入会截断不能存数据库
# b.基于MySQL验证的vsftpd虚拟用户不用事先创建相关的文本文件,直接在相关的用户表使用SQL语句创建即可,维护起来更加方便,并且密码是使用mysql password()函数加密过的,更加安全。推荐使用方式
vsftp使用示例
代码语言:javascript复制#建立本地用户
[root@master CA]# useradd test
[root@master CA]# passwd test
#本地用户登录
[root@develop-vscode ~]# ftp 10.10.1.109
Connected to 10.10.1.109 (10.10.1.109).
220 (vsFTPd 3.0.2)
Name (10.10.1.109:root): test
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/home/test"
ftp>
#本地用户上传文件
[root@develop-vscode ~]# ftp 10.10.1.109
Connected to 10.10.1.109 (10.10.1.109).
220 (vsFTPd 3.0.2)
Name (10.10.1.109:root): test #输入账号
331 Please specify the password.
Password: #输入密码
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> put tsetup.1.8.15.exe #上传文件
local: tsetup.1.8.15.exe remote: tsetup.1.8.15.exe
227 Entering Passive Mode (10,10,1,109,135,215).
150 Ok to send data.
226 Transfer complete.
20466264 bytes sent in 0.282 secs (72516.00 Kbytes/sec)
ftp> ls #查看上传的文件
227 Entering Passive Mode (10,10,1,109,117,190).
150 Here comes the directory listing.
-rw-r--r-- 1 1002 1005 20466264 Jan 11 12:25 tsetup.1.8.15.exe #上传的文件
226 Directory send OK.
#紧固用户,如果是紧固本地的所有用用可以使用chroot_local_user
#但是需要注意的是:紧固用户需要使用allow_writeable_chroot=YES选项否则会出现500 OOPS: vsftpd: refusing to run with writable root inside chroot()
#另一个方法就是修改用户家目录的读写权限:chmod a-w /home/USER(修改后会带来相关的权限限制)
[root@master ~]# vim /etc/vsftpd/vsftpd.conf
chroot_local_user=YES #禁锢本地用户
allow_writeable_chroot=YES #接受禁锢用户对家目录读写权限
[root@master ~]# systemctl restart vsftpd.service
[root@develop-vscode ~]# ftp 10.10.1.109
Connected to 10.10.1.109 (10.10.1.109).
220 (vsFTPd 3.0.2)
Name (10.10.1.109:root): test
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd #此时本地用户登录ftp,目录被禁锢在用户的家目录 不能随意的游荡
257 "/" <--显示用户的家目录为根路径
#相反如果不想限制某些本地用户可以使用一下这些设置
#方式一:
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
#该方式表明/etc/vsftpd/chroot_list列表里的所有账号都被不会被限制在其家目录里面。列表以外的用户都被限制。
#方式二:
chroot_local_user=NO
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
#该方式表明/etc/vsftpd/chroot_list列表里的所有用户都被限制在其家目录里面,但是该列表以外的用户都不被限制在它们的家目录里面。详细理解自己试验。
##SFTP的配置方式
#1.签发本地CA证书
[root@master ~]# cd /etc/pki/CA/
[root@master CA]# mkdir certs newcerts crl
[root@master CA]# touch index.txt
[root@master CA]# echo 01 >serial
[root@master CA]# (umask 077;openssl genrsa -out private/cakey.pem 4096)
Generating RSA private key, 4096 bit long modulus
................................................................................
..............
e is 65537 (0x10001)
[root@master CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650
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) []:GZ
Locality Name (eg, city) [Default City]:GZ
Organization Name (eg, company) [Default Company Ltd]:STD
Organizational Unit Name (eg, section) []:Std
Common Name (eg, your name or your servers hostname) []:ca.itab.com
Email Address []:
#2.签发vsftpd使用的证书
[root@master CA]# mkdir /etc/vsftpd/ssl
[root@master CA]# cd /etc/vsftpd/ssl/
[root@master ssl]# (umask 077;openssl genrsa -out vsftpd.key 4096;)
Generating RSA private key, 4096 bit long modulus
.......................................................
........................
e is 65537 (0x10001)
#3.生成证书
[root@master ssl]# openssl req -new -key vsftpd.key -out vsftpd.csr
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) []:GZ
Locality Name (eg, city) [Default City]:GZ
Organization Name (eg, company) [Default Company Ltd]:STD
Organizational Unit Name (eg, section) []:Std
Common Name (eg, your name or your server s hostname) []:ftp.itab.com
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
#4.签发证书
[root@master ssl]# openssl ca -in vsftpd.csr -out vsftpd.crt
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 1 (0x1)
Validity
Not Before: Jan 12 06:30:46 2020 GMT
Not After : Jan 11 06:30:46 2021 GMT
Subject:
countryName = CN
stateOrProvinceName = GZ
organizationName = STD
organizationalUnitName = Std
commonName = ftp.itab.com
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
27:9B:59:B9:51:C9:87:2B:0E:B9:99:D6:76:96:34:B8:0D:FF:BC:38
X509v3 Authority Key Identifier:
keyid:64:EF:51:C8:C9:CF:1C:40:56:DF:58:8B:31:32:B5:BD:96:BF:34:99
Certificate is to be certified until Jan 11 06:30:46 2021 GMT (365 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
#编辑vsftp使用ssl证书
[root@master ssl]# vim /etc/vsftpd/vsftpd.conf
ssl_enable=YES
ssl_tlsv1=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
[root@master ssl]# systemctl restart vsftpd
#非匿名用户登录sftp
[root@develop-vscode ~]# ftp 10.10.1.109
Connected to 10.10.1.109 (10.10.1.109).
220 (vsFTPd 3.0.2)
Name (10.10.1.109:root): test
530 Non-anonymous sessions must use encryption. <--提示非匿名用户必须使用加密回话
Login failed.
421 Service not available, remote server has closed connection
ftp>
#sftp登录使用FileZilla可以正常登录.
- 基于文件方式的虚拟用户测试
#创建虚拟用户的文件
[root@master vsftpd]# vim vusers.txt
xiaoqi
123456
xiaoming
7890
virftp
1234abc
[root@master vsftpd]# db_load -T -t hash -f vusers.txt vusers.db
[root@master vsftpd]# chmod 600 vusers.db
[root@master vsftpd]# ll vu*
-rw------- 1 root root 12288 1月 12 17:42 vusers.db
-rw-r--r-- 1 root root 43 1月 12 17:40 vusers.txt
#创建用户和虚拟用户访问目录
[root@master vsftpd]# mkdir -pv /data/ftproot/upload
[root@master vsftpd]# useradd -d /data/ftproot/ virtual
#创建pam配置文件
[root@master vsftpd]# vim /etc/pam.d/vsftpd.pam
auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/vusers
account required /lib64/security/pam_userdb.so db=/etc/vsftpd/vusers
#修改主配置文件
[root@master vsftpd]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
pam_service_name=vsftpd.pam
userlist_enable=YES
tcp_wrappers=YES
guest_enable=YES
guest_username=virtual
allow_writeable_chroot=YES
user_config_dir=/etc/vsftpd/vusers.d
#为虚拟用户建立独立的配置文件
#1.指定各个用户的配置文件存放路径
[root@master vsftpd]# mkdir vusers.d
#2. 创建用户的配置文件,允许可读可写,其他用户只读
[root@master vusers.d]# vim /etc/vsftpd/vusers.d/xiaoqi
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
#3. 创建用户xiaoming的配置文件,将其登录目录改为/data/ftproot2
[root@master vusers.d]# mkdir /data/ftproot2
[root@master vusers.d]# vim /etc/vsftpd/vusers.d/xiaoming
local_root=/data/ftproot2
#4. 修改/data的用户与用户属组
[root@master vsftpd]# chown virtual:virtual -R /data/
#xiaoqi用户测试
[root@develop-vscode ~]# ftp 10.10.1.109
Connected to 10.10.1.109 (10.10.1.109).
220 (vsFTPd 3.0.2)
Name (10.10.1.109:root): xiaoqi
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/"
ftp> ls
227 Entering Passive Mode (10,10,1,109,144,56).
150 Here comes the directory listing.
drwxr-xr-x 2 1003 1006 6 Jan 12 11:45 upload
226 Directory send OK.
ftp> mkdir test
257 "/test" created
ftp> ls
227 Entering Passive Mode (10,10,1,109,20,17).
150 Here comes the directory listing.
drwx------ 2 1003 1006 6 Jan 12 11:47 test
drwxr-xr-x 2 1003 1006 6 Jan 12 11:45 upload
226 Directory send OK.
ftp> lcd /root/
Local directory now /root
ftp> put test.txt
local: test.txt remote: test.txt
227 Entering Passive Mode (10,10,1,109,208,80).
150 Ok to send data.
226 Transfer complete.
4 bytes sent in 3.2e-05 secs (125.00 Kbytes/sec)
ftp> cd upload
250 Directory successfully changed.
ftp> put test.txt
local: test.txt remote: test.txt
227 Entering Passive Mode (10,10,1,109,30,192).
150 Ok to send data.
226 Transfer complete.
4 bytes sent in 2.1e-05 secs (190.48 Kbytes/sec)
ftp> ls
227 Entering Passive Mode (10,10,1,109,87,211).
150 Here comes the directory listing.
-rw------- 1 1003 1006 4 Jan 12 11:47 test.txt
226 Directory send OK.
ftp> pwd
257 "/upload"
#xiaoming用户测试
[root@develop-vscode ~]# ftp 10.10.1.109
Connected to 10.10.1.109 (10.10.1.109).
220 (vsFTPd 3.0.2)
Name (10.10.1.109:root): xiaoming
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (10,10,1,109,219,227).
150 Here comes the directory listing.
226 Directory send OK.
ftp> pwd
257 "/"
ftp> mkdir test
550 Permission denied. #用户限定只能读,所以无法创建文件
ftp> ls
227 Entering Passive Mode (10,10,1,109,99,232).
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 0 Jan 12 11:49 test.txt
226 Directory send OK.
- 基于mysql的虚拟用户测试
#安装mariadb和mariadb-devel,当然是用mysql也是可以的
[root@master vsftpd]# yum install -y mariadb-server mariadb-devel
#创建数据库
MariaDB [(none)]> create database vsftpd;
MariaDB [(none)]> use vsftpd;
MariaDB [vsftpd]> CREATE TABLE users (id INT AUTO_INCREMENT NOT NULL, name CHAR(30) BINARY NOT NULL, password CHAR(48) BINARY NOT NULL, PRIMARY KEY(id));
MariaDB [vsftpd]> INSERT INTO users(name,password) values ('xiaoqi',PASSWORD('123456'));
MariaDB [vsftpd]> INSERT INTO users(name,password) values ('tom',PASSWORD('123456'));
MariaDB [vsftpd]> grant select on vsftpd.* to vsftpd@'%' identified by '123456'; #添加mysql登录账号
MariaDB [vsftpd]> show grants for 'vsftpd';
-------------------------------------------------------------------------------------------------------
| Grants for vsftpd@% |
-------------------------------------------------------------------------------------------------------
| GRANT USAGE ON *.* TO 'vsftpd'@'%' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' |
| GRANT SELECT ON `vsftpd`.* TO 'vsftpd'@'%' |
-------------------------------------------------------------------------------------------------------
MariaDB [(none)]> FLUSH PRIVILEGES;
#编译pam_mysql模块
[root@server-node3 ~]# yum groupinstall 'Development Tools'
[root@server-node3 ~]# yum install gcc gcc-c pam-devel
[root@server-node3 ~]# wget http://prdownloads.sourceforge.net/pam-mysql/pam_mysql-0.7RC1.tar.gz
[root@server-node3 pam_mysql-0.7RC1]# tar xvf pam_mysql-0.7RC1.tar.gz && cd pam*
[root@server-node3 pam_mysql-0.7RC1]# ./configure --with-pam-mods-dir=/lib64/security
[root@server-node3 pam_mysql-0.7RC1]# make -j8 && make install
[root@server-node3 pam_mysql-0.7RC1]# ll /lib64/security/pam_mysql.*
-rwxr-xr-x. 1 root root 882 Jan 12 21:39 /lib64/security/pam_mysql.la
-rwxr-xr-x. 1 root root 141689 Jan 12 21:39 /lib64/security/pam_mysql.so
#添加pam配置文件进行认证
[root@server-node3 ~]# vim /etc/pam.d/vsftpd.mysql
auth required pam_mysql.so user=vsftpd passwd=123456 host=127.0.0.1 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
account required pam_mysql.so user=vsftpd passwd=123456 host=127.0.0.1 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
#建立虚拟映射用户和修改vsftpd配置文件
[root@server-node3 ~]# mkdir -pv /data/ftproot
[root@server-node3 ~]# mkdir /data/ftproot2
[root@server-node3 ~]# mkdir /data/ftproot/{pub,upload}
[root@server-node3 ~]# useradd -d /data/ftproot -r virtual
[root@server-node3 ~]# chown -R virtual:virtual /data
#修改vsftpd配置文件
[root@server-node3 ~]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
allow_writeable_chroot=YES
guest_enable=YES
guest_username=virtual
userlist_enable=YES
pam_service_name=vsftpd.mysql
user_config_dir=/etc/vsftpd/vuser.d
#添加虚拟用的权限配置文件
[root@server-node3 ~]# mkdir /etc/vsftpd/vuser.d
[root@server-node3 ~]# vim /etc/vsftpd/vuser.d/xiaoqi
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
[root@server-node3 ~]# cat /etc/vsftpd/vuser.d/tom
local_root=/data/ftproot2
#重启服务
[root@server-node3 ~]# systemctl restart vsftpd.service
#测试xiaoqi虚拟账号
[root@develop-vscode ~]# ftp 10.10.1.147
Connected to 10.10.1.147 (10.10.1.147).
220 (vsFTPd 3.0.2)
Name (10.10.1.147:root): xiaoqi
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (10,10,1,147,77,107).
150 Here comes the directory listing.
drwxr-xr-x 2 996 994 6 Jan 12 13:57 pub
drwxr-xr-x 2 996 994 6 Jan 12 13:57 upload
226 Directory send OK.
ftp> mkdir test
257 "/test" created
ftp> ls
227 Entering Passive Mode (10,10,1,147,234,141).
150 Here comes the directory listing.
drwxr-xr-x 2 996 994 6 Jan 12 13:57 pub
drwx------ 2 996 994 6 Jan 12 14:34 test
drwxr-xr-x 2 996 994 6 Jan 12 13:57 upload
226 Directory send OK.
ftp> lcd /etc/
Local directory now /etc
ftp> put fstab
local: fstab remote: fstab
227 Entering Passive Mode (10,10,1,147,144,52).
150 Ok to send data.
226 Transfer complete.
465 bytes sent in 3.3e-05 secs (14090.91 Kbytes/sec)
ftp> ls
227 Entering Passive Mode (10,10,1,147,172,3).
150 Here comes the directory listing.
-rw------- 1 996 994 465 Jan 12 14:34 fstab
drwxr-xr-x 2 996 994 6 Jan 12 13:57 pub
drwx------ 2 996 994 6 Jan 12 14:34 test
drwxr-xr-x 2 996 994 6 Jan 12 13:57 upload
226 Directory send OK.
ftp> delete fstab
250 Delete operation successful.
ftp> ls
227 Entering Passive Mode (10,10,1,147,221,3).
150 Here comes the directory listing.
drwxr-xr-x 2 996 994 6 Jan 12 13:57 pub
drwx------ 2 996 994 6 Jan 12 14:34 test
drwxr-xr-x 2 996 994 6 Jan 12 13:57 upload
226 Directory send OK.
#测试tom虚拟账号
[root@develop-vscode ~]# ftp 10.10.1.147
Connected to 10.10.1.147 (10.10.1.147).
220 (vsFTPd 3.0.2)
Name (10.10.1.147:root): tom
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (10,10,1,147,228,51).
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 9 Jan 12 14:36 ftproot2
drwxr-xr-x 2 0 0 6 Jan 12 14:35 pub
226 Directory send OK.
ftp> mkdir test
550 Permission denied. #权限受限,不能创建文件
ftp> lcd /etc/
Local directory now /etc
ftp> put fstab
local: fstab remote: fstab
227 Entering Passive Mode (10,10,1,147,130,249).
550 Permission denied. #权限受限不能上传文件
ftp>