Linux环境下安装配置vsftpd服务(三种认证模式)

    Linux环境下安装配置vsftpd服务(三种认证模式)

一、FTP简介

文件传输协议(英文:File Transfer Protocol,缩写:FTP)是用于在网络上进行文件传输的一套标准协议。它工作于网络传输协议的应用层,使用客户/服务器模式,主要是用来在服务器与客户端之间进行数据传输。FTP 其实是以 TCP 封包的模式进行服务器与客户端计算机之间的联机,当联机建立后,使用者可以在客户端端连上 FTP 服务器来进行文件的下载与上传,此外,也可以对 FTP 服务器上面的文档进行管理等。

FTP传输模式
文件传输协议(File Transfer Protocol,FTP),基于该协议FTP客户端与服务端可以实现共享文件、上传文件、下载文件。
FTP基于C/S模式,FTP客户端与服务器端有两种传输模式,分别是FTP主动模式、FTP被动模式(默认的工作模式)。主被动模式均是以FTP服务器端为参照。

FTP主动模式:客户端从一个任意的端口N(N>1024)连接到FTP服务器的port 21命令端口,客户端开始监听端口N+1,并发送FTP命令“port N+1”到FTP服务器,FTP服务器以数据端口(20)连接到客户端指定的数据端口(N+1)。

    Linux环境下安装配置vsftpd服务(三种认证模式)

FTP被动模式:客户端从一个任意的端口N(N>1024)连接到FTP服务器的port 21命令端口,客户端开始监听端口N+1,客户端提交 PASV命令,服务器会开启一个任意的端口(P >1024),并发送PORT P命令给客户端。客户端发起从本地端口N+1到服务器的端口P的连接用来传送数据。

    Linux环境下安装配置vsftpd服务(三种认证模式)

在企业实际环境中,如果FTP客户端与FTP服务端均开放防火墙,FTP需以主动模式工作,这样只需要在FTP服务器端防火墙规则中,开放20、21端口即可。

环境准备

属性 FTP服务端 FTP客户端
节点 wencheng-1 windows10
系统 CentOS Linux release 7.5.1804 (Minimal) windows10 企业版
内核 3.10.0-862.el7.x86_64 windows10 企业版2019 x64
IP地址 172.16.70.185 172.16.70.50
SELinux setenforce 0 | disabled  

FTP服务端操作步骤

  • 1.服务端安装vsftpd服务。
[root@wencheng-1 ~]# yum install -y vsftpd
[root@wencheng-1 ~]# rpm -qa | grep vsftpd
vsftpd-3.0.2-28.el7.x86_64 [root@wencheng-1 ~]# rpm -ql vsftpd 
/etc/pam.d/vsftpd    # vsftpd 使用PAM模块时的配置文件,主要做认证功能
/etc/vsftpd/ftpusers    # 用户登录黑名单,拒绝ftpusers列表内的用户登录vsftpd,一行一个账号
/etc/vsftpd/user_list    # 默认为用户登录黑名单,拒绝user_list列表内的用户登录vsftpd,一行一个账号,这个
配置是否能够生效与 vsftpd.conf 内的参数 userlist_enable, userlist_deny 有关
/etc/vsftpd/vsftpd.conf    # vsftpd 服务器的主配置文件,配置格式使用 [参数=设定值] 来设定,注意,等号两边不能有空白
/etc/vsftpd/vsftpd_conf_migrate.sh    # 迁移脚本
/usr/sbin/vsftpd    # vsftpd命令执行脚本文件
/var/ftp    # 匿名用户访问根目录 [root@wencheng-1 ~]# systemctl start vsftpd
[root@wencheng-1 ~]# ps -ef | grep vsftpd
root 10988 1 0 16:20 ? 00:00:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
root 10990 1583 0 16:21 pts/1 00:00:00 grep --color=auto vsftpd [root@wencheng-1 ~]# ps -ef | grep vsftpd
root 10988 1 0 16:20 ? 00:00:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
root 10992 1583 0 16:21 pts/1 00:00:00 grep --color=auto vsftpd [root@wencheng-1 ~]# systemctl enable vsftpd
Created symlink from /etc/systemd/system/multi-user.target.wants/vsftpd.service to /usr/lib/systemd/system/vsftpd.service.

注意:从现在开始,凡是涉及到服务的配置,就要考虑防火墙和SELinux的因素,很多教程和书籍上都是直接关闭防火墙和selinux,虽然这样在学习阶段可以避免干扰,但是这样非常不安全。另外凡是配置了服务,都要加入开机启动中,让其每次重启自动生效。

  • 2.服务端修改配置文件/etc/vsftpd/vsftpd.conf
[root@wencheng-1 ~]# mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf_bak
[root@wencheng-1 ~]# grep -Ev "^$|#" /etc/vsftpd/vsftpd.conf_bak > /etc/vsftpd/vsftpd.conf [root@wencheng-1 ~]# cat /etc/vsftpd/vsftpd.conf    # 默认配置文件详解
# 默认匿名用户配置
anonymous_enable=YES # 开启匿名用户访问; # 默认本地用户配置
local_enable=YES # 启用本地系统用户访问;
local_umask=022 # 本地用户创建文件及目录默认权限掩码; # 默认全局配置
write_enable=YES # 本地系统用户写入权限;
dirmessage_enable=YES # 打印目录显示信息,通常用于用户第一次访问目录时,信息提示;
xferlog_enable=YES # 启用上传/下载日志记录;
connect_from_port_20=YES # FTP使用20端口进行数据传输;
xferlog_std_format=YES # 日志文件将根据xferlog的标准格式写入;
listen=NO # Vsftpd不以独立的服务启动,通过Xinetd服务管理,建议改成YES;
listen_ipv6=YES # 启用IPV6监听;
pam_service_name=vsftpd # 登录FTP服务器,依据/etc/pam.d/vsftpd中内容进行认证;
userlist_enable=YES # Vsftpd.user_list和ftpusers配置文件里用户禁止访问FTP;
tcp_wrappers=YES # 设置vsftpd与tcp wrapper结合进行主机的访问控制,Vsftpd服务器检查/etc/hosts.allow 和/etc/hosts.deny中的设置,
                   来决定请求连接的主机,是否允许访问该FTP服务器。
  • 3.vsftpd三种认证模式

  vsftpd作为更加安全的文件传输的服务程序,允许用户以三种认证模式登录到FTP服务器上:匿名开放模式、本地用户模式、虚拟用户模式。实际生产环境中虚拟用户模式用的较多。

  首先要在防火墙添加ftp,20,21端口。

# firewalld 添加ftp,20,21端口
[root@wencheng-1 ~]# firewall-cmd --zone=public --add-service=ftp --permanent
success
[root@wencheng-1 ~]# firewall-cmd --zone=public --add-port=20/tcp --permanent
success
[root@wencheng-1 ~]# firewall-cmd --zone=public --add-port=21/tcp --permanent
success [root@wencheng-1 ~]# firewall-cmd --zone=public --list-ports    # 查看firewalld开放的端口
20/tcp 21/tcp
[root@wencheng-1 ~]# firewall-cmd --get-services | grep -o 'ftp'  # 查看firewalld开放的协议
ftp [root@wencheng-1 ~]# systemctl restart firewalld
  • 3.1 匿名开放模式:任何人都可以无需密码验证而直接登录到FTP服务器,是一种最不安全的认证模式。
[root@wencheng-1 ~]# vim /etc/vsftpd/vsftpd.conf
# 全局配置
write_enable=YES # 本地系统用户写入权限;
local_umask=022 # 本地用户创建文件及目录默认权限掩码;
dirmessage_enable=YES # 打印目录显示信息,通常用于用户第一次访问目录时,信息提示;
xferlog_enable=YES # 启用上传/下载日志记录;
connect_from_port_20=YES # FTP使用20端口进行数据传输;
xferlog_std_format=YES # 日志文件将根据xferlog的标准格式写入;
listen=NO # Vsftpd不以独立的服务启动,通过Xinetd服务管理,建议改成YES;
listen_ipv6=YES # 启用IPV6监听;
pam_service_name=vsftpd # 登录FTP服务器,依据/etc/pam.d/vsftpd中内容进行认证;
userlist_enable=YES # Vsftpd.user_list和ftpusers配置文件里用户禁止访问FTP;
tcp_wrappers=YES # 设置vsftpd与tcp wrapper结合进行主机的访问控制,Vsftpd服务器检查/etc/hosts.allow 和/etc/hosts.deny中的设置,
                   来决定请求连接的主机,是否允许访问该FTP服务器。 # 本地用户配置
local_enable=YES # 启用本地系统用户访问;
local_umask=022 # 本地用户创建文件及目录默认权限掩码;
local_root=/data/ftpdata    # 修改本地用户登录时访问的目录路径 # 匿名用户访问配置(最大权限)
anonymous_enable=YES # 开启匿名用户访问;
anon_umask=022          # 匿名用户上传文件的umask值
anon_upload_enable=YES      # 允许匿名用户上传文件
anon_mkdir_write_enable=YES   # 允许匿名用户创建目录
anon_other_write_enable=YES # 允许匿名用户修改目录名称或删除目录
anon_root=/data/ftpdata     # 修改匿名用户登录时访问的目录路径 注:工作中,匿名用户只是只读访问,写的权限也没有的。 [root@wencheng-1 ~]# ls -l /data/ftpdata
drwxr-xr-x. 2 root root 18 Mar 25 16:26 ftppub
[root@wencheng-1 ~]# ls -ld /data/ftpdata
drwxr-xr-x. 3 root root 17 Mar 25 14:53 /data/ftpdata # 修改目录权限
[root@wencheng-1 ~]# chmod o+w /data/ftpdata/ftppub
# 修改目录属主
[root@wencheng-1 ~]# chown ftp /data/ftpdata/ftppub/ -R
[root@wencheng-1 ~]# ls -ld /data/ftpdata/ftppub/
drwxr-xrwx. 2 ftp root 18 Mar 25 16:26 /data/ftpdata/ftppub [root@wencheng-1 ~]# systemctl restart vsftpd

3.1.1 匿名访问测试。

Win10测试访问ftp路径。

    Linux环境下安装配置vsftpd服务(三种认证模式)

并能执行上传/下载/删除操作。

    Linux环境下安装配置vsftpd服务(三种认证模式)

FTP服务端查看。

    Linux环境下安装配置vsftpd服务(三种认证模式)

  • 3.2 本地用户模式:是通过Linux系统本地的账户密码信息进行认证的模式。如果被黑客破解了账户信息,就可以畅通无阻地登录FTP服务器,从而完全控制整台服务器。

  a.将anonymous_enable=YES改为NO,即关闭了匿名模式,此时就不能在使用匿名模式登陆了。

   b.另外前面新加的与匿名配置参数可以保留,也可以直接删除,只要总开关anonymous_enable关闭了就禁用了匿名登录。

[root@wencheng-1 ~]# vim /etc/vsftpd/vsftpd.conf
# 全局配置
write_enable=YES
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES # 本地用户配置
local_enable=YES
local_umask=022
local_root=/data/ftpdata # 匿名用户设置
anonymous_enable=NO    # 仅修改此项为NO
anon_umask=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
anon_root=/data/ftpdata [root@wencheng-1 ~]# systemctl restart vsftpd

3.2.1 此时已需要账号密码登录。

    Linux环境下安装配置vsftpd服务(三种认证模式)

3.2.2 添加一个ftp用户并创建密码,用来登录ftp服务器。

[root@wencheng-1 ~]# useradd ftpuser -s /sbin/nologin
[root@wencheng-1 ~]# passwd ftpuser
Changing password for user ftpuser.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully. [root@wencheng-1 ~]# grep ftpuser /etc/passwd
ftpuser:x:1000:1000::/home/ftpuser:/sbin/nologin

3.2.3 再次尝试访问ftppub目录。

    Linux环境下安装配置vsftpd服务(三种认证模式)

    Linux环境下安装配置vsftpd服务(三种认证模式)

  • 3.3 虚拟用户模式:需要为FTP服务单独 建立用户数据库文件,虚拟出用来进行口令验证的账户信息,而这些账户信息在 服务器系统中实际上是不存在的,仅供 FTP 服务程序进行认证使用。这样,即使 黑客破解了账户信息也无法登录服务器,从而有效降低了破坏范围和影响。是三种模式中最安全的一种认证模式。

Vsftpd虚拟用户企业案例配置步骤如下:

a.安装Vsftpd虚拟用户需用到的软件及认证模块:

[root@wencheng-1 ~]# yum install pam* libdb-utils libdb* --skip-broken -y

b.创建包含用户信息的文件vuser.list(文件名字任意取),文件中奇数行表示账号名,偶数行表示密码。

[root@wencheng-1 ~]# vim /etc/vsftpd/vuser.list
vuser1
123456
vuser2
123456

c.生成Vsftpd虚拟用户数据库认证文件,设置权限700。

[root@wencheng-1 ~]# db_load -T -t hash -f /etc/vsftpd/vuser.list /etc/vsftpd/vsftpd_login.db
[root@wencheng-1 ~]# chmod 700 /etc/vsftpd/vsftpd_login.db

d.配置PAM认证文件,/etc/pam.d/vsftpd行首加入如下两行。

[root@wencheng-1 ~]# cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd_bak
[root@wencheng-1 ~]# vim /etc/pam.d/vsftpd
auth required pam_userdb.so db=/etc/vsftpd/vsftpd_login
account required pam_userdb.so db=/etc/vsftpd/vsftpd_login

e.所有Vsftpd虚拟用户需要映射到一个系统用户,该系统用户不需要密码,也不需要登录,主要用于虚拟用户映射使用。

[root@wencheng-1 ~]# useradd -d /data/ftpdir -s /sbin/nologin ftpvuser  # /data/ftpdir 为虚拟用户默认访问目录
[root@wencheng-1 ~]# chmod -Rf /data/ftpdir/
[root@wencheng-1 ~]# ls -ld /data/ftpdir/
drwxr-xr-x. 2 ftpvuser ftpvuser 76 Mar 29 23:51 /data/ftpdir/

f.创建虚拟用户各自的配置文件

假设我们要区别对待vuser1和vuser2,只允许vuser1查看文件,而允许vuser2上传、创建、修改、查看、删除文件。这种需求在企业真实环境中是常见的。

[root@wencheng-1 ~]# mkdir -p /etc/vsftpd/vsftpd_users_conf
[root@wencheng-1 ~]# cd /etc/vsftpd/vsftpd_users_conf
[root@wencheng-1 vsftpd_users_conf]# touch vuser1
[root@wencheng-1 vsftpd_users_conf]# vim vuser2
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

g.修改配置文件/etc/vsftpd/vsftpd.conf。

[root@wencheng-1 ~]# vim /etc/vsftpd/vsftpd.conf
# 全局配置
write_enable=YES
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES # 本地用户配置
local_enable=YES
local_umask=022
#local_root=/data/ftpdata # 虚拟用户设置
anonymous_enable=NO    # 禁止匿名开放模式
guest_enable=YES      # 开启虚拟用户模式
guest_username=ftpvuser  # 映射虚拟用户至系统用户ftpvuser
allow_writeable_chroot=YES  # 允许对禁锢的FTP根目录执行写入操作,而且不拒绝用户的登录请求
user_config_dir=/etc/vsftpd/vsftpd_users_conf   # 设置虚拟用户配置文件所在的目录 [root@wencheng-1 ~]# systemctl restart vsftpd

测试通过Windows10客户端资源管理器访问登录。

[root@wencheng-1 ~]# echo 11 > /data/ftpdir/Vfire1
[root@wencheng-1 ~]# echo 22 > /data/ftpdir/Vfire2
[root@wencheng-1 ~]# echo 33 > /data/ftpdir/Vfire3
[root@wencheng-1 ~]# ls /data/ftpdir/
Vfire1 Vfire2 Vfire3

客户端操作步骤

测试账号:vuser1;密码:123456  

   Linux环境下安装配置vsftpd服务(三种认证模式)

无法执行删除操作。

    Linux环境下安装配置vsftpd服务(三种认证模式)

测试账号:vuser2;密码:123456

    Linux环境下安装配置vsftpd服务(三种认证模式)

删除成功。

    Linux环境下安装配置vsftpd服务(三种认证模式)

至此,已实现vsftpd服务的三种认证模式。

上一篇:nginx 容器反向代理网址的设置


下一篇:Linux 系统安装下安装 mysql5.7(glibc版)